STM32进入待机模式并唤醒过程详解
STM32CubeMX配置流程1、配置时钟
注意:如想要使用芯片内置的16MHz的HSI时钟作为时钟源的话,这一步可以省略。
如希望使用芯片外置的晶振作为时钟源,可以像我这样配置:
注意:我的外置晶振是8Mhz的。
先输入外部晶振的时钟源是8MHz,之后选择它作为时钟源输入到PLL,将PLL的时钟作为时钟源作为系统时钟。最后将HCLK强行修改到168MHz,之后软件会自动计算出来PLL的参数。
2、配置唤醒
在途中复选框打勾,即可完成唤醒源PA0引脚的配置。
**注意:**在Debug一栏,默认是Disable,可以选择SWD或者是JTAG,不要保持默认,否则下次就连不上JTAG啦!
【当然如果不小心保持了默认的Disable,以至于连不上JTAG了,我们也有办法的,比如使用串口下载程序,往后有机会细讲】
3、配置LED引脚
这个时候其实已经完成了待机模式及唤醒的配置,但为了观看效果,可以将原理图上的LED配置上。由于硬件电路是LED引脚输出低电平的时候,LED点亮,这里配置输出低电平。
这个时候我们查看一下,PA0是自动配置的,我们不需要改动。
STM32代码编写
1、上电之后检查是否曾处于待机模式
__HAL_RCC_PWR_CLK_ENABLE();//Enable PWR clock
if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET)//Has device been in Standby mode?
{
/* Clear Standby flag */
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);
HAL_GPIO_WritePin(GPIOF, LED0_Pin|LED1_Pin, GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOF, LED0_Pin|LED1_Pin, GPIO_PIN_RESET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOF, LED0_Pin|LED1_Pin, GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOF, LED0_Pin|LED1_Pin, GPIO_PIN_RESET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOF, LED0_Pin|LED1_Pin, GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOF, LED0_Pin|LED1_Pin, GPIO_PIN_RESET);
HAL_Delay(500);
}
如果曾处于待机模式,也即是说,设备是从待机模式被唤醒的,那么就会进if语句,先将标志位清零,之后将LED等多次置为高低电平,方便我们观察。
2、进入待机模式
HAL_Delay(5000);
HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1);//Disable PWR_WAKEUP_PIN1 connected to PA0
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);//clear flag
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);//Enable PA0 WakeUp Pin
HAL_PWR_EnterSTANDBYMode();//Enter Standby Mode
前面先延迟5秒,让LED点亮5秒钟,即便不是从待机唤醒的,也会被我们观察到现象。
之后就是进入待机模式的流程。
实验现象
1、下载程序之后
LED灯亮5秒之后熄灭……当我们按下连接到PA0的按键之后,松开按键的瞬间【上升沿唤醒】,看到LED闪烁多次,又连续5秒点亮。证明芯片是从待机模式被唤醒的。
2、调试
在STM32CubeIDE软件上,执行如下步骤:
当程序执行到断点处,观看PWR寄存器。
第一次执行到的时候,不会进入if语句。
当进入待机模式后,按下PA0的按键,再次程序执行到断点处,观看寄存器的值。
程序进入了if语句,观看右侧的寄存器,对照芯片参考手册既可了解详细细节,此处不多赘述。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/smart_boy__/article/details/148214019
浅浅回答下,配置 WKUP 引脚 / RTC 闹钟触发,唤醒后执行复位流程重新初始化外设与代码。
页:
[1]