STM32F1系列的RTC毫秒级计数方法
引言
项目要求,需要使用到毫秒、微秒精度的时间计时。此前采取过TIM基础定时器、滴答定时器完成定时要求,查看手册RTC没有亚秒寄存器等,刚开始以为无法运行,后续查找发现有RTC预分频器余数寄存器,因此可以尝试进行毫秒级计时。
1 设计介绍
我项目是用的野火STM32F103ZET6开发板(无所谓不影响),RTC模块可采取两个时钟源,使用LSI内部时钟(40KHz),和LSE(32.768KHz),区别是只需要在下文调用预分频器余数寄存器相关函数时修改值即可。
2 定时程序介绍
2.1 关键寄存器
RTC预分频器余数寄存器分为高低位,RTC_DIVH、RTC_DIVL。这个寄存器可以获取比秒单位更精确的值,是一个只读的自减寄存器,值和预分频寄存器相同,如果预分频寄存器设置为32767,那么该寄存器自减到0后也会重新装载为32767,自减到0表示经过1000ms。
因此设计程序读取该寄存器的值后,简单地设计计算程序就可以获取毫秒值。
2.2 程序设计
首先介绍关键函数RTC_GetDivider()
在stm32f10x_rtc.c文件中可以查看该函数,我放在下面,能调用就可以。
/**
* @brief Gets the RTC divider value.
* @param None
* @retval RTC Divider value.
*/
uint32_t RTC_GetDivider(void)
{
uint32_t tmp = 0x00;
tmp = ((uint32_t)RTC->DIVH & (uint32_t)0x000F) << 16;
tmp |= RTC->DIVL;
return tmp;
}
能获取寄存器的值后又该干啥捏?
我们定义从RTC模块获取的毫秒值为rtc_millisecond,那么:
rtc_millisecond = (32767 - RTC_GetDivider()) * 1000 / 32767; //LSE
就能计算出实际毫秒值了。