【正点原子STM32连载】 第二十九章 睡眠模式实验 摘自【正点原子】APM32E103最小系统板使用指南

本文主要是介绍【正点原子STM32连载】 第二十九章 睡眠模式实验 摘自【正点原子】APM32E103最小系统板使用指南,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1)实验平台:正点原子APM32E103最小系统板
2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban

第二十九章 睡眠模式实验

本章介绍APM32E103低功耗模式中的睡眠模式,通过调用WFI命令进入睡眠模式后,ARM Corten-M3内核将停止以降低功耗,在该睡眠模式下可以被任意中断唤醒。通过本章的学习,读者将学习到低功耗模式中睡眠模式的使用。
本章分为如下几个小节:
29.1 硬件设计
29.2 程序设计
29.3 下载验证

29.1 硬件设计
29.1.1 例程功能

  1. 按下KEY0按键,点亮LED1并进入睡眠模式,按下KEY_UP按键,退出睡眠模式并熄灭LED1
  2. LED0闪烁,指示程序正在运行
    29.1.2 硬件资源
  3. LED
    LED0 - PB5
    LED1 - PE5
  4. 按键
    KEY0 - PE4
    KEY_UP - PA0
  5. 正点原子 2.8/3.5/4.3/7/10寸TFTLCD模块(仅限MCU屏,16位8080并口驱动)
    29.1.3 原理图
    本章实验介绍APM32E103低功耗模式中的睡眠模式,不涉及连接原理图。
    29.2 程序设计
    29.2.1 PMU驱动
    本章实验的PMU驱动主要负责向应用层提供睡眠模式唤醒按键的初始化和进入睡眠模式的函数,同时实现唤醒按键的中断回调函数。本章实验中,PMU的驱动代码主要包括pmu.c和pmu.h两个文件。
    PMU驱动中,睡眠模式唤醒按键的相关宏定义,如下所示:
    /* 模式唤醒引脚定义 */
#define PMU_WKUP_GPIO_PORT          GPIOA
#define PMU_WKUP_GPIO_PIN           GPIO_PIN_0
#define PMU_WKUP_GPIO_CLK_ENABLE()  do{ RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA); }while(0)
#define PMU_WKUP_INT_IRQn           EINT0_IRQn
#define PMU_WKUP_INT_IRQHandler     EINT0_IRQHandler
PMU驱动中,睡眠模式唤醒按键的初始化函数,如下所示:
/*** @brief       初始化唤醒按键* @param       无* @retval      无*/
void pmu_wkup_key_init(void)
{GPIO_Config_T gpio_init_struct;EINT_Config_T eint_init_struct;PMU_WKUP_GPIO_CLK_ENABLE();                          /* 使能唤醒引脚端口时钟 */RCM_EnableAPB2PeriphClock(RCM_APB1_PERIPH_PMU);      /* 使能PMU时钟 */gpio_init_struct.pin = PMU_WKUP_GPIO_PIN;            /* 唤醒引脚 */gpio_init_struct.mode = GPIO_MODE_IN_PD;             /* 输入模式 */GPIO_Config(PMU_WKUP_GPIO_PORT, &gpio_init_struct);  /* 配置唤醒引脚 */eint_init_struct.line=(EINT_LINE_T)PMU_WKUP_GPIO_PIN;/* EINT线 */eint_init_struct.mode=EINT_MODE_INTERRUPT;           /* 中断模式 */eint_init_struct.trigger=EINT_TRIGGER_RISING;        /* 上升沿 */eint_init_struct.lineCmd=ENABLE;                     /* 使能 */EINT_Config(&eint_init_struct);                      /* 配置EINT */NVIC_EnableIRQRequest(PMU_WKUP_INT_IRQn, 2, 0);      /* 使能中断 */
}

因为调用WFI命令进入睡眠模式后,能够被任意的中断唤醒,因此睡眠模式唤醒按键的初始化只需要配置好按键的外部中断即可。
PMU驱动中,睡眠模式唤醒按键对应的中断回调函数,如下所示:

/*** @brief       唤醒引脚外部中断服务函数* @param       无* @retval      无*/
void PMU_WKUP_INT_IRQHandler(void)
{   
/* 判断唤醒引脚事件线中断标志 */if (EINT_ReadIntFlag((EINT_LINE_T)PMU_WKUP_GPIO_PIN) == SET)
{  
/* 清除唤醒引脚事件线中断标志 */EINT_ClearIntFlag((EINT_LINE_T)PMU_WKUP_GPIO_PIN);}
}
因为睡眠唤醒按键的中断只是为了唤醒睡眠模式,因此并不需要在中断回调函数中做任何处理。
PMU驱动中,进入睡眠模式的函数,如下所示:
/*** @brief       进入睡眠模式* @param       无* @retval      无*/
void pmu_enter_sleep(void)
{   
/* 禁用SysTick的中断,防止SysTick中断唤醒 */SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk;
NVIC_ResetystemLowPower(NVIC_LOWPOWER_SLEEPDEEP);   /* 配置为睡眠模式 */
/* 指令WFI,进入睡眠模式,等待任意中断唤醒 */__WFI();SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk;          /* 使能SysTick中断 */
}

