因为LSI是RC振荡电路产生,所以产生的时钟周期都不会太准。但是由于很多公司为了节约成本不会选择LSE,当然这也没有问题,只要定时器能正常工作也能够很准的计时。
但是,很多类型的设备例如手持设备,需要做到低功耗,就需要进入停止模式,这时候只有RTC可以运行对芯片进行唤醒。这时候就需要进行精准的进行唤醒(例如:10s唤醒一次)。此时可采用的一种方法是,使用定时器进行校准。
校准函数如下所示:
void RTC_Calibrate(double* m)
{
u32 timeT3 = 0;
u32 timeRTC = 0;
RTC_WaitForLastTask();//等待RTC完成设置
RTC_SetCounter(0);
RTC_WaitForLastTask();
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
TIM3->CNT = 0;
timeT3 = Get_Ticks();//外部函数,每1ms自加1
while(1)
{
IWDG->KR = 0xAAAA;
if(Get_Ticks() - timeT3 >= 500)
{
timeRTC = RTC_GetCounter();
*m = (double)timeRTC / (double)500;//
break;
}
}
}
m的值即为校准之后的值,若需要延时10s
停止模式前和停止模式后加入以下代码:
Sys_Enter_StopMode(m*10);
Sys_Exit_StopMode(m*10);
在你需要进入停止模式时:<