注意
- 本文的总结基于STM32F103C8T6这款MCU;
- 这款
MCU
的RTC
没有硬件万年历功能,是通过RTC
库的HAL_RTC_GetTime()
函数将秒数转换成日期数据的;
BCD格式
VS Binary格式
这个的BCD
格式具体是指8421
码,具体区别可以看如下代码:
sTime.Hours = 0x23; // BCD format
sTime.Hours = 23; // binary format
而经过测试发现,在CubeMx
生产的代码中,RTC
初始化时,月份只有BCD
格式,所以在CubeMx
中配置时,直接选BCD
格式就好,否则需要修改CubeMx
生产的初始化代码,而且还会导致RTC
的日期在时间到达00:00:00
时不会更新的问题。
而如果在时间处理过程中,如果需要对时间进行加计算,则使用Binary format
更方便。可以在获取时间是指定编码格式:
HAL_RTC_GetDate(hrtc, &rtcData, RTC_FORMAT_BIN);
HAL_RTC_GetTime(hrtc, &rtcTime, RTC_FORMAT_BIN);
RTC OUT
VS Tamper
这两个是完全不同的功能,RTC OUT
用户输出和时间相关的脉冲,而Tamper
是用于检测外界输入信号的。所以这两个只能使能其中一个。
RTC中断
通过以上两种图片发现,通过配置不同的RTC
功能,MCU
提供的中断也是不一样的。
- 先说一下共有的
RTC global interrupt
中断:这个中断就是一个秒中断,每秒触发一次。但是这个中断的触发,还需要加上如下使能语句:
HAL_RTCEx_SetSecond_IT(&hrtc);
通过以上方式使能后,MCU
每秒都会调用一次HAL_RTCEx_RTCEventCallback()
函数。(在HAL_RTCEx_RTCEventCallback()
函数中,不能调用HAL_RTC_GetTime()
和HAL_RTC_GetDate()
函数,否则有可能造成秒计数出现误差的问题)
2. RTC alarm interrupt through EXTI line 17
就是闹钟中断,由RTC
设置的闹钟时间决定什么时候产生。(后面的through EXTI line 17
在MCU
内部已经连接了,所以不需要MCU外部的硬件支持。)而要设置闹钟,在cubeMx
中,必须设置如下: