OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 624|回复: 0

《M144Z-M3最小系统板使用指南——STM32F103版》第三十章 停止模式实验

[复制链接]

1117

主题

1128

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4667
金钱
4667
注册时间
2019-5-8
在线时间
1224 小时
发表于 2024-4-23 15:34:03 | 显示全部楼层 |阅读模式
本帖最后由 正点原子运营 于 2024-4-22 12:00 编辑

第三十章 停止模式实验
1)实验平台:正点原子 M144Z-M3 STM32F103最小系统板

2) 章节摘自【正点原子】M144Z-M3最小系统板使用指南——STM32F103版


4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boar ... _mini_sysboard.html

5)正点原子官方B站:https://space.bilibili.com/394620890

6)正点原子STM32技术交流QQ群:725095144

155537c2odj87vz1z9vj6l.jpg

155537nfqovl2gg9faaol9.png

本章介绍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库中对应的驱动函数如下:
①:进入停止模式
该函数用于进入停止模式,其函数原型如下所示:
  1. voidHAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry);
复制代码
该函数的形参描述,如下表所示:
QQ截图20240422115935.png
表30.2.1.1 函数HAL_PWR_EnterSTOPMode()形参描述
该函数的返回值描述,如下表所示:
QQ截图20240422115945.png
表30.2.1.2 函数HAL_PWR_EnterSTOPMode()返回值描述
该函数的使用示例,如下所示:
  1. #include "stm32f1xx_hal.h"
  2. void example_fun(void)
  3. {
  4.     /* 进入停止模式*/
  5.     HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
  6. }
复制代码

30.2.2 PWR驱动
本章实验的PWR驱动主要负责向应用层提供停止模式唤醒按键的初始化和进入停止模式的函数,同时实现唤醒按键的中断回调函数。本章实验中,PWR的驱动代码包括pwr.c和pwr.h两个文件。
因为本章实验中停止模式的唤醒方式与上一章实验中睡眠模式的唤醒方式一致,都是可以由任意的中断唤醒,且均使用了WKUP按键的外部中断进行唤醒,因此本章实验中停止模式唤醒按键的相关宏定义、停止模式唤醒按键的初始化及其中断回调函数均与上一章实验一致,因此请读者自行查看上一章中的相关内容。
PWR驱动中,进入睡眠模式的函数,如下所示:
  1. /**
  2. *@brief   进入停止模式
  3. *@param   无
  4. *@retval  无
  5. */
  6. voidpwr_enter_stop(void)
  7. {
  8.    GPIO_InitTypeDef gpio_init_struct = {0};
  9.    
  10.    __HAL_RCC_PWR_CLK_ENABLE();
  11.    PWR_WKUP_INT_GPIO_CLK_ENABLE();
  12.    
  13.    HAL_NVIC_SetPriority(PWR_WKUP_INT_IRQn, 0, 0);
  14.    HAL_NVIC_EnableIRQ(PWR_WKUP_INT_IRQn);
  15.    
  16.     /* 配置唤醒引脚 */
  17.    gpio_init_struct.Pin = PWR_WKUP_INT_GPIO_PIN;
  18.    gpio_init_struct.Mode = GPIO_MODE_IT_RISING;
  19.    gpio_init_struct.Pull = GPIO_PULLDOWN;
  20.    gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;
  21.    HAL_GPIO_Init(PWR_WKUP_INT_GPIO_PORT, &gpio_init_struct);
  22.    
  23.     /* 关闭SysTick中断 */
  24.    SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk;
  25.    
  26.     /* 进入停止模式 */
  27.    HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
  28. }
复制代码
从上面的代码中可以看出,该函数调用了函数HAL_PWR_EnterSTOPMode()以WFI方式进入停止模式,接下来MCU便会进入停止模式,等待任意的中断唤醒,因此在执行此函数前,需要先关闭部分中断,以免误唤醒。

30.2.3 实验应用代码
本章实验的应用代码,如下所示:
  1. int main(void)
  2. {
  3.     uint8_t t = 0;
  4.     uint8_t key;
  5.    
  6.    HAL_Init();                         /* 初始化HAL库 */
  7.    sys_stm32_clock_init(RCC_PLL_MUL9); /* 配置时钟,72MHz */
  8.    delay_init(72);                     /* 初始化延时 */
  9.    usart_init(115200);                 /* 初始化串口 */
  10.    led_init();                         /* 初始化LED */
  11.    key_init();                         /* 初始化按键 */
  12.    lcd_init();                         /* 初始化LCD */
  13.    
  14.    lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);
  15.    lcd_show_string(30, 70, 200, 16, 16, "STOPTEST", RED);
  16.    lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
  17.    
  18.    lcd_show_string(30, 110, 200, 16, 16, "KEY0:EnterSTOP MODE", RED);
  19.    lcd_show_string(30, 130, 200, 16, 16, "KEY_UP:ExitSTOP MODE", RED);
  20.    
  21.     while (1)
  22.     {
  23.          key = key_scan(0);
  24.          if (key == KEY0_PRES)
  25.          {
  26.              /* 按下KEY0按键,开启LED1后进入停止模式 */
  27.              LED1(0);
  28.              pwr_enter_stop();
  29.              sys_stm32_clock_init(336, 8, 2, 7);
  30.              LED1(1);
  31.          }
  32.          
  33.          if (++t == 20)
  34.          {
  35.              t = 0;
  36.              LED0_TOGGLE();
  37.          }
  38.          
  39.          delay_ms(10);
  40.     }
  41. }
复制代码
从上面的代码中可以看出,在完成相关的初始化操作后,便不断地扫描按键,若扫描到KEY0按键被按下,则会点亮LED1后进入停止模式,此时所有的时钟将会停止,从该停止模式唤醒需要有任意的中断产生,因此可以由WKUP按键产生外部中断来唤醒停止模式。退出停止模式后,LED1将被熄灭。

30.3 下载验证
在完成编译和烧录操作后,可以看到LED0闪烁提示系统正在运行,此时可以按下KEY0按按键,可以看到LED1亮起,但LED0不再闪烁,这是因为系统已经进入停止模式了,此时再按下WKUP按键,即可从停止模式下唤醒,可以看到LED1熄灭,LED0继续闪烁。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 01:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表