STM32F103ZET6学习记录-待机唤醒

  1.      开发板相关外设 LED1、串口
  2.      原理

降低系统时钟或者关闭不使用的外设。

       分为三种模式:(从上到下,功耗越来越小)

(1)     睡眠模式(CM3内核不工作,外设仍然工作)

(2)     停止模式(所有的时钟关闭)

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

STM32F103ZET6学习记录-待机唤醒_第1张图片

3.         待机模式关闭了最多的设备。(所以功耗最小)不保存代码的执行记录,只能对芯片复位,重新检测root条件,从头开始执行程序。

STM32F103ZET6学习记录-待机唤醒_第2张图片

 

退出待机模式有上述的几种信号:

(1)     WKUP引脚的上升沿

(2)     RTC闹钟时间的上升沿

(3)     NRST引脚上的外部复位

(4)     IWDG复位信号

待机模式被唤醒之后,除了电源控制/状态寄存器,所有的寄存器都会被复位。程序重新执行,该寄存器会指示内核由待机状态退出。

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

4.  配置操作。

创建的文件夹命名为wkup,表示为这是待机唤醒的有关代码。

添加相关的编译路径。(以前的文章多次提到过,不再重复)。

之后是关于wkup源文件的书写。

先将32中有关PWR的源文件添加进来。

STM32F103ZET6学习记录-待机唤醒_第3张图片

因为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();
    }

}

 

你可能感兴趣的:(STM32学习记录)