本帖最后由 正点原子运营 于 2024-4-22 12:00 编辑
1)实验平台:正点原子 M144Z-M3 STM32F103最小系统板
2) 章节摘自【正点原子】M144Z-M3最小系统板使用指南——STM32F103版
6)正点原子STM32技术交流QQ群:725095144
本章介绍STM32F103低功耗模式中的停止模式,进入停止模式后,所有的时钟都将被停止以降低功耗,在停止模式下可以被任意中断唤醒。通过本章的学习,读者将学习到低功耗模式中停止模式的使用。 本章分为如下几个小节: 30.1 硬件设计 30.2 程序设计 30.3 下载验证
30.1 硬件设计 30.1.1 例程功能 1. TFTLCD上显示实验信息 2. LED0闪烁时,按下KEY0按键后,LED1亮起,LED0停止闪烁 3. LED0停止闪烁时,按下WKUP按键后,LED1熄灭,LED0闪烁
30.1.2硬件资源 1. LED LED0 - PB5 LED1 - PE5 2. 正点原子 2.8/3.5/4.3/7/10寸TFTLCD模块 3. 按键 WKUP - PA0 KEY0 - PE4
30.1.3原理图 本章实验介绍STM32F103低功耗模式中的停止模式,不涉及连接原理图。
30.2 程序设计 30.2.1 HAL库的PWR驱动 HAL库中提供了配置进入停止模式的驱动函数,其配置步骤如下: ①:进入停止模式 在HAL库中对应的驱动函数如下: ①:进入停止模式 该函数用于进入停止模式,其函数原型如下所示: - voidHAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry);
复制代码该函数的形参描述,如下表所示: 表30.2.1.1 函数HAL_PWR_EnterSTOPMode()形参描述 该函数的返回值描述,如下表所示: 表30.2.1.2 函数HAL_PWR_EnterSTOPMode()返回值描述 该函数的使用示例,如下所示: - #include "stm32f1xx_hal.h"
- void example_fun(void)
- {
- /* 进入停止模式*/
- HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
- }
复制代码
30.2.2 PWR驱动 本章实验的PWR驱动主要负责向应用层提供停止模式唤醒按键的初始化和进入停止模式的函数,同时实现唤醒按键的中断回调函数。本章实验中,PWR的驱动代码包括pwr.c和pwr.h两个文件。 因为本章实验中停止模式的唤醒方式与上一章实验中睡眠模式的唤醒方式一致,都是可以由任意的中断唤醒,且均使用了WKUP按键的外部中断进行唤醒,因此本章实验中停止模式唤醒按键的相关宏定义、停止模式唤醒按键的初始化及其中断回调函数均与上一章实验一致,因此请读者自行查看上一章中的相关内容。 PWR驱动中,进入睡眠模式的函数,如下所示: - /**
- *@brief 进入停止模式
- *@param 无
- *@retval 无
- */
- voidpwr_enter_stop(void)
- {
- GPIO_InitTypeDef gpio_init_struct = {0};
-
- __HAL_RCC_PWR_CLK_ENABLE();
- PWR_WKUP_INT_GPIO_CLK_ENABLE();
-
- HAL_NVIC_SetPriority(PWR_WKUP_INT_IRQn, 0, 0);
- HAL_NVIC_EnableIRQ(PWR_WKUP_INT_IRQn);
-
- /* 配置唤醒引脚 */
- gpio_init_struct.Pin = PWR_WKUP_INT_GPIO_PIN;
- gpio_init_struct.Mode = GPIO_MODE_IT_RISING;
- gpio_init_struct.Pull = GPIO_PULLDOWN;
- gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;
- HAL_GPIO_Init(PWR_WKUP_INT_GPIO_PORT, &gpio_init_struct);
-
- /* 关闭SysTick中断 */
- SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk;
-
- /* 进入停止模式 */
- HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
- }
复制代码从上面的代码中可以看出,该函数调用了函数HAL_PWR_EnterSTOPMode()以WFI方式进入停止模式,接下来MCU便会进入停止模式,等待任意的中断唤醒,因此在执行此函数前,需要先关闭部分中断,以免误唤醒。
30.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, "STOPTEST", RED);
- lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
-
- lcd_show_string(30, 110, 200, 16, 16, "KEY0:EnterSTOP MODE", RED);
- lcd_show_string(30, 130, 200, 16, 16, "KEY_UP:ExitSTOP MODE", RED);
-
- while (1)
- {
- key = key_scan(0);
- if (key == KEY0_PRES)
- {
- /* 按下KEY0按键,开启LED1后进入停止模式 */
- LED1(0);
- pwr_enter_stop();
- sys_stm32_clock_init(336, 8, 2, 7);
- LED1(1);
- }
-
- if (++t == 20)
- {
- t = 0;
- LED0_TOGGLE();
- }
-
- delay_ms(10);
- }
- }
复制代码从上面的代码中可以看出,在完成相关的初始化操作后,便不断地扫描按键,若扫描到KEY0按键被按下,则会点亮LED1后进入停止模式,此时所有的时钟将会停止,从该停止模式唤醒需要有任意的中断产生,因此可以由WKUP按键产生外部中断来唤醒停止模式。退出停止模式后,LED1将被熄灭。
30.3 下载验证 在完成编译和烧录操作后,可以看到LED0闪烁提示系统正在运行,此时可以按下KEY0按按键,可以看到LED1亮起,但LED0不再闪烁,这是因为系统已经进入停止模式了,此时再按下WKUP按键,即可从停止模式下唤醒,可以看到LED1熄灭,LED0继续闪烁。 |