0、前言
关于STM32L151系列MCU的低功耗模式的介绍推荐看这篇文章。
1、低功耗模式简介
STM32L151系列MCU的低功耗模式分为五种:
[tr]名称功能[/tr]
| 低功耗运行模式 | 这种模式是通过将多速内部(MSI)RC振荡器设置为最小时钟(65kHz)、从SRAM或Flash存储器执行以及在低功耗模式下的内部调节器来实现的,以最小化调节器的工作电流。 在低功耗运行模式下,时钟频率和启用外围设备的数量都是有限的 |
| 睡眠模式 | 在睡眠模式下,只停止CPU。 所有外围设备继续操作,并可以在发生中断/事件时唤醒CPU。 |
| 低功耗睡眠模式 | 这种模式是通过在低功耗模式下与内部电压调节器进入睡眠模式来实现的,以最小化调节器的工作电流。 在低功耗睡眠模式下,时钟频率和启用外围设备的数量都是有限的;一个典型的例子是有一个计时器运行在32kHz。 当唤醒被事件或中断触发时,系统恢复到运行模式,并打开调节器 |
| 停止模式(带RTC) | 停止模式在保持RAM和寄存器内容和实时时钟的同时达到最低的功耗。 停止VCORE域中的所有时钟,禁用PLL、MSIRC、HSIRC和HSE晶体振荡器。 LSE或LSI仍在运行。 调压器处于低功耗模式。 设备可以在8µs内由任何EXTI线从停止模式唤醒。 EXTI线源可以是16条外部线之一。 它可以是PVD输出、比较器1事件或比较器2事件(如果内部参考电压打开),可以是RTC警报、USB唤醒、RTC篡改事件、RTC时间戳事件或RTC唤醒 |
| 停止模式(不带RTC) | 停止模式在保留RAM和寄存器内容的同时达到最低的功耗。 所有时钟停止,PLL,MSIRC,禁用HSI和LSIRC,LSE和HSE晶体振荡器。 调压器处于低功耗模式。 设备可以在8µs内由任何EXTI线从停止模式唤醒。 EXTI线源可以是16条外部线之一。 它可以是PVD输出,比较器1事件或比较器2事件(如果内部参考电压打开)。 它也可以被USB唤醒。 |
| 待机模式(带RTC) | 采用待机模式,实现最低功耗和实时时钟。 内部电压调节器被关闭,以便整个VCORE域被关闭。 锁相环、MSIRC、HSIRC和HSE晶体振荡器也被关闭。 LSE或LSI仍在运行。 进入待机模式后,除了待机电路中的寄存器(唤醒逻辑、IWDG、RTC、LSI、LSE晶体32KOSC、RCC_CSR)外,RAM和寄存器内容丢失)。 当外部复位(NRST引脚)、IWDG复位、三个WKUP引脚之一的上升边缘、RTC报警(报警A或报警B)、RTC篡改事件、RTC时间戳事件或RTC唤醒事件发生时,设备在60µs内退出待机模式 |
| 待机模式(不带RTC) | 采用待机模式,实现最低功耗。 内部电压调节器被关闭,以便整个VCORE域被关闭。 锁相环、MSI、RC、HSI和LSIRC、HSE和LSE晶体振荡器也被关闭。 进入待机模式后,除了待机电路中的寄存器(唤醒逻辑、IWDG、RTC、LSI、LSE晶体32KOSC、RCC_CSR)外,RAM和寄存器内容丢失)。 当发生外部复位(NRST引脚)或三个WKUP引脚之一的上升边缘时,设备在60µs内退出待机模式。 |
▲来自于STM32L151DataSheet中P14~P15 2、CubeMX设置
▲CubeMX RCC设置
▲CubeMX SYS设置
▲CubeMX USART1设置
▲CubeMX 时钟树设置
3、软件设计
关于串口配置在这里不做赘述有需求的同学戳这里,实现上升沿唤醒待机模式中的MCU后使用串口发送数据。
main.c
/* USER CODE BEGIN 0 */
void Sys_Enter_Standby(void){
__HAL_RCC_PWR_CLK_ENABLE(); //使能PWR时钟
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); //清除Wake_UP标志
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN2); //设置WAKEUP用于唤醒
HAL_PWR_EnterSTANDBYMode(); //进入待机模式
}
/* USER CODE END 0 */
...
/* USER CODE BEGIN 3 */
printf("Time: 5rn");
HAL_Delay(1000);
printf("Time: 4rn");
HAL_Delay(1000);
printf("Time: 3rn");
HAL_Delay(1000);
printf("Time: 2rn");
HAL_Delay(1000);
printf("Time: 1rn");
HAL_Delay(1000);
printf("Entered Standby Mode...Please press KEY_UP to wakeup system!rn");
Sys_Enter_Standby();
函数及宏定义介绍:
HAL_PWR_EnableWakeUpPin
说明: 启用唤醒PINx功能。
参数:
WakeUpPinx: 指定要启用的电源唤醒引脚。 此参数可以是以下值之一:PWR_WAKEUP_PIN1 PWR_WAKEUP_PIN2仅在STM32F410xx/STM32F446xx/STM32F412x G上可用PWR_WAKEUP_PIN3仅在STM32F410xx/STM32F412xG设备上可用。
HAL_PWR_EnterSTANDBYMode
说明: 进入待机模式。
注意事项:
在待机模式下,所有的I/O引脚都是高阻抗的,除了:复位引脚(仍然可用)RTC_AF1引脚(PC13),如果配置为篡改、时间戳、RTC报警或RTC时钟校准。 RTC_AF2引脚(PI8),如果配置为篡改或时间戳。 WKUP引脚1(PA0)。
0、前言
关于STM32L151系列MCU的低功耗模式的介绍推荐看这篇文章。
1、低功耗模式简介
STM32L151系列MCU的低功耗模式分为五种:
[tr]名称功能[/tr]
| 低功耗运行模式 | 这种模式是通过将多速内部(MSI)RC振荡器设置为最小时钟(65kHz)、从SRAM或Flash存储器执行以及在低功耗模式下的内部调节器来实现的,以最小化调节器的工作电流。 在低功耗运行模式下,时钟频率和启用外围设备的数量都是有限的 |
| 睡眠模式 | 在睡眠模式下,只停止CPU。 所有外围设备继续操作,并可以在发生中断/事件时唤醒CPU。 |
| 低功耗睡眠模式 | 这种模式是通过在低功耗模式下与内部电压调节器进入睡眠模式来实现的,以最小化调节器的工作电流。 在低功耗睡眠模式下,时钟频率和启用外围设备的数量都是有限的;一个典型的例子是有一个计时器运行在32kHz。 当唤醒被事件或中断触发时,系统恢复到运行模式,并打开调节器 |
| 停止模式(带RTC) | 停止模式在保持RAM和寄存器内容和实时时钟的同时达到最低的功耗。 停止VCORE域中的所有时钟,禁用PLL、MSIRC、HSIRC和HSE晶体振荡器。 LSE或LSI仍在运行。 调压器处于低功耗模式。 设备可以在8µs内由任何EXTI线从停止模式唤醒。 EXTI线源可以是16条外部线之一。 它可以是PVD输出、比较器1事件或比较器2事件(如果内部参考电压打开),可以是RTC警报、USB唤醒、RTC篡改事件、RTC时间戳事件或RTC唤醒 |
| 停止模式(不带RTC) | 停止模式在保留RAM和寄存器内容的同时达到最低的功耗。 所有时钟停止,PLL,MSIRC,禁用HSI和LSIRC,LSE和HSE晶体振荡器。 调压器处于低功耗模式。 设备可以在8µs内由任何EXTI线从停止模式唤醒。 EXTI线源可以是16条外部线之一。 它可以是PVD输出,比较器1事件或比较器2事件(如果内部参考电压打开)。 它也可以被USB唤醒。 |
| 待机模式(带RTC) | 采用待机模式,实现最低功耗和实时时钟。 内部电压调节器被关闭,以便整个VCORE域被关闭。 锁相环、MSIRC、HSIRC和HSE晶体振荡器也被关闭。 LSE或LSI仍在运行。 进入待机模式后,除了待机电路中的寄存器(唤醒逻辑、IWDG、RTC、LSI、LSE晶体32KOSC、RCC_CSR)外,RAM和寄存器内容丢失)。 当外部复位(NRST引脚)、IWDG复位、三个WKUP引脚之一的上升边缘、RTC报警(报警A或报警B)、RTC篡改事件、RTC时间戳事件或RTC唤醒事件发生时,设备在60µs内退出待机模式 |
| 待机模式(不带RTC) | 采用待机模式,实现最低功耗。 内部电压调节器被关闭,以便整个VCORE域被关闭。 锁相环、MSI、RC、HSI和LSIRC、HSE和LSE晶体振荡器也被关闭。 进入待机模式后,除了待机电路中的寄存器(唤醒逻辑、IWDG、RTC、LSI、LSE晶体32KOSC、RCC_CSR)外,RAM和寄存器内容丢失)。 当发生外部复位(NRST引脚)或三个WKUP引脚之一的上升边缘时,设备在60µs内退出待机模式。 |
▲来自于STM32L151DataSheet中P14~P15 2、CubeMX设置
▲CubeMX RCC设置
▲CubeMX SYS设置
▲CubeMX USART1设置
▲CubeMX 时钟树设置
3、软件设计
关于串口配置在这里不做赘述有需求的同学戳这里,实现上升沿唤醒待机模式中的MCU后使用串口发送数据。
main.c
/* USER CODE BEGIN 0 */
void Sys_Enter_Standby(void){
__HAL_RCC_PWR_CLK_ENABLE(); //使能PWR时钟
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); //清除Wake_UP标志
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN2); //设置WAKEUP用于唤醒
HAL_PWR_EnterSTANDBYMode(); //进入待机模式
}
/* USER CODE END 0 */
...
/* USER CODE BEGIN 3 */
printf("Time: 5rn");
HAL_Delay(1000);
printf("Time: 4rn");
HAL_Delay(1000);
printf("Time: 3rn");
HAL_Delay(1000);
printf("Time: 2rn");
HAL_Delay(1000);
printf("Time: 1rn");
HAL_Delay(1000);
printf("Entered Standby Mode...Please press KEY_UP to wakeup system!rn");
Sys_Enter_Standby();
函数及宏定义介绍:
HAL_PWR_EnableWakeUpPin
说明: 启用唤醒PINx功能。
参数:
WakeUpPinx: 指定要启用的电源唤醒引脚。 此参数可以是以下值之一:PWR_WAKEUP_PIN1 PWR_WAKEUP_PIN2仅在STM32F410xx/STM32F446xx/STM32F412x G上可用PWR_WAKEUP_PIN3仅在STM32F410xx/STM32F412xG设备上可用。
HAL_PWR_EnterSTANDBYMode
说明: 进入待机模式。
注意事项:
在待机模式下,所有的I/O引脚都是高阻抗的,除了:复位引脚(仍然可用)RTC_AF1引脚(PC13),如果配置为篡改、时间戳、RTC报警或RTC时钟校准。 RTC_AF2引脚(PI8),如果配置为篡改或时间戳。 WKUP引脚1(PA0)。
举报