从上面的代码中可以看出,进入睡眠模式主要就是执行WFI命令,接下来MCU便会进入睡眠模式,等待任意的中断唤醒,因此在执行WFI命令之前,需要先关闭部分中断,以免误唤醒。
29.2.2 实验应用代码
本实验的应用代码,如下所示:

int main(void)
{uint8_t key;uint8_t t = 0;NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_4);/* 设置中断优先级分组为组4 */sys_apm32_clock_init(15);                       /* 配置系统时钟 */delay_init(120);                                /* 初始化延时功能 */usart_init(115200);                             /* 初始化串口 */led_init();                                     /* 初始化LED */lcd_init();                                     /* 初始化LCD */key_init();                                     /* 初始化按键 */pmu_wkup_key_init();                            /* 初始化唤醒按键 */lcd_show_string(30, 50, 200, 16, 16, "APM32", RED);lcd_show_string(30, 70, 200, 16, 16, "SLEEP TEST", RED);lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);lcd_show_string(30, 110, 200, 16, 16, "KEY0:Enter SLEEP MODE", RED);lcd_show_string(30, 130, 200, 16, 16, "KEY_UP:Exit SLEEP MODE", RED);while (1){key = key_scan(0);if (key == KEY0_PRES){LED1(0);                               /* 点亮LED1,提示进入睡眠模式 */pmu_enter_sleep();                     /* 进入睡眠模式 */LED1(1);                               /* 熄灭LED1,提示退出睡眠模式 */}if ((t % 20) == 0){LED0_TOGGLE();}t++;delay_ms(10);}
}

从上面的代码中可以看出,在完成相关的初始化操作后,并不断地扫描按键,若扫描到KEY0按键被按下,则会点亮LED1后进入睡眠模式,此时ARM Cortex-M3内核便停止了,从该睡眠模式唤醒需要有任意的中断产生,因此可以由KEY_UP按键产生外部中断来唤醒睡眠。退出睡眠模式后,LED1将被熄灭。
29.3 下载验证
在完成编译和烧录操作后,可以看到LED0闪烁提示系统程序正在运行,此时可以按下KEY0按键,可以看到LED1亮起,但LED0不再闪烁,这是因为系统已经进入睡眠模式了,此时再按下KEY_UP按键,即可从睡眠模式下唤醒,可以看到LED1熄灭,LED0继续闪烁。

这篇关于【正点原子STM32连载】 第二十九章 睡眠模式实验 摘自【正点原子】APM32E103最小系统板使用指南的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/599279

相关文章

一文带你搞懂Redis Stream的6种消息处理模式

《一文带你搞懂RedisStream的6种消息处理模式》Redis5.0版本引入的Stream数据类型,为Redis生态带来了强大而灵活的消息队列功能,本文将为大家详细介绍RedisStream的6... 目录1. 简单消费模式(Simple Consumption)基本概念核心命令实现示例使用场景优缺点2

Windows系统宽带限制如何解除?

《Windows系统宽带限制如何解除?》有不少用户反映电脑网速慢得情况,可能是宽带速度被限制的原因,只需解除限制即可,具体该如何操作呢?本文就跟大家一起来看看Windows系统解除网络限制的操作方法吧... 有不少用户反映电脑网速慢得情况,可能是宽带速度被限制的原因,只需解除限制即可,具体该如何操作呢?本文

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

电脑找不到mfc90u.dll文件怎么办? 系统报错mfc90u.dll丢失修复的5种方案

《电脑找不到mfc90u.dll文件怎么办?系统报错mfc90u.dll丢失修复的5种方案》在我们日常使用电脑的过程中,可能会遇到一些软件或系统错误,其中之一就是mfc90u.dll丢失,那么,mf... 在大部分情况下出现我们运行或安装软件,游戏出现提示丢失某些DLL文件或OCX文件的原因可能是原始安装包

电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案

《电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案》最近有不少兄弟反映,电脑突然弹出“mfc100u.dll已加载,但找不到入口点”的错误提示,导致一些程序无法正... 在计算机使用过程中,我们经常会遇到一些错误提示,其中最常见的就是“找不到指定的模块”或“缺少某个DL

Nginx location匹配模式与规则详解

《Nginxlocation匹配模式与规则详解》:本文主要介绍Nginxlocation匹配模式与规则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、环境二、匹配模式1. 精准模式2. 前缀模式(不继续匹配正则)3. 前缀模式(继续匹配正则)4. 正则模式(大

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Python Websockets库的使用指南

《PythonWebsockets库的使用指南》pythonwebsockets库是一个用于创建WebSocket服务器和客户端的Python库,它提供了一种简单的方式来实现实时通信,支持异步和同步... 目录一、WebSocket 简介二、python 的 websockets 库安装三、完整代码示例1.

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子