以STM32F072CB做的测试
官方参考应用文档:AN4759
RTC日历时钟配置
通过两个预分频得到1hz的时钟用来更新日历。
- 异步预分频:PREDIV_A,7-bit(0-127)
- 同步预分频:PREDIV_S,15-bit(0-32767)
频率计算公式如下:
Fck=Frtcclk/((PREDIV_A-1)*(PREDIV_S-1))
所以计算出PREDIV_A和PREDIV_S的值在配置时记得减1。
配置举例:
- 比如选择LSI=40khz作为RTC的时钟源,要产生1hz的时钟,就可以配置PREDIV_A=39,PREDIV_S=999
- 比如选择LSE=32.768khz作为RTC的时钟源,要产生1hz的时钟,可以配置PREDIV_A=127,PREDIV_S=255
为了产生1hz的时钟,分频值可以有多种组合,上面两种只是举例。如果用到alarm也要考虑下面描述的alarm子秒配置。
目标是产生1hz的时钟,当然也可以分频产生非1hz的时钟,只是那样RTC的日历不准而已。
RTC alarm
设定Alarm可以配置多种对比域,每一个都可以单独被屏蔽:
- 日期或者星期(二选一)
- 小时
- 分钟
- 秒
- 子秒(根据PREDIV_S预分频的值来确定分辨率)
这些参数分为两个寄存器来进行配置,一个是RTC_ALRMAR,另一个是RTC_ALRMASSR(这个专门负责子秒的alarm配置)
配置举例
- 比如我现在只想在子秒匹配时候产生alarm,那么Mask4、Mask3、Mask2、Mask1位全部设置为1,正确配置Mask ss的值。
- 在30分40秒的时候产生alarm,就把Mask2和Mask1设置为0,其他屏蔽位都配置为1。并把分的对比值设置为30,秒的对比值设置为40
Alarm 子秒的配置
RTC alarm的日期、时、分、秒的比较值配置都比较简单,而子秒的配置就会稍微复杂一点。
子秒的比较值是在RTC_ALARMASSR中进行设置,对比的对象是RTC_SSR。
RTC_SSR是子秒的计数器,他的分辨率为:1/(PREDIV_S+1)秒,并且是向下计数的,当值减到0以后会重装载RTC_SPRE中的PREDIV_S。
alarm子秒配置举例:
首先确定RTC时钟源,比如使用的是LSI=40KHZ。
可以配置PREDIV_A=39,PREDIV_S=999 就可以获得日历1秒钟的时钟。
这样子秒的分辨率就为:1sec/(999+1)=1ms
alarm子秒的Mask位:
子秒的Mask位是使用了4bit,位于RTC_ALARMASSR[27:24],设置不同值会屏蔽不同的对比位,具体如下表。如果我们要子秒完全和RTC_SSR值进行对比,就配置MASKSS[3:0]=15
RTC Alarm stm32cubemx配置:
激活日历和Alarm:
配置两个分频值(要根据时钟源计算)
设置Alarm相关的参数,这个要根据自己实际情况来配置。比如我只让子秒进行对比,日期、时、分、秒的屏蔽位都给使能了。设置的Sub Seconds值貌似是cubemx的一个bug,范围只允许0-59。所以生成工程以后我在代码里面手动改成了999
把RTC的中断给使能了,让Alarm可以产生中断
时钟配置不要忘记做选择,这里我使用LSI
生成MDK工程编写代码
rtc.c中这里我手动修改成了999
测试代码主要就是写一个RTC的中断回调函数放在main.c中就可以,在触发alarm的时候翻转LED
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)‘
{
HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);
}
-
STM32
+关注
关注
2275文章
10940浏览量
358921 -
时钟
+关注
关注
11文章
1756浏览量
132137 -
中断
+关注
关注
5文章
900浏览量
41958 -
RTC
+关注
关注
2文章
585浏览量
67372 -
回调函数
+关注
关注
0文章
87浏览量
11659
发布评论请先 登录
相关推荐
stm32的alarm触发不是按照我程序设定的
stm32l0 rtc WakeupTimer 和 alarm设置问题
教你使用RT-Thread开启STM32H7系列的RTC与Alarm组件
浅谈基于Apollo3平台Alarm组件的移植
STM32L431 RTC设置和Alarm callback时区不一致是为什么?
分析在RTT中RTC alarm文件的实现方法
RTC alarm组件不能进入回调函数该怎样去解决呢
基于STM32F1的RTC与Alarm(闹钟功能)实现定时控制的要求
STM32L431 RTC设置和Alarm callback时区不一致怎么办呢
RTC alarm组件不进入回调函数的原因是什么?
RTC的alarm中断事件能否唤醒standby或者shutdown模式?
STM32单片机RTC时钟的使用方法及步骤

RT-Thread 应用笔记 - RTC Alarm 组件的使用

评论