日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【STM32】待机唤醒程序示例

發(fā)布時間:2024/4/24 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【STM32】待机唤醒程序示例 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

00. 目錄

文章目錄

    • 00. 目錄
    • 01. 待機模式簡介
    • 02. 硬件模塊
    • 03. 相關函數(shù)
    • 04. 程序示例一
    • 05. 程序示例二
    • 06. 附錄
    • 07. 聲明

01. 待機模式簡介

很多單片機都有低功耗模式,STM32F4 也不例外。在系統(tǒng)或電源復位以后,微控制器處于運行狀態(tài)。運行狀態(tài)下的 HCLK 為 CPU 提供時鐘,內(nèi)核執(zhí)行程序代碼。當 CPU 不需繼續(xù)運行時,可以利用多個低功耗模式來節(jié)省功耗,例如等待某個外部事件時。用戶需要根據(jù)最低電源消耗,最快速啟動時間和可用的喚醒源等條件,選定一個最佳的低功耗模式。STM32F4 的 3 種低功耗模式我們在 5.2.4 節(jié)有粗略介紹,這里我們再回顧一下。
STM32F4 提供了 3 種低功耗模式,以達到不同層次的降低功耗的目的,這三種模式如下:
1)睡眠模式(CM4 內(nèi)核停止工作,外設仍在運行);
2)停止模式(所有的時鐘都停止);
3)待機模式;

02. 硬件模塊

用到的硬件資源有:
1) 指示燈 DS0
2) KEY_UP 按鍵
3) TFTLCD 模塊

03. 相關函數(shù)

stm32f4xx_pwr.c / stm32f4xx_pwr.h

void PWR_EnterSTOPMode();//進入停機模式 void PWR_EnterSTANDBYMode(void);//進入待機模式 void PWR_WakeUpPinCmd(FunctionalState NewState);//使能Wakeup引腳喚醒 FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG); void PWR_ClearFlag(uint32_t PWR_FLAG);

core_cm4.h

__WFI(); __WFE();

04. 程序示例一

按下KEY0進入待機模式 KEY_UP喚醒

#include "sys.h" #include "delay.h" #include "usart.h" #include "led.h" #include "beep.h" #include "key.h" #include "usmart.h" #include "lcd.h" #include "rtc.h" #include "rng.h" #include "key.h"int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置系統(tǒng)中斷優(yōu)先級分組2delay_init(168);uart_init(115200);usmart_dev.init(84);LED_Init();KEY_Init();LCD_Init();POINT_COLOR = RED;LCD_ShowString(30,50,200,16,16,"Explorer STM32F4"); LCD_ShowString(30,70,200,16,16,"PWR TEST"); LCD_ShowString(30,90,200,16,16,"ATOM@tom");LCD_ShowString(30,110,200,16,16,"2020/09/10"); while(1){if (Key_Scan() == KEY0_PRESS){//使能PWR時鐘RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //后備區(qū)域訪問使能PWR_BackupAccessCmd(ENABLE);//關閉RTC相關中斷RTC_ITConfig(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA,DISABLE);//清除RTC相關中斷標志RTC_ClearITPendingBit(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA);//清除wake-up標志PWR_ClearFlag(PWR_FLAG_WU);//使能喚醒管腳功能PWR_WakeUpPinCmd(ENABLE);//進入待機模式PWR_EnterSTANDBYMode();}delay_ms(10);} }

05. 程序示例二

wkup.h

#ifndef __WK_UP_H__ #define __WK_UP_H__#include "sys.h"#define WKUP_KD PAin(0)//檢測WKUP腳的信號 u8 Check_WKUP(void);//WKUP喚醒初始化 void WKUP_Init(void);//系統(tǒng)進入待機模式 void Sys_Enter_Standby(void);#endif/*__WK_UP_H__*/

wkup.c

#include "wkup.h"#include "led.h" #include "delay.h"//檢測WKUP腳的信號 u8 Check_WKUP(void) {u8 t = 0;//記錄松開的次數(shù)u8 tx = 0;LED1 = 0;while(1){if (WKUP_KD){t++;tx = 0;}else{tx++;//查過90ms沒有WKUP信號if (tx > 3){LED1 = 1;return 0;}}delay_ms(30);if (t >= 100){LED1 = 0;return 1;}} }//WKUP喚醒初始化 void WKUP_Init(void) {GPIO_InitTypeDef GPIO_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;EXTI_InitTypeDef EXTI_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA時鐘 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG時鐘GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PA0GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//輸入模式GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;//下拉GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化 //(檢查是否是正常開)機 if(Check_WKUP()==0){Sys_Enter_Standby(); //不是開機,進入待機模式 }SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);//PA0 連接到中斷線0EXTI_InitStructure.EXTI_Line = EXTI_Line0;//LINE0EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中斷事件EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿觸發(fā) EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能LINE0EXTI_Init(&EXTI_InitStructure);//配置NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//外部中斷0NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//搶占優(yōu)先級2NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子優(yōu)先級2NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中斷通道NVIC_Init(&NVIC_InitStructure);//配置NVIC }//系統(tǒng)進入待機模式 void Sys_Enter_Standby(void) {//等待按鍵松開while(WKUP_KD);//復位所有的IO口RCC_AHB1PeriphResetCmd(0x04FF, ENABLE);//使能PWR時鐘RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //后備區(qū)域訪問使能PWR_BackupAccessCmd(ENABLE);//關閉RTC相關中斷RTC_ITConfig(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA,DISABLE);//清除RTC相關中斷標志RTC_ClearITPendingBit(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA);//清除wake-up標志PWR_ClearFlag(PWR_FLAG_WU);//使能喚醒管腳功能PWR_WakeUpPinCmd(ENABLE);//進入待機模式PWR_EnterSTANDBYMode(); }//中斷,檢測到PA0腳的一個上升沿. //中斷線0線上的中斷檢測 void EXTI0_IRQHandler(void) { EXTI_ClearITPendingBit(EXTI_Line0); // 清除LINE10上的中斷標志位if(Check_WKUP())//關機?{ Sys_Enter_Standby(); //進入待機模式 } }

main.c

#include "sys.h" #include "delay.h" #include "usart.h" #include "led.h" #include "beep.h" #include "key.h" #include "usmart.h" #include "lcd.h" #include "rtc.h" #include "rng.h" #include "key.h" #include "wkup.h"int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置系統(tǒng)中斷優(yōu)先級分組2delay_init(168);uart_init(115200);usmart_dev.init(84);LED_Init();KEY_Init();LCD_Init();WKUP_Init();POINT_COLOR = RED;LCD_ShowString(30,50,200,16,16,"Explorer STM32F4"); LCD_ShowString(30,70,200,16,16,"PWR TEST"); LCD_ShowString(30,90,200,16,16,"ATOM@tom");LCD_ShowString(30,110,200,16,16,"2020/09/10"); while(1){LED2 = !LED2;delay_ms(250);} }

06. 附錄

6.1 【STM32】STM32系列教程匯總

網(wǎng)址:【STM32】STM32系列教程匯總

07. 聲明

該教程參考了正點原子的《STM32 F4 開發(fā)指南》

總結

以上是生活随笔為你收集整理的【STM32】待机唤醒程序示例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。