[学习笔记]

RTC预分频器中断

[复制链接]
412|0
手机看帖
扫描二维码
随时随地手机跟帖
RunningX|  楼主 | 2019-10-12 15:05 | 显示全部楼层 |阅读模式
本帖最后由 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)






使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

223

帖子

4

粉丝