【普中STM32精灵开发攻略】--第 29 章 待机唤醒实验

(1)实验平台:

普中STM32精灵开发板​https://item.taobao.com/item.htm?id=739076227953(2)资料下载:普中科技-各型号产品资料下载链接


        这一章我们来学习下 STM32 的待机唤醒功能。本章要实现的功能是:系统运行时 D2 指示灯闪烁,5 秒后进入待机模式,D2 指示灯熄灭,同时串口printf输出相关提示信息,可通过 PA0 引脚输入高电平实现唤醒。学习本章可以参考《STM32F10x 中文参考手册》-4 电源控制器(PWR)章节。本章分为如下几部分内容:

 

29.1 STM32 待机模式介绍

29.1.1 STM32 低功耗模式介绍

29.2 待机模式配置步骤

29.3 硬件设计

29.4 软件设计

29.4.1 待机模式配置函数

29.4.2 主函数

29.5 实验现象


29.1 STM32 待机模式介绍

29.1.1 STM32 低功耗模式介绍

        很多单片机具有低功耗模式,比如 MSP430、STM8L 等,我们的STM32 也不例外。默认情况下,系统复位或上电复位后,微控制器进入运行模式。在运行模式下,HCLK 为 CPU 提供时钟,并执行程序代码。当 CPU 不需继续运行(例如等待外部事件)时,可以利用多种低功耗模式来节省功耗。用户需要根据最低电源消耗、最快速启动时间和可用的唤醒源等条件,选定一个最佳的低功耗模式。

        当然在运行模式下,也可以通过如下方式降低功耗:

        ①降低系统时钟速度

        ②不使用 APBx 和 AHB 外设时,将对应的外设时钟关闭

        STM32 提供了 3 种低功耗模式,以达到不同层次的降低功耗的目的,这三种模式如下:

        ①睡眠模式(CM3 内核停止工作,外设仍在运行)

        ②停止模式(所有时钟都停止)

        ③待机模式(1.8V 内核电源关闭)

        这三种模式所需的功耗是逐级递减,也就是说待机模式功耗是最低的。三种低功耗模式汇总表如下图所示:

        本章我们仅对 STM32 的待机模式进行介绍,其他2 种模式可以参考《STM32F10x 中文参考手册》-4 电源控制器(PWR)章节,里面有详细的介绍。

        (1)待机模式

        在睡眠模式中,仅关闭了内核时钟,内核停止运行,但其片上外设,CM3核心的外设全都照常运行。在停止模式中,进一步关闭了其它所有的时钟,于是所有的外设都停止了工作,但由于其 1.8V 区域的部分电源没有关闭,还保留了内核的寄存器、内存的信息,所以从停止模式唤醒,并重新开启时钟后,还可以从上次停止处继续执行代码。在待机模式中,它除了关闭所有的时钟,还把1.8V区域的电源也完全关闭了,也就是说,从待机模式唤醒后,由于没有之前代码的运行记录,只能对芯片复位,重新检测 BOOT 条件,从头开始执行程序。那么我们如何进入待机模式呢?其实很简单,只要按下图所示的步骤执行就可以了。

        图中还列出了退出待机模式的操作,当检测到外部复位(NRST 引脚)、IWDG复位、 WKUP 引脚上升沿、 RTC 闹钟事件的上升沿时,微控制器退出待机模式。本章我们是通过 WKUP 引脚(PA0)上升沿来退出待机模式,当然也可以直接通过芯片复位管脚 NRST 退出。

        从待机模式唤醒后,除了电源控制/状态寄存器(PWR_CSR),所有的寄存器豆被复位,程序将按照复位(启动引脚采样、复位向量已获取等)后的方式重新执行。电源控制/状态寄存器(PWR_CSR)将会指示内核由待机状态退出。

        在进入待机模式后,除了复位引脚以及被设置为防侵入或校准输出时的TAMPER (PC13)引脚和被使能的唤醒引脚( WK_UP 脚(PA0)),其他的IO引脚都将处于高阻态。

         由于篇幅限制,本章并没有对待机模式相关寄存器进行介绍,大家可以参考《STM32F10x 中文参考手册》-4 电源控制器(PWR)章节,里面有详细的讲解。如果看不懂的可以暂时放下,因为我们使用的是库函数开发。

29.2 待机模式配置步骤

        接下来我们介绍下如何使用库函数进入和退出待机模式。这个也是在编写程序中必须要了解的。具体步骤如下:(电源管理相关库函数在stm32f10x_pwr.c和 stm32f10x_pwr.h 文件中)

        (1)使能电源时钟

        因为低功耗模式是通过 STM32 电源(PWR)系统进行管理的,所以需要使能电源时钟,调用的库函数为:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//使能PWR 外设时钟

        (2)设置 WK_UP 引脚为唤醒源

        待机唤醒方式有很多种,我们选择 WK_UP 引脚(PA0)上升沿来退出待机模式。在库函数中,设置使能 WK_UP 用于唤醒 CPU 待机模式的函数是:

PWR_WakeUpPinCmd(ENABLE);

        可以使用一根导线将 PA0 引脚和电源 3.3V 来退出待机模式。

        (3)进入待机模式

        进入待机模式,首先要设置 SLEEPDEEP 位( 详见《Cortex M3 权威指南(中文)》,chpt13 Cortex-M3 的其它特性--电源管理章节),接着我们通过PWR_CR设置 PDDS 位,使得 CPU 进入深度睡眠时进入待机模式,最后执行WFI 指令开始进入待机模式,并等待 WK_UP 中断的到来。整个操作可以通过一个库函数完成,如下:

