STM32F103ZET6之待機喚醒實驗
文章目錄
前言
對於STM32的學習可分爲3個版本。
1.寄存器版本
2.庫函數版本
3.HAL庫版本
由於個人原因,選擇庫函數版本來進行STM32的學習。
提示:軟件安裝等問題,不進行講解!!!
一、簡介
很多單片機都有低功耗模式, STM32 也不例外。在系統或電源復位以後,微控制器處於運行狀態。運行狀態下的 HCLK 爲 CPU 提供時鐘,內核執行程序代碼。當 CPU 不需繼續運行時,可以利用多個低功耗模式來節省功耗,例如等待某個外部事件時。用戶需要根據最低電源消耗,最快速啓動時間和可用的喚醒源等條件,選定一個最佳的低功耗模式。
3種低功耗模式
二、待機模式配置過程
1.說明
2.相關寄存器
3.配置步驟
三、程序源碼
1.wkup.h
代碼如下:
#ifndef __WKUP_H
#define __WKUP_H
#include "sys.h"
#define WKUP_KD PAin(0) //PA0 檢測是否外部WK_UP按鍵按下
u8 Check_WKUP(void); //檢測WKUP腳的信號
void WKUP_Init(void); //PA0 WKUP喚醒初始化
void Sys_Enter_Standby(void); //系統進入待機模式
#endif
2.wkup.c
代碼如下:
#include "wkup.h"
#include "led.h"
#include "delay.h"
void Sys_Standby(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //使能PWR外設時鐘
PWR_WakeUpPinCmd(ENABLE); //使能喚醒管腳功能
PWR_EnterSTANDBYMode(); //進入待命(STANDBY)模式
}
//系統進入待機模式
void Sys_Enter_Standby(void)
{
RCC_APB2PeriphResetCmd(0X01FC,DISABLE); //復位所有IO口
Sys_Standby();
}
//檢測WKUP腳的信號
//返回值1:連續按下3s以上
// 0:錯誤的觸發
u8 Check_WKUP(void)
{
u8 t=0; //記錄按下的時間
LED0=0; //亮燈DS0
while(1)
{
if(WKUP_KD)
{
t++; //已經按下了
delay_ms(30);
if(t>=100) //按下超過3秒鐘
{
LED0=0; //點亮DS0
return 1; //按下3s以上了
}
}else
{
LED0=1;
return 0; //按下不足3秒
}
}
}
//中斷,檢測到PA0腳的一個上升沿.
//中斷線0線上的中斷檢測
void EXTI0_IRQHandler(void)
{
EXTI_ClearITPendingBit(EXTI_Line0); // 清除LINE10上的中斷標誌位
if(Check_WKUP())//關機?
{
Sys_Enter_Standby();
}
}
//PA0 WKUP喚醒初始化
void WKUP_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);//使能GPIOA和複用功能時鐘
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0; //PA.0
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPD;//上拉輸入
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化IO
//使用外部中斷方式
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //中斷線0連接GPIOA.0
EXTI_InitStructure.EXTI_Line = EXTI_Line0; //設置按鍵所有的外部線路
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //設外外部中斷模式:EXTI線路爲中斷請求
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿觸發
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); // 初始化外部中斷
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //使能按鍵所在的外部中斷通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先佔優先級2級
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //從優先級2級
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道
NVIC_Init(&NVIC_InitStructure); //根據NVIC_InitStruct中指定的參數初始化外設NVIC寄存器
if(Check_WKUP()==0) Sys_Standby(); //不是開機,進入待機模式
}
3.main.c
代碼如下:
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "wkup.h"
int main(void)
{
delay_init(); //延時函數初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置中斷優先級分組爲組2:2位搶佔優先級,2位響應優先級
uart_init(115200); //串口初始化爲115200
LED_Init(); //LED端口初始化
WKUP_Init(); //待機喚醒初始化
LCD_Init(); //LCD初始化
POINT_COLOR=RED;
LCD_ShowString(30,50,200,16,16,"Elite STM32");
LCD_ShowString(30,70,200,16,16,"WKUP TEST");
LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(30,110,200,16,16,"2015/1/14");
while(1)
{
LED0=!LED0;
delay_ms(250);
}
}
實驗結果
實驗程序較爲複雜 主要是爲了實現同個引腳PAO引腳(Wake_Up引腳),長按3秒進入待機模式,在待機模式下,長按3秒待機喚醒。
總結
1.看完視頻,一定自己寫一遍程序。
2.燒寫程序前,對程序進行分析,推理實驗現象。
3.若實驗現象與推理不一致,一定要認真分析程序。