STM32单片机的低功耗运行模式有睡眠、停止、待机三种模式。在睡眠模式下,只有STM32的内核时钟被关闭,而外设时钟仍然保持运行,所有的I/O引脚都保持它们在运行模式时的状态,WFI模式下可以通过任意中断唤醒,WFE模式下可以任意唤醒事件唤醒,唤醒后程序继续睡眠位置往下运行。进入睡眠模式,可以使用HAL_PWR_EnterSLEEPMode函数实现,操作很简单。 本次测试使用以下方式进行: 1、在主程序中,循环计数一个变量,并在OLED上显示计数结果。 2、在用户按钮中断中,第一次按下后,建立标志 3、在主程序中检测到这个标志,延时5秒后,进入睡眠模式 4、进入睡眠模式时,关闭Sistick中断和定时器中断,保留用户按钮中断(为了唤醒用) 5、在第二次用户按钮中断时,自动退出睡眠模式,启动Sistick和sing时期中断,在主程序中继续计数并显示。 进入睡眠的程序: // 进入睡眠模式 void enter_sleep_mode(void){ HAL_SuspendTick();//关闭系统systick中断,防止睡眠被systick中断打断 HAL_NVIC_DisableIRQ(TIM2_IRQn); // 禁止定时器中断 // 进入睡眠模式之前,点亮用户LED BSP_LED_On(LED2); HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);//进入WFI睡眠模式 } 用户按钮中断程序: void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin) { // 判断是不是来自PC13的 if (GPIO_Pin == BUTTON_USER_PIN) { / Toggle LED2 / //BSP_LED_On(LED2); } if (lpFlag == 0) { // 允许启动低功耗模式 lpFlag = 1; // 清除计数变量 cnt = 0; } } 主程序的循环处理: while (1) { // 检查是否有I3C设备要求接入 //checkI3CDevice(); // 计数加1 cnt++; GUI_ShowNum(80, 8, cnt, 3, 8, 1); if (lpFlag==1) { // 输出启动低功耗处理表示串 GUI_ShowString(0, 8, "Wait Sleep ", 8, 1); // 延迟5秒后,进入低功耗模式 if (cnt == 5) { // 时间到,改变标志,防止下次用户按钮启动低功耗模式 lpFlag = 2; GUI_ShowString(0, 8, "Start Sleep", 8, 1); // 启动低功耗(睡眠模式) enter_sleep_mode(); } } if (lpFlag==2) { GUI_ShowString(0, 8, "Exit Sleep ", 8, 1); // 关闭用户LED BSP_LED_Off(LED2); // 启动中断 HAL_ResumeTick();//打开系统systic中断 HAL_NVIC_EnableIRQ(TIM2_IRQn); // 禁止定时器中断 } HAL_Delay(1000); } 进入睡眠模式前,正常计数,并显示: 进入水面后,计数停止,显示固化不变 退出睡眠后,计数继续,并显示 |
实战经验 | STM32H5 USBD Classic驱动 CDC移植
NUCLEO-H563ZI刷入Micropython固件并点亮LED灯
基于STM32H5的DA之初体验经验分享(带 Trust Zone)
【免费申请】高性能和低成本双Buff加持的NUCLEO H533RE,等你来!
【NUCLEO-H533RE评测】使用双存储区Flash 在不关闭系统的状态下,实现OTA
【NUCLEO-H533RE评测】高性能-全频,硬件加速在电机控制相关应用的速度对比。
【NUCLEO-H533RE评测】HASH对比测试
【NUCLEO H533RE评测分享】高性能和低成本双Buff加持的NUCLEO H533RE
【NUCLEO-H533RE评测】+加载OLED显示部件
【NUCLEO-H533RE评测】+Coremark跑分测试
下次搞个大屏啊大佬