CH582M 使用RTC从睡眠模式唤醒时芯片会自动复位

请教一下各位关于ch582m的问题,我使用的是官方的ch582m evt板子,我使用官方的PM例程代码时程序运行正常,按键唤醒也不会出现复位的情况。但是使用rtc唤醒时就会出现唤醒就复位的情况。


代码如下:

#include "CH58x_common.h"

int main()
{

    SetSysClock(CLK_SOURCE_PLL_60MHz);


    GPIOA_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);
    GPIOB_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);

    //串口调试初始化
    GPIOA_SetBits(GPIO_Pin_9);
    GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU);
    GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA);
    UART1_DefInit();


    PRINT("Test\n");

    while(1)
    {
        PRINT("Entering Sleep mode\n");
        DelayMs(10);

        RTC_TMRFunCfg(Period_8_S);
        PFIC_EnableIRQ(RTC_IRQn);
        PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_RTC_WAKE, Short_Delay);

        LowPower_Sleep(RB_PWR_RAM30K | RB_PWR_RAM2K); /* 只保留30+2K SRAM 供电 */
        HSECFG_Current(HSE_RCur_100);                 /* 降为额定电流(低功耗函数中提升了HSE偏置电流) */

        DelayMs(10);
        PRINT("Wake up\n");  //这一句因为复位而没法执行
    }
}

/*RTC闹钟唤醒中断*/
__INTERRUPT
__HIGH_CODE
void RTC_IRQHandler(void)
{
    if (RTC_GetITFlag(RTC_TMR_EVENT))
    {
        RTC_ClearITFlag(RTC_TMR_EVENT);
    }
}


1.可以设置为长延时唤醒,

PWR_PeriphWakeUpCfg(ENABLE,?RB_SLP_RTC_WAKE,?Long_Delay);

2.也可以修改下rtc中断服务函数:

__INTERRUPT
__HIGH_CODE
void?RTC_IRQHandler(void)
{
????R8_RTC_FLAG_CTRL?=?RB_RTC_TMR_CLR?;
}



你好,试过方法1可以解决问题,谢谢啦!!


不过如果方便的话可以解释一下背后的原理吗? :D


短延时唤醒的话,进入中断时flash还没有准备好,此时不可以调用flash里的程序的,

中断服务函数本身就使用highcode修饰,里面直接写寄存器是可以的,若调用函数需要用highcode修饰。


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