求助:CH32V208 RTC闹钟唤醒待机模式疑问

我在CH32V208WBU6的评估板上进行实验,程序是官方例程中的Standby_Mode,我修改了main.c文件,想实现RTC闹钟唤醒待机模式的功能,我修改的代码如下:

void MyRTC_Init(void)

{

    /*开启时钟*/

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

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


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

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


    if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)          //通过写入备份寄存器的标志位,判断RTC是否是第一次配置

                                                            //if成立则执行第一次的RTC配置

    {

        RCC_LSEConfig(RCC_LSE_ON);                          //开启LSE时钟

        while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) != SET);  //等待LSE准备就绪


        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);             //选择RTCCLK来源为LSE

        RCC_RTCCLKCmd(ENABLE);                              //RTCCLK使能


        RTC_WaitForSynchro();                               //等待同步

        RTC_WaitForLastTask();                              //等待上一次操作完成


        RTC_SetPrescaler(32768 - 1);                        //设置RTC预分频器,预分频后的计数频率为1Hz

        RTC_WaitForLastTask();                              //等待上一次操作完成

        RTC_SetCounter(100);                       //将秒计数器写入到RTC的CNT中

        RTC_WaitForLastTask();                          //等待上一次操作完成

        BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);           //在备份寄存器写入自己规定的标志位,用于判断RTC是不是第一次执行配置

    }

    else                                                    //RTC不是第一次配置

    {

        RTC_WaitForSynchro();                               //等待同步

        RTC_WaitForLastTask();                              //等待上一次操作完成

    }

}


int main(void)

{

    GPIO_InitTypeDef GPIO_InitStructure = {0};

    SystemCoreClockUpdate();

    Delay_Init();

    USART_Printf_Init(115200);

    MyRTC_Init();

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

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);       //开启PWR的时钟

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOD, &GPIO_InitStructure);

    GPIO_ResetBits(GPIOD, GPIO_Pin_4);


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

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

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

    PWR_WakeUpPinCmd(ENABLE);                       //使能位于PA0的WKUP引脚,WKUP引脚上升沿唤醒待机模式


    /*设定闹钟*/

    uint32_t Alarm = RTC_GetCounter() + 10;         //闹钟为唤醒后当前时间的后10s

    RTC_SetAlarm(Alarm);                            //写入闹钟值到RTC的ALR寄存器

    RTC_WaitForLastTask();

    while(1)

    {

        Delay_Ms(3000);

        PWR_EnterSTANDBYMode();

    }

}

实验现象是PD4连接的LED灯亮了3秒之后熄灭进入待机模式,但是之后LED就不会再亮了,似乎芯片一直处于待机模式,RTC闹钟事件并没有将其唤醒,我不知道是什么原因,能请各位大大帮忙看看吗?

去搜一下官方发布的103 RTC例程参考一下。有没有使能闹钟中断,和EXTI17 中断。主要是EXTI17。


image.png

可手册里从待机模式下唤醒,仅需要配置闹钟事件就行啊。


您好,需要将EXTI_Line17配置成事件模式,如下图。附件是基于你的代码修改的例程,测试是没问题的,你可以参考一下。后续若有问题,可邮箱(lzs@wch.cn)和我沟通.

icon_rar.gifCH32V208 待机模式唤醒.zip

image.png



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