最近写程序需要RTC以ms计数
在古老的文献中有记载:
这段是白色泪光说的:
RTC预分频器余数寄存器(RTC_DIVH、RTC_DIVL),这两个寄存器的作用就是用来获得比秒钟更为准确的时钟。 该寄存器的值自减的,用于保存还需要多少时钟周期获得一个秒信号。在一次秒钟更新后,由硬件重新装载。这两个寄存器和 RTC 预分频装载寄存器位数是一样的。也就是说,如果预分频装载寄存器的值为32767,那么余数寄存器就会在每一次秒更新时由硬件重新装载为32767,然后向下计数,计数到0表示一秒,也即1000ms。
在一个古老的论坛中有道友给出了方法:
while(1)
{
RTC_Counts=RTC->DIVH;
RTC_Counts=RTC_Counts<<16;
RTC_Counts+=RTC->DIVL;
if(RTC_Counts==3276)
{
Counts++;
printf("实现毫秒级计数 Counts->%d
",Counts);
}
}
至于RTC的初始化:
void MX_RTC_Init(void)
{
LL_RTC_InitTypeDef RTC_InitStruct = {0};
LL_PWR_EnableBkUpAccess();
/* Enable BKP CLK enable for backup registers */
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_BKP);
/* Peripheral clock enable */
LL_RCC_EnableRTC();
/** Initialize RTC and set the Time and Date
*/
RTC_InitStruct.AsynchPrescaler = 3276;
LL_RTC_Init(RTC, &RTC_InitStruct);
LL_RTC_SetAsynchPrescaler(RTC, 3276);
}
以上即可实现毫秒级计数