PWR_EnterSTANDBYMode();//进入待机模式

        通常在进入待机模式前,我们会清除唤醒标志,以等待下次进入。清除唤醒标志库函数为:

PWR_ClearFlag(PWR_FLAG_WU);//清除 Wake-up 标志

        以上几步全部配置好后,我们就可以正常进入待机模式了,并且可以通过按键 KEY_UP 或者复位按键唤醒。

        特别提醒下,如果学到 RTC 实时时钟实验的时候,需要进入待机模式,如果使能了 RTC 闹钟中断的时候,进入待机模式前,必须按如下操作处理:

        1.禁止 RTC 中断( ALRAIE、 ALRBIE、 WUTIE、TAMPIE 和TSIE 等)。

        2.清零对应中断标志位。

        3.清除 PWR 唤醒(WUF)标志(通过设置 PWR_CR 的CWUF 位实现)。

        4.重新使能 RTC 对应中断。

        5.进入低功耗模式。

29.3 硬件设计

        本实验使用到硬件资源如下:

        (1)LED 指示灯

        (2)串口 1

        LED 指示灯、串口 1 电路在前面章节都介绍过,这里不多说。LED 指示灯用来提示系统正常运行,使用一根导线将 PA0 引脚和电源3.3V 触碰一下用来唤醒待机模式,串口 1 用来输出提示信息。

29.4 软件设计

        本章所要实现的功能是:系统运行时 D2 指示灯闪烁,5 秒后进入待机模式,D2 指示灯熄灭,同时串口 printf 输出相关提示信息,通过根导线将PA0 引脚和电源 3.3V 触碰一下用来唤醒。程序框架如下:

        (1)配置进入与退出待机模式

        (2)编写主函数

        前面介绍待机模式配置步骤时,就已经讲解如何配置。下面我们打开“\4--实验程序\1--基础实验\24-待机唤醒实验”工程,在 APP 工程组中可以看到添加了 wkup.c 文件(里面包含了待机模式驱动程序),在StdPeriph_Driver 工程组中添加了 stm32f10x_pwr.c 库文件。电源系统管理相关操作的库函数都放在stm32f10x_pwr.c 和 stm32f10x_pwr.h 文件中,所以使用到电源系统管理就必须加入 stm32f10x_pwr.c 文件,同时还要包含对应的头文件路径。

        这里我们分析几个重要函数,其他部分程序大家可以打开工程查看。

29.4.1 待机模式配置函数

        要让系统进入待机模式,我们必须对它进行配置。进入待机模式代码如下:

/*******************************************************************************
* 函 数 名         : Enter_Standby_Mode
* 函数功能		   : 进入待机模式
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Enter_Standby_Mode(void)
{	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//使能PWR外设时钟
	
	PWR_ClearFlag(PWR_FLAG_WU);//清除Wake-up 标志
	
	PWR_WakeUpPinCmd(ENABLE);//使能唤醒管脚	使能或者失能唤醒管脚功能

	PWR_EnterSTANDBYMode();//进入待机模式
}

        该函数首先使能电源 PWR 时钟,然后清除唤醒标志位,并使能WK_UP 管脚为唤醒方式,最后进入待机模式。这一过程在前面步骤介绍中已经提了。

29.4.2 主函数

        配置待机模式后,我们就可以编写主函数,代码如下:

#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "usart.h"
#include "wkup.h"


int main()
{
	SysTick_Init(72);
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组分2组
	USART1_Init(115200);
	LED_Init();

	while(1)
	{	
		printf("time: 5\r\n");
		LED0=0;
		delay_ms(1000);	//隔1秒显示计数
		
		printf("time: 4\r\n");
		LED0=1;
		delay_ms(1000);
		
		printf("time: 3\r\n");
		LED0=0;
		delay_ms(1000);
		
		printf("time: 2\r\n");
		LED0=1;
		delay_ms(1000);
		
		printf("time: 1\r\n");
		LED0=0;
		delay_ms(1000);
		
		printf("进入系统待机模式\r\n");
		Enter_Standby_Mode();
	}
}

        主函数实现的功能很简单,首先调用之前编写好的硬件初始化函数,包括SysTick 系统时钟,中断分组,LED 初始化等。然后进入while 循环,每间隔一秒让 printf 输出一个信息,同时指示灯状态发生变化。倒计5 秒钟后,调用函数 Enter_Standby_Mode 进入待机模式,此时指示灯熄灭。

29.5 实验现象

        将工程程序编译后下载到开发板内,可以看到系统运行时D2 指示灯不断闪烁,5 秒钟后进入待机模式,此时 D2 指示灯熄灭。当使用一根导线将PA0 引脚和电源 3.3V 触碰一下用来唤醒待机模式,待机模式被唤醒,系统重新运行,同时串口打印提示信息。如果想在串口调试助手上看到输出信息,可以打开“\5--开发工具\4-常用辅助开发软件\串口调试助手\串口调试助手(丁丁)”内串口调试助手,按下开发板上复位按钮,实验现象如下:(前提一定要连接好线路,USB 线一端连接电脑,另一端连接开发板“USB 转串口模块”上的USB 下载口,并且在“USB 转 TTL&电源”模块上 P4 端子短接片已插上

        实验说明:下载待机唤醒实验程序后,若使用普中ARM 仿真器下载其他的程序会出现报警,这是因为处于低功耗模式时,所有外设时钟都已关闭,所以需要在下载程序前先复位下系统。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值