【正点原子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

相关文章

利用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 设置子

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Kotlin 作用域函数apply、let、run、with、also使用指南

《Kotlin作用域函数apply、let、run、with、also使用指南》在Kotlin开发中,作用域函数(ScopeFunctions)是一组能让代码更简洁、更函数式的高阶函数,本文将... 目录一、引言:为什么需要作用域函数?二、作用域函China编程数详解1. apply:对象配置的 “流式构建器”最

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

Linux系统之dns域名解析全过程

《Linux系统之dns域名解析全过程》:本文主要介绍Linux系统之dns域名解析全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、dns域名解析介绍1、DNS核心概念1.1 区域 zone1.2 记录 record二、DNS服务的配置1、正向解析的配置

Linux系统中配置静态IP地址的详细步骤

《Linux系统中配置静态IP地址的详细步骤》本文详细介绍了在Linux系统中配置静态IP地址的五个步骤,包括打开终端、编辑网络配置文件、配置IP地址、保存并重启网络服务,这对于系统管理员和新手都极具... 目录步骤一:打开终端步骤二:编辑网络配置文件步骤三:配置静态IP地址步骤四:保存并关闭文件步骤五:重