CH579M 调用LowPower_Sleep()无法进入休眠(已解决,疑似芯片问题)

必须先感谢客服 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;


进一步调试得出一个结论:若要进入SLEEP模式,不可配置使用引脚的上升沿外部中断!!!


调试方法如下:

如下方代码所示,在引脚配置外部中断以及唤醒下方直接进入休眠,RTC设定5S后唤醒,测试了多种引脚组合,PB8、PB9、PB15三个引脚(PB8、PB9外部有10M上拉,PB15外部悬空),在第10行和第12行打两个断点观察两个断点的执行间隔,只要有任意一个引脚配置了GPIO_ITMode_RiseEdge,则放开第一个断点后直接到达第二个断点,否则都会断开SWD,并5S后成功唤醒(板子有现象)

	GPIOB_ModeCfg(GPIO_Pin_15,GPIO_ModeIN_PU);
	GPIOB_ModeCfg(GPIO_Pin_8 | GPIO_Pin_9, GPIO_ModeIN_Floating);
	GPIOB_ITModeCfg(GPIO_Pin_15, GPIO_ITMode_RiseEdge/*GPIO_ITMode_RiseEdge*/);
	GPIOB_ITModeCfg(GPIO_Pin_8, GPIO_ITMode_FallEdge/*GPIO_ITMode_RiseEdge*/);
	GPIOB_ITModeCfg(GPIO_Pin_9, GPIO_ITMode_FallEdge/*GPIO_ITMode_FallEdge*/);
	NVIC_EnableIRQ(GPIO_IRQn);
	
	PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_RTC_WAKE | RB_SLP_GPIO_WAKE);
	
	rtc_timer_start(32768 * 5);
	LowPower_Sleep( RB_PWR_RAM14K|RB_PWR_RAM2K );
	SetSysClock( CLK_SOURCE_HSI_32MHz );



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