CH32V307 RTC定时唤醒

开发板CH32V307V-R0-1V0,参照移植到307 PWR STOP_MODE项目,每s唤醒一次。闹钟唤醒停机模式>

u8 RTC_Alarm_Set(void)

{

    u32 seccount = 0;

    seccount = RTC_GetCounter()+1;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

    PWR_BackupAccessCmd(ENABLE);

    RTC_SetAlarm(seccount);

    RTC_WaitForLastTask();

    return 0;

}


void RTCAlarm_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));

void RTCAlarm_IRQHandler( void )

{

    //RTC_Alarm_Set();

    if( RTC_GetITStatus( RTC_IT_ALR ) != RESET )

    {

    }

    RTC_WaitForLastTask();

    RTC_ClearITPendingBit( RTC_IT_ALR );

    RTC_WaitForLastTask();

}

int main( void )

{

.....

    RTC_Alarm_Set();

    while(1)

    {

        RTC_Alarm_Set();

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

        printf("\r\n ********** \r\n");

        PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);

        printf("\r\n ########## \r\n");

        Delay_Ms(1000);

        printf("Run in main\r\n");

    }

}

其中闹钟配置放在主while循环内,可以实现1s唤醒一次,放在RTCAlarm_IRQHandler中不可实现。如果想要精确实现1ms唤醒一次,100us唤醒一次,应该如何实现?主while中调用RTC_Alarm_Set()可能会有延迟。

谢谢!

您好,目前你配置低功耗模式为STOP模式,唤醒方式可使用外部中断或事件进行唤醒。目前使用RTC的话,最快方式也就是秒中断。若想实现1ms或100us唤醒一次,可将GPIO引脚配置为外部中断或事件,每个1ms或100us给一次触发。或你可将低功耗模式配置为睡眠模式,采用定时器中断唤醒方式,可精确实现1ms或100us唤醒一次。后续若有问题,可通过邮箱(lzs@wch.cn)和我沟通。


我通过使用512K外部有源LSE,RTC_SetPrescaler(511),RTC_SetAlarm(RTC_GetCounter()+1);实现1ms唤醒一次,调整PrescalerValue可获得更低的唤醒周期。我遇到的问题是,不能在中断函数中RTCAlarm_IRQHandler进行RTC_SetAlarm()。只能在主while循环中RTC_SetAlarm()。


您好,若方便可将你的工程发至我的邮箱,这边具体看一下测试一下


我找到问题了,我把PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);放在了RTCAlarm_IRQHandler()中,该语句放在主while中就OK了。

但是又发现个问题,RTC_SetAlarm(RTC_GetCounter()+0);才能实现1s唤醒一次,RTC_GetCounter()+1是2s唤醒一次。


只有登录才能回复,可以选择微信账号登录