- 开发板相关外设 LED1、串口
- 原理
降低系统时钟或者关闭不使用的外设。
分为三种模式:(从上到下,功耗越来越小)
(1) 睡眠模式(CM3内核不工作,外设仍然工作)
(2) 停止模式(所有的时钟关闭)
(3) 待机模式(1.8V的内核电源关闭)
3. 待机模式关闭了最多的设备。(所以功耗最小)不保存代码的执行记录,只能对芯片复位,重新检测root条件,从头开始执行程序。
退出待机模式有上述的几种信号:
(1) WKUP引脚的上升沿
(2) RTC闹钟时间的上升沿
(3) NRST引脚上的外部复位
(4) IWDG复位信号
待机模式被唤醒之后,除了电源控制/状态寄存器,所有的寄存器都会被复位。程序重新执行,该寄存器会指示内核由待机状态退出。
在进入待机模式后, 除了复位引脚以及被设置为防侵入或校准输出时的
TAMPER (PC13) 引脚和被使能的唤醒引脚( WK_UP 脚(PA0) ),其他的 IO 引脚都将处于高阻态。
4. 配置操作。
创建的文件夹命名为wkup,表示为这是待机唤醒的有关代码。
添加相关的编译路径。(以前的文章多次提到过,不再重复)。
之后是关于wkup源文件的书写。
先将32中有关PWR的源文件添加进来。
因为PWR挂机在APB1总线上,所以要先使能相关的PWR的时钟。
为了防止之前的程序对于PWR造成的影响,先清除一下Wake-up的标志。
因为是使用的按键唤醒,设置引脚的使能,位于pwr的头文件中,然后将其使能。
因为是待机模式,所以添加待机模式的进入函数
wkup.h
#ifndef _WKUP_H
#define _WKUP_H
#include "system.h"
void Enter_Standby_Mode(void);
#endif
wkup.c
#include "wkup.h"
void Enter_Standby_Mode(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //使能电源时钟
PWR_WakeUpPinCmd(ENABLE); //设置kup为唤醒源
PWR_ClearFlag(PWR_FLAG_WU); //清除
PWR_EnterSTANDBYMode(); //进入待机模式
}
main.c
#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "pwm.h"
#include "Usart.h"
#include "key.h"
#include "wwdg.h"
#include "wkup.h"
//普中科技STM32F103ZET6 PZ6806L开发板
/*********************************************
程序写好后,下载到开发板上,打开我们的串口调试助手,
设置波特率为9600,数据位8位,停止位1位
led1会一灭一亮,同时串口也会打印出相应的内容
之后会进入待机模式,
进入待机模式之后,按下KEY_UP则板子又会启动。
重复上述的步骤
*********************************************/
int main()
{
SysTick_Init(72);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
LED_Init();
USART1_Init(9600);
led1=0;
while(1)
{
printf("time : 5\r\n");
led1=!led1;;
delay_ms(1000);
printf("time : 4\r\n");
led1=!led1;;
delay_ms(1000);
printf("time : 3\r\n");
led1=!led1;;
delay_ms(1000);
printf("time : 2\r\n");
led1=!led1;;
delay_ms(1000);
printf("time : 1\r\n");
led1=!led1;;
delay_ms(1000);
printf("进入待机模式咯\r\n");
Enter_Standby_Mode();
}
}