本帖最后由 正点原子运营 于 2024-4-23 15:39 编辑
1)实验平台:正点原子 M144Z-M3 STM32F103最小系统板
2) 章节摘自【正点原子】M144Z-M3最小系统板使用指南——STM32F103版
6)正点原子STM32技术交流QQ群:725095144
本章介绍STM32F103低功耗模式中的待机模式,进入待机模式后,MCU内部的电压调压器将断开1.3V电源域的电源,这意味着内核和外设都将停止工作,并且内核寄存器和内存中的数据都将丢失,但这也是功耗最低的模式,待机模式下可被WKUP引脚的上升沿唤醒。通过本章的学习,读者将学习到低功耗模式下待机模式的使用。 本章分为如下几个小节: 31.1 硬件设计 31.2 程序设计 31.3 下载验证
31.1 硬件设计 31.1.1 例程功能 1. TFTLCD上显示实验信息 2. LED0闪烁时,按下KEY0按键后,MCU进入待机模式 3. MCU进入待机模式后,按下WKUP按键,MCU重新运行
31.1.2 硬件资源 1. LED LED0 - PB5 LED1 - PE5 2. 正点原子 2.8/3.5/4.3/7/10寸TFTLCD模块 3. 按键 WKUP - PA0 KEY0 - PE4
31.1.3原理图 本章实验介绍STM32F103低功耗模式中的待机模式,不涉及连接原理图。
31.2 程序设计 31.2.1 HAL库的PWR驱动 本实验配置了WKUP按键(连接至WKUP引脚)唤醒待机模式,因此具体的配置步骤如下: ①:使能WKUP引脚功能 ②:进入待机模式 在HAL库中对应的驱动函数如下: ①:使能WKUP引脚功能 该函数用于使能WKUP引脚功能,其函数原型如下所示: - voidHAL_PWR_EnableWakeUpPin(uint32_t WakeUpPinx);
复制代码该函数的形参描述,如下表所示: 表31.2.1.1 函数HAL_PWR_EnableWakeUpPin()形参描述 该函数的返回值描述,如下表所示: 表31.2.1.2 函数HAL_PWR_EnableWakeUpPin()返回值描述 该函数的使用示例,如下所示: - #include "stm32f1xx_hal.h"
- void example_fun(void)
- {
- /* 使能WKUP引脚功能 */
- HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
- }
复制代码②:进入待机模式 该函数用于进入待机模式,其函数原型如下所示: - voidHAL_PWR_EnterSTANDBYMode(void);
复制代码该函数的形参描述,如下表所示: 表31.2.1.3 函数HAL_PWR_EnterSTANDBYMode()形参描述 该函数的返回值描述,如下表所示: 表31.2.1.4 函数HAL_PWR_EnterSTANDBYMode()返回值描述 该函数的使用示例,如下所示: - #include "stm32f1xx_hal.h"
- void example_fun(void)
- {
- /* 进入待机模式 */
- HAL_PWR_EnterSTANDBYMode();
- }
复制代码
31.2.2 PWR驱动 本章实验的PWR驱动主要负责向应用层提供进入待机模式的函数。本章实验中,PWR的驱动代码包括pwr.c和pwr.h两个文件。 PWR驱动中,进入待机模式的函数,如下所示: - /**
- *@brief 进入待机模式
- *@param 无
- *@retval 无
- */
- voidpwr_enter_standby(void)
- {
- __HAL_RCC_PWR_CLK_ENABLE();
-
- /* 配置唤醒引脚 */
- HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
- __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
-
- /* 进入待机模式 */
- HAL_PWR_EnterSTANDBYMode();
- }
复制代码从上面的代码中可以看出,在进入待机模式前使能了WKUP引脚功能,最后调用函数HAL_PWR_EnterSTANDBYMode()进入待机模式。
31.2.3 实验应用代码 本章实验的应用代码,如下所示: int main(void) - {
- uint8_t t = 0;
- uint8_t key;
-
- HAL_Init(); /* 初始化HAL库 */
- sys_stm32_clock_init(RCC_PLL_MUL9); /* 配置时钟,72MHz */
- delay_init(72); /* 初始化延时 */
- usart_init(115200); /* 初始化串口 */
- led_init(); /* 初始化LED */
- key_init(); /* 初始化按键 */
- lcd_init(); /* 初始化LCD */
-
- lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);
- lcd_show_string(30, 70, 200, 16, 16, "STANDBYTEST", RED);
- lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
-
- lcd_show_string(30, 110, 200, 16, 16, "KEY0:EnterSTANDBY MODE", RED);
- lcd_show_string(30, 130, 200, 16, 16, "KEY_UP:ExitSTANDBY MODE", RED);
-
- while (1)
- {
- key = key_scan(0);
- if (key == KEY0_PRES)
- {
- /* 按下KEY0按键,进入待机模式 */
- pwr_enter_standby();
- }
-
- if (++t == 20)
- {
- t = 0;
- LED0_TOGGLE();
- }
-
- delay_ms(10);
- }
- }
复制代码从上面的代码中可以看出,在完成相关的初始化操作后,便不断地扫描按键,若扫描到KEY0按键被按下,则会进入待机模式,进入待机模式后LED0便不再闪烁,说明此时程序已经停止运行,进入了待机模式,此时可以按下WKUP按键进行待机模式唤醒,随后便可看到LED0恢复闪烁,说明程序再次运行。
31.3 下载验证 在完成编译和烧录操作后,可以看到LED0闪烁提示系统正在运行,此时可以按下KEY0按按键,可以看到LED0不再闪烁,这是因为系统已经进入待机模式了,此时再按下WKUP按键,即可从待机模式下唤醒,可以看到LED0继续闪烁。 |