本帖最后由 RunningX 于 2019-10-12 15:07 编辑
RTC除了可以产生实时中断,还能产生预分频器中断。
预分频器中断配置如下:
/* 配置RTC时钟源为LSI,预分频器计时为1S,实时计时为5S。使能分频器中断,每1S产生一次分频中断,LED状态翻转
*/
void RTC_Prescale_Interrupt(void)
{
uint32_t tmpMod = 4; //RTC超时时间=(4+1)*(31999+1)/32000 = 5S
uint32_t tmpPrescalerValue = 31999; //(31999+1)/32000=1S,RTCPS最大值为2^20 - 1 = 1048575
RTC_ConfigType RTCConfig = {0};
RTCConfig.clockSource = 1; //0:Bus clk;1: LSI 32KHz; 2: External OSC; 3:Internal 8M;
RTCConfig.moduloValue = tmpMod;
RTCConfig.prescalerInterruptEn = ENABLE; //预分频器中断使能
RTCConfig.prescalerValue = tmpPrescalerValue; //time = (pre+1)*(mod+1)/clk
RTCConfig.RTCOut = ENABLE;
RTC_SetEventCallback(RTCCallBackFunc2); //设置回调函数
RTC_Initialize(&RTCConfig); //配置RTC
NVIC_EnableIRQ(RTC_IRQn);
GPIO_SetDir(LED2_PIN, GPIO_OUTPUT);//设置LED引脚为输出
LED2_ON; //LED2打开
while(1)
{
}
}
预分频器中断函数如下(每次中断,LED2状态翻转):
int32_t RTCCallBackFunc2(uint32_t wparam, uint32_t lparam )
{
LED2_CHANGE; //LED2状态翻转
return 0;
}
有一点需要注意的是,预分频器计数值最大为1048575,所以当时钟源频率较高时,能够产生中断的时间间隔是很小的。(此处选用的是LSI时钟源,频率仅为32K)
|