关于ch32v203G8R6的rtc闹钟中断问题

问题如题,在这个型号上使用rtc闹钟中断没有效果,换成ch32v203c8t6的开发板测试可以实现,是什么问题

void rtc_init(void)

{

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);     //开启PWR的时钟


    RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE);     //开启BKP的时钟




    /*备份寄存器访问使能*/


    PWR_BackupAccessCmd(ENABLE);                            //使用PWR开启对备份寄存器的访问

    BKP_TamperPinCmd(DISABLE);

    if (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) != SET) {

        RCC_LSICmd(ENABLE);

//        int temp = 0;

        while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) {

            // TODO lsi boot failed, not sleep?

//            temp++;

//            if (temp >= 250) {

//                break;

//            }

//            rt_thread_mdelay(10);

        }

//        if (temp >= 250) {

//            elog_e(TAG, "LSI don't start expectly in 2.5s: %d\n", temp);

//        }

    }


    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);

    RCC_RTCCLKCmd(ENABLE);

    RTC_WaitForLastTask();


    RTC_EnterConfigMode();

    RTC_WaitForLastTask();


    RTC_SetPrescaler(0);

    RTC_WaitForLastTask();


    RTC_SetAlarm(0);

    RTC_WaitForLastTask();


    RTC_SetCounter(1);

    RTC_WaitForLastTask();


    EXTI_InitTypeDef EXTI_InitStructure = {0};

    EXTI_InitStructure.EXTI_Line = EXTI_Line17;

    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;

    EXTI_InitStructure.EXTI_LineCmd = ENABLE;

    EXTI_Init(&EXTI_InitStructure);


    NVIC_InitTypeDef NVIC_InitStructure = {0};

    NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);


}

static void RTC_Alarm(uint32_t count) {

    RTC_SetCounter(0);

    RTC_WaitForLastTask();


    RTC_SetAlarm(count);

    RTC_WaitForLastTask();


    EXTI_ClearITPendingBit(EXTI_Line17);

    RTC_ClearITPendingBit(RTC_IT_ALR);


    RTC_ITConfig(RTC_IT_ALR, ENABLE);

    RTC_WaitForLastTask();


    EXTI_ClearITPendingBit(EXTI_Line17);

    RTC_ClearITPendingBit(RTC_IT_ALR);


}

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

void RTCAlarm_IRQHandler(void) {


    EXTI_ClearITPendingBit(EXTI_Line17);

    RTC_ClearITPendingBit(RTC_IT_ALR);

//    printf( "RTCAlarmIRQHandler %d", RTC_GetCounter());

    RTC_ITConfig(RTC_IT_ALR, DISABLE);

    RTC_WaitForLastTask();


    printf( "RTCAlarmIRQHandler %d\n", RTC_GetCounter());

}

/*********************************************************************

 * @fn      main

 *

 * @brief   Main program.

 *

 * @return  none

 */

int main(void)

{

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

    SystemCoreClockUpdate();

    Delay_Init();

    USART_Printf_Init(115200);

    printf("SystemClk:%d\r\n", SystemCoreClock);

    printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );

    printf("Stop Mode Test\r\n");

    rtc_init();

    RTC_Alarm(10000);

//    EXTI0_INT_INIT();

//    Delay_Ms(5000);

//    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

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

//    PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);

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


    while(1)

    {

        Delay_Ms(1000);

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

    }

}

这个是测试的代码,本来是用来作为rtthread的pm电源管理的deep唤醒,发现怎么都唤不醒


您好,可以参考一下附件例程,附件例程测试唤醒是没有问题的,如下图

icon_rar.gifCH32V203 STOP-RTC唤醒.zip

image.png


我测试了你给的代码了,就是会出现进入stop后rtc并没有去定时唤醒,然后我就先把进stop的部分屏蔽,单独测了一下会不会定时打印,但还是不行,但是那个rtc秒中断的例程可以运行,这样的情况有没有可能是电路设计的问题导致的,看起来就是rtc没问题但是闹钟中断无效


您好,例程我这边测试过都是没问题的,定时10s后唤醒,就是10s后唤醒。正常若直接用例程测试的话应该是没问题的,你可以将你的现象和我具体描述一下或截图发我(lzs@wch.cn)看一下,后面问题也可以通过邮箱沟通。



我把相关的邮件发给你了,我看了一下批次号,这个是第零批的,跟批次号有关系么?我同事用的一批次的是没问题的


您好,已邮件回复你,你可以按照我邮件回复试一下,后续沟通可直接通过邮件沟通。


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