首页 > 编程知识 正文

用外部中断对脉冲计数,stm32f103rtc应用

时间:2023-05-05 16:42:41 阅读:12744 作者:3447

实时时钟(RTC )在实时时钟的意义上与实际上正在努力的组有点相似。 此外,利用计数原理,选择RTC时钟源,进行分频达到计数的目的。

RTC的秒中断功能类似于SysTick系统的滴答功能。 RTC秒中断功能实际上是每计数一次就中断一次。 请注意,秒中断必须是由RTC时钟源和分频值决定的“秒”时间,而不是1秒的时间。 当然,也可以每秒中断一次。

示例:

LED在主函数间隔0.5秒内变化1次

每秒打印数据' RTC Sec . ';

也就是说,LED变化1次,串行端口打印1次数据' RTC Sec . '

扩展部分的功能RTC计数:可以实现RTC闹钟

原理描述

通过框图可以看出该模块具有什么功能及其工作原理。

RTC框图:

从以上系统框图分析“RTC秒中断”的原理:

1、RTC时钟源,共有三种。 可以任意选择,以任意秒数为周期进行配置

RCC_RTCCLKSource_LSE

RCC_RTCCLKSource_LSI

RCC_RTCCLKSource_HSE_Div128

本文的实例代码是RCC _ rtcclkconfig (RCC _ rtcclksource _ HSE _ div 128 );

将“RCC_RTCCLKSource_HSE_Div128”用作时钟源(高速时钟源),即外部高速时钟的128分频,即每秒8m/128 ) 62500 )脉冲;

当然,也可以选择另外两个时钟源。 也就是说,使用低速时钟源。 使用通常用于RTC闹钟的RTC日历等的低速时钟源。

2、RTC分频:

本文的实例代码是RTC_setPrescaler(62500;

该值与上述对应。 因为我们实现了真正的每秒一次中断。

3、RTC中断:

RTC中断有三种。

RTC_IT_SEC秒中断(每周期中断一次,自己设定) ) ) ) )。

RTC_IT_ALR闹钟没电了

RTC_IT_OW (计数)溢出中断

本文的示例包括RTC_itconfig(RTC_it_sec,ENABLE );

允许在RTC_IT_SEC秒内中断。

再次强调:

这里的“秒中断”是概念上的秒中断,其中断间隔时间由您选择的时钟源和分频值决定,而不是真正的每秒中断一次。

请尝试将源代码的分频值设置为62500的一半31250。 可见,秒中断的间隔为0.5秒。 请自己修改实验测试。

以下是关于“RTC秒中断”的重要且容易出错的点。

1.RCC时钟源

此函数位于bsp.c文件下。

RCC是很多初学者,甚至在已经工作的朋友容易忽略的地方,有很多朋友觉得它使用的外围设备很奇怪。 其中大部分是由于未配置RCC造成的。

重要注意事项:

a .外围设备RCC时钟的配置在外围设备初始化之前;

b .匹配相应的时钟。

例如,RCC_APB2外围设备不应位于RCC_APB1时钟中

2. RTC秒中断配置

此函数位于rtc.c文件下。

请结合参考手册(框图和寄存器)理解该函数。

注意事项4点:

a .可用备份空间: PWR _ backupaccesscmd (启用);

从系统框图中可以看到RTC中有阴影的部分,但实际上这是备份区域。 因此,必须启用。 因此,需要设置RCC时钟。

b.RTC时钟源选择: RCC _ rtcclkconfig (RCC _ rtclksource _ HSE _ div 128 );

正如原理说明中所述,RTC时钟源有三种。 是任意选择

RCC_RTCCLKSource_LSE

RCC_RTCCLKSource_LSI

RCC_RTCCLKSource_HSE_Div128

c .启用RTC秒中断: RTC_itconfig(RTC_it_sec,ENABLE );

RTC有三种中断。

RTC_IT_SEC秒中断

RTC_IT_ALR闹钟没电了

RTC_IT_OW (计数)溢出中断

D.RTC分频: RTC_setprescaler(62500;

我们为了得到真正的每秒中断一次,这里的值为62500=8M/128,这样正好可以每秒中断一次。

3. NVIC配置

此函数位于bsp.c文件下。

要中断,必须配置NVIC并分配优先级。

很多人认为自己的配置没问题,但程序是不会中断的。 原因可能就在这里。 因此,NVIC这里也容易被忽略。

4. RTC中断

此函数位于stm32f10x_it.c文件下;

这里需要注意的是,RTC有三种中断,但入口都是这个函数,所以需要分辨函数体中哪个中断进入了这个函数。

注意事项1 :

清除中断标志位: RTC _ clearitpendingbit (RTC _ it _ sec );

这是RTC_GetCounter (); 函数获取计数值并将计数值分别表示为时间、分钟和秒的过程。 代码如下

RTCCount=RTC_GetCounter (; //获取计数值,计算当前时钟

thh=RTC计数/3600; //小时

TMM=(RTC计数600 )/60; //分钟

TSS=(RTCcount600 ) `; 每秒

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。