必须先感谢客服 TECH13 帮助我解决了上个问题~:关于CH579M+RT-Thread : RTC从Sleep模式唤醒数次后,唤醒失败
回到问题:
调用LowPower_Sleep(RB_PWR_RAM2K | RB_PWR_RAM14K)无法进入休眠
先说结论:若要进入SLEEP模式,不可配置使用引脚的上升沿外部中断!!!
应用场景:
使用RT-Thread 4.0.3 RTOS,已调用
PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_RTC_WAKE | RB_SLP_GPIO_WAKE);
开启RTC与GPIO唤醒(之前只开了RTC唤醒,并且之前可以正常休眠),以上代码注释GPIO唤醒也能正常休眠,但无法响应IO唤醒,不满足项目需求
Debug表现:在RTC中断、GPIO中断与LowPower_Sleep()函数均加入断点,然后运行,能停在LowPower_Sleep()函数断点处,按单步运行直接跳到下一行(正常应该是SWD直接断开),并且会重复调用LowPower_Sleep(),去掉该函数断点全速运行,依然不进入休眠,也不进RTC中断与GPIO中断
case PM_SLEEP_MODE_DEEP: /* Enter STOP 2 mode */ LowPower_Sleep(RB_PWR_RAM2K | RB_PWR_RAM14K); /* Re-configure the system clock */ // DelayMs(2); // // if(!(R8_HFCK_PWR_CTRL&RB_CLK_XT32M_PON)) { // 是否HSE上电 // PWR_UnitModCfg( ENABLE, UNIT_SYS_HSE ); // HSE上电 // DelayUs((1200)/5); // } // else if(!(R16_CLK_SYS_CFG&RB_CLK_OSC32M_XT)){ // 是否选择 HSI/5 做时钟源 // DelayUs((1200-330)/5); // } // HSECFG_Current( HSE_RCur_100 ); // 降为额定电流(低功耗函数中提升了HSE偏置电流) // DelayUs(5/5); // 等待稳定 1-5us SetSysClock( CLK_SOURCE_HSI_32MHz ); break;