【STM32單片機】#14 PWR電源控制

主要參考學習資料:

B站@江協科技

STM32入門教程-2023版 細致講解 中文字幕

開發資料下載鏈接:https://pan.baidu.com/s/1h_UjuQKDX9IpP-U1Effbsw?pwd=dspb

單片機套裝:STM32F103C8T6開發板單片機C6T6核心板 實驗板最小系統板套件科協

目錄

  • PWR簡介
    • 電源框圖
    • 電壓監測(了解)
      • 上電復位和掉電復位
      • 可編程電壓監測器
    • 低功耗模式
      • 模式選擇
      • 睡眠模式
      • 停機模式
      • 待機模式
  • 函數詳解
    • PWR_DeInit函數
    • PWR_PVDCmd函數
    • PWR_PVDLevelConfig函數
    • PWR_WakeUpPinCmd函數
    • PWR_EnterSTOPMode函數
    • PWR_EnterSTANDBYMode函數
    • 標志位函數
  • 實驗30 修改主頻
    • 接線圖
    • system_stm32f10x文件
    • 主程序
  • 實驗31 睡眠模式+串口發送+接收
    • 接線圖
    • 主程序
  • 實驗32 停機模式+對射式紅外傳感器計次
    • 接線圖
    • 主程序
  • 實驗33 待機模式+實時時鐘
    • 接線圖
    • 主程序

PWR簡介

  • PWR(Power Control)電源控制
  • PWR負責管理STM32內部的電源供電部分,可以實現可編程電壓監測器和低功耗模式的功能。
  • 可編程電壓監測器(PVD)可以監控VDD電源電壓,當VDD下降到PVD閾值以下或上升到PVD閾值之上時,PVD會觸發中斷,用于執行緊急關閉任務(非本節重點)。
  • 低功耗模式包括睡眠模式(Sleep)、停機模式(Stop)和待機模式(Standby),可在系統空閑時降低STM32的功耗,延長設備使用時間。
  • 主頻和電流消耗大致呈正比,降低主頻也能顯著降低功耗。

電源框圖

上圖為STM32供電方案,可分為模擬部分供電(VDDA)、數字部分供電(VDD+1.8V)和后備供電。各供電區域負責的設備已列出。

VDDA供電區域主要負責模擬部分的供電,供電正極為VDDA,負極為VSSA。其中AD轉換器還有參考電壓供電引腳VREF+和VREF-,在引腳多的芯片型號會單獨引出,而在F103C8T6中已經在內部分別接到了VDDA和VSSA。

中間部分分為VDD供電區域和1.8V供電區域,VDD經電壓調節器降壓到1.8V提供給1.8V供電區域。后備供電區域中,低電壓檢測器控制開關,在VDD有電時由VDD供電,VDD沒電時由VBAT供電。

電壓監測(了解)

上電復位和掉電復位

當VDD或VDDA電壓過低時,STM32內部電路直接產生復位。電壓小于下限PDR時復位,大于上限POR時解除復位,中間有40mV的遲滯電壓防抖,復位信號Reset低電平有效。POR、PDR和復位滯后時間均可在芯片數據手冊查詢。

可編程電壓監測器

可編程電壓監測器的工作流程與上電/掉電復位類似,但閾值電壓可以手動調節,調節范圍可在芯片數據手冊查詢,一般高于上電/掉電復位電壓。PVD輸出在電壓過低時為1,電壓正常時為0,可在上升/下降沿申請外部中斷提醒程序進行適當處理。

低功耗模式

上表對三種低功耗模式進行了詳細的對比。其中第二列為進入對應模式所需的配置,第三列為進入對應模式后的喚醒方法,后三列為進入對應模式后關閉的電路(電壓調節器相當于1.8V供電區域的電源)。三種模式從上到下,關閉的電路越來越多,也越來越省電,越來越難喚醒。對于具體的省電效果,正常模式和睡眠模式電流消耗(數量級)均在10mA,停機模式為10 μ \mu μA,待機模式為1 μ \mu μA。

模式選擇

執行WFI(Wait For Interrupt)或WFE(Wait For Event)指令后,STM32進入低功耗模式。在觸發低功耗模式之前,配置寄存器進行模式選擇的方式如下圖所示,其中寄存器的每個位已由庫函數封裝好,無需自行配置。

睡眠模式

  • 執行完WFI/WFE指令后,STM32進入睡眠模式,程序暫停運行,喚醒后程序從暫停的地方繼續運行。
  • SLEEPONEXIT位決定STM32執行完WFI或WFE后,是立刻進入睡眠,還是等STM32從最低優先級的中斷處理程序中退出時進入睡眠。
  • 在睡眠模式下,所有的I/O引腳都保持它們在運行模式時的狀態。
  • WFI指令進入睡眠模式,可被任意一個NVIC響應的中斷喚醒。
  • WFE指令進入睡眠模式,可被喚醒事件喚醒。

停機模式

  • 執行完WFI/WFE指令后,STM32進入停機模式,程序暫停運行,喚醒后程序從暫停的地方繼續運行。
  • 1.8V供電區域的所有時鐘都被停止,PLL、HSI和HSE被禁止,SRAM和寄存器內容被保留下來。
  • 在停機模式下,所有的I/O引腳都保持它們在運行模式時的狀態。
  • 當一個中斷或喚醒事件導致退出停機模式時,HSI被選為系統時鐘,因此喚醒后需重新啟動HSE配置主頻為72MHz。
  • 當電壓調節器處于低功耗模式下,系統從停機模式退出時,會有一段額外的啟動延時。
  • WFI指令進入停機模式,可被任意一個EXTI中斷喚醒。
  • WFE指令進入停機模式,可被任意一個EXTI事件喚醒。

待機模式

  • 執行完WFI/WFE指令后,STM32進入待機模式,喚醒后程序從頭開始運行。
  • 整個1.8V供電區域被斷電,PLL、HSI和HSE也被斷電,SRAM和寄存器內容丟失,只有備份的寄存器和待機電路維持供電。
  • 在待機模式下,所有的I/O引腳變為高阻態(浮空輸入)。
  • WKUP引腳的上升沿、RTC鬧鐘事件的上升沿、NRST引腳上外部復位、IWDG復位退出待機模式。

函數詳解

PWR_DeInit函數

簡介:恢復缺省配置。

參數:void

PWR_PVDCmd函數

簡介:使能可編程電壓監測器。

參數:使能/失能

PWR_PVDLevelConfig函數

簡介:配置PVD閾值。

參數:閾值

PWR_PVDLevel_2V2/.../9(2.2~2.9V)

PWR_WakeUpPinCmd函數

簡介:使能WKUP引腳(PA0),配合待機模式的WKUP上升沿喚醒。

參數:使能/失能

PWR_EnterSTOPMode函數

簡介:進入停機模式。

參數一:電壓調節器狀態

PWR_Regulator_ON(開啟)
PWR_Regulator_LowPower(低功耗)

參數二:喚醒方式

PWR_STOPEntry_WFI/WFE(中斷/事件)

PWR_EnterSTANDBYMode函數

簡介:進入待機模式。

參數:void

標志位函數

PWR_GetFlagStatus函數

PWR_ClearFlag函數

參數:PWR標志位

PWR_FLAG_WU/SB/PWDO(喚醒/待機/電壓監測器輸出)

實驗30 修改主頻

接線圖

system_stm32f10x文件

system文件提供了兩個外部可調用的函數和一個外部可調用的變量:

  • SystemInit函數:配置時鐘樹,復位后在啟動文件中自動調用。
  • SystemCoreClock變量:主頻頻率。
  • SystemCoreClockUpdate函數:更新主頻頻率。

源文件system_stm32f10x.c中如下部分可更改主頻的宏定義,解除對應的注釋即可選擇想要的系統主頻。其中else之前的部分為VL超值系列可選主頻。當前主頻為72MHz。

#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
/* #define SYSCLK_FREQ_HSE    HSE_VALUE */#define SYSCLK_FREQ_24MHz  24000000
#else
/* #define SYSCLK_FREQ_HSE    HSE_VALUE */
/* #define SYSCLK_FREQ_24MHz  24000000 */ 
/* #define SYSCLK_FREQ_36MHz  36000000 */
/* #define SYSCLK_FREQ_48MHz  48000000 */
/* #define SYSCLK_FREQ_56MHz  56000000 */
#define SYSCLK_FREQ_72MHz  72000000
#endif

若文件為只讀狀態,可以在文件資源管理器中右鍵對應文件更改屬性,取消勾選只讀。

SystemInit()首先啟動HSI并恢復缺省配置,隨后調用SetSysClock()函數會根據不同的宏定義執行相應的SetSysClockToxx()函數完成相應的時鐘配置。

主程序

以下代碼顯示主頻,并以72MHz下的1s為周期閃爍Running字符串。

#include "stm32f10x.h" 
#include "Delay.h"
#include "OLED.h"int main(void)
{OLED_Init();OLED_ShowString(1, 1, "SYSCLK:");OLED_ShowNum(1, 8, SystemCoreClock, 8);while(1){OLED_ShowString(2, 1, "Running");Delay_ms(500);OLED_ShowString(2, 1, "       ");Delay_ms(500);}
}

此時Running以現實的1s為周期閃爍。

現通過宏定義修改主頻為36MHz:

#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
/* #define SYSCLK_FREQ_HSE    HSE_VALUE */#define SYSCLK_FREQ_24MHz  24000000
#else
/* #define SYSCLK_FREQ_HSE    HSE_VALUE */
/* #define SYSCLK_FREQ_24MHz  24000000 */ 
#define SYSCLK_FREQ_36MHz  36000000
/* #define SYSCLK_FREQ_48MHz  48000000 */
/* #define SYSCLK_FREQ_56MHz  56000000 */
/* #define SYSCLK_FREQ_72MHz  72000000 */
#endif

此時Running閃爍周期延長一倍。

由于修改主頻會要求很多涉及精準計時的計算做好匹配工作,一般不建議采用。

實驗31 睡眠模式+串口發送+接收

接線圖

主程序

在實驗21 串口發送+接收的基礎上修改。

#include "stm32f10x.h" 
#include "Delay.h"
#include "OLED.h"
#include "Serial.h"uint8_t RxData;int main(void)
{OLED_Init();Serial_Init();OLED_ShowString(1, 1, "RxDara:");while(1){if (Serial_GetRxFlag()){RxData = Serial_GetRxData();Serial_SendByte(RxData);OLED_ShowHexNum(1, 8, RxData, 2);}//監測低功耗狀態OLED_ShowString(2, 1, "Running");Delay_ms(100);OLED_ShowString(2, 1, "       ");Delay_ms(100);//默認配置開啟睡眠模式__WFI();}
}

此時只有當我們向串口發送數據時,Running才會閃爍一次,并回傳一次數據。

程序運行時,第一次循環即進入睡眠狀態,程序停止在WFI指令,CPU睡眠,但各個外設例如USART仍處于工作狀態。USART外設在收到數據時產生中斷喚醒CPU,程序在暫停的地方繼續運行,先進入中斷服務函數,再回到主循環執行一輪循環進入下一次睡眠,如此循環往復。

實驗32 停機模式+對射式紅外傳感器計次

接線圖

主程序

在實驗6 對射式紅外傳感器計次的基礎上修改。

原驅動程序中博主采用了延時100ms消抖,經實測中斷處理時間過長會導致喚醒失敗,因此將中斷服務函數修改如下:

//中斷函數名稱在啟動文件startup_stm32f10x_md.s中規定
void EXTI15_10_IRQHandler(void)
{//檢查中斷掛起標志位if(EXTI_GetITStatus(EXTI_Line14) == SET){//再次判斷引腳電平if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14) == 0){CountSensor_Count ++;}EXTI_ClearITPendingBit(EXTI_Line14);}
}

主程序修改如下:

#include "stm32f10x.h" 
#include "Delay.h"
#include "OLED.h"
#include "CountSensor.h"int main(void)
{OLED_Init();CountSensor_Init();//開啟PWR時鐘RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);OLED_ShowString(1, 1, "Count:");while(1){OLED_ShowNum(1, 7, CountSensor_Get(), 5);//監測低功耗狀態OLED_ShowString(2, 1, "Running");Delay_ms(100);OLED_ShowString(2, 1, "       ");Delay_ms(100);//進入停機模式(電壓調節器開啟,中斷喚醒)PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI);}
}

此時每遮擋一次對射式紅外傳感器,計數加一,Running閃爍一次。有時閃爍兩次是因為信號抖動導致遮擋和移開均產生中斷信號。

除此之外,復位后Running第一次閃爍時間短暫,后續遮擋Running閃爍變慢,這是由于前文介紹的停機模式喚醒后HSI被選為系統時鐘,只需在進入停機模式之后加上 SystemInit(); \texttt{SystemInit();} SystemInit();重新配置時鐘為HSE即可。

實驗33 待機模式+實時時鐘

接線圖

主程序

在實驗29 實時時鐘的基礎上修改。

#include "stm32f10x.h" 
#include "Delay.h"
#include "OLED.h"
#include "MyRTC.h"int main(void)
{OLED_Init();MyRTC_Init();//開啟PWR時鐘RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//更改顯示布局//計數值OLED_ShowString(1, 1, "CNT :");//鬧鐘值OLED_ShowString(2, 1, "ALR :");//鬧鐘標志位OLED_ShowString(3, 1, "ALRF:");//設置鬧鐘值為復位10秒后//鬧鐘寄存器只寫不讀,先定義變量存儲鬧鐘值uint32_t Alarm = RTC_GetCounter() + 10;RTC_SetAlarm(Alarm);OLED_ShowNum(2, 6, Alarm, 10);while(1){OLED_ShowNum(1, 6, RTC_GetCounter(), 10);//顯示鬧鐘標志位OLED_ShowNum(3, 6, RTC_GetFlagStatus(RTC_FLAG_ALR), 1);//監測低功耗狀態OLED_ShowString(4, 1, "Running");Delay_ms(100);OLED_ShowString(4, 1, "       ");Delay_ms(100);//待機前關閉所有外部耗電電路以達到省電目的OLED_Clear();PWR_EnterSTANDBYMode();}
}

待機模式喚醒后程序從頭開始運行,因此該程序現象為復位后OLED閃爍一次,十秒之后觸發鬧鐘事件再次閃爍,往后每隔十秒閃爍一次。

在while循環之前加上 PWR_WakeUpPinCmd(ENABLE); \texttt{PWR\_WakeUpPinCmd(ENABLE);} PWR_WakeUpPinCmd(ENABLE);可實現WKUP引腳(PA0)喚醒,此時每次將該引腳用跳線接到高電平即可觀察到OLED閃爍。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/904338.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/904338.shtml
英文地址,請注明出處:http://en.pswp.cn/news/904338.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第十五屆藍橋杯單片機國賽-串口解析

串口通信像是藍橋杯單片機組國賽中一個若隱若現的秘境,總在不經意間為勇者們敞開大門。然而,初次探索這片領域的冒險者,常常會被其神秘莫測的特性所震懾,黯然退場(編不下去了,直接進入正題)。 附…

深入探索 51 單片機:從入門到實踐的全面指南

深入探索 51 單片機:從入門到實踐的全面指南 一、引言 在嵌入式系統發展的漫長歷程中,51 單片機猶如一顆璀璨的明星,雖然誕生已有數十年,但至今仍在眾多領域發揮著重要作用。它以結構簡單、易于學習、成本低廉等優勢&#xff0c…

GD32F470+CH395Q

第一步:資料下載 以太網協議棧芯片 CH395 - 南京沁恒微電子股份有限公司 第二步:準備工程 (1) 首先準備一個編譯無報錯、可以正常打印和延時的工程文件,官方例程采用STM32F1芯片,但本文采用GD32F470芯片 …

Linux 怎么使用局域網內電腦的網絡訪問外部

一次性 export http_proxy"http://192.168.0.188:7890" export https_proxy"http://192.168.0.188:7890"一直生效 寫入 ~/.bashrc(或 ~/.bash_profile) nano ~/.bashrc加入這一行: export http_proxy"http://19…

Mysql進階篇1_存儲引擎、索引、SQL性能分析指令

文章目錄 1.存儲引擎InnoDBMyISAMMemory存儲引擎選擇和對比 2.索引索引結構索引分類索引語法索引使用(建議看完第3節后觀看)!!!mysql如何使用索引查詢數據(個人理解) 3.SQL性能分析SQL執行頻率慢…

LeetCode 熱題 100 118. 楊輝三角

LeetCode 熱題 100 | 118. 楊輝三角 大家好,今天我們來解決一道經典的算法題——楊輝三角。這道題在 LeetCode 上被標記為簡單難度,要求生成楊輝三角的前 numRows 行。楊輝三角是一個經典的組合數學問題,每一行的數字都是其正上方和正左上方…

修改或禁用Cursor的全局搜索默認快捷鍵

在 Cursor 中,默認情況下 雙擊 Shift 會打開 全局搜索(Quick Open),類似于 VS Code 的 CtrlP 功能。如果你想修改或禁用這個快捷鍵,可以按照以下步驟操作: 1. 打開快捷鍵設置 方法 1:按下 Ctrl…

HarmonyOS Device Connector(hdc)

它是為開發人員提供的用于調試的命令行工具,通過該工具可以在windows/linux/mac系統上與設備進行交互。 hdc分為三部分: client:運行在電腦端的進程,開發者在執行hdc命令時啟動該進程,命令結束后進程退出。 server&…

開源PDF解析工具Marker深度解析

開源PDF解析工具Marker深度解析 檢索增強生成(RAG)系統的第一步就是做 pdf 解析,從復雜多樣的 pdf 中提取出干凈準確的文本內容。現有的最優秀的開源工具有兩個:Marker 和 MinerU。因為 Marker 是個人開發者做的,文檔…

ARM子程序調用與返回

子程序(也叫過程、函數、方法)是一個能被調用和執行并返回到調用點那條指令的代碼 段。 兩個問題:如何將參數傳遞給子程序或從子程序中傳遞出來?怎么從子程序返回到調用點? 指令BSR Proc_A調用子程序Proc_A。 處理器將…

算力經濟模型推演:從中心化到去中心化算力市場的轉變(區塊鏈+智能合約的算力交易原型設計)

一、算力經濟的歷史脈絡與范式轉移 1.1 中心化算力市場的演進困境 傳統算力市場以超算中心、云計算平臺為核心載體,其運營模式呈現強中心化特征。中國移動構建的"四算融合"網絡雖實現百萬級服務器的智能調度,但動態資源分配仍受制于集中式控…

小結: 接口類型和路由優先級

網絡接口類型 1. Bridge-if&#xff08;橋接接口&#xff09; 作用&#xff1a;用于橋接網絡&#xff0c;將多個接口或VLAN連接為一個廣播域&#xff0c;實現二層數據轉發。 常用指令&#xff1a; interface bridge-if <number> bridge <bridge-id> # 將接口加入…

mysql一些事

一.聯合查詢/多表查詢 聯合查詢關鍵在于笛卡爾積的過程 笛卡爾坐標積的排列組合 首先它會將兩個表用排列組合的方式進行排列組合。 表一 表二 進行排列組合 我們發現它的行是 兩個表的行相乘&#xff0c;列是兩表的列相加。 我們所看到的數據有合理的也有不合理的我們接下…

【工具】Open WebUI:本地化部署的AI交互平臺

文章目錄 一、Open WebUI 簡介二、核心功能詳解1. 多模型與多模態支持2. 本地RAG與文檔集成3. 開發與定制化能力4. 安全與權限管理5. 用戶體驗優化 三、安裝與部署指南1. 快速安裝方式2. 高級配置3. 常見問題 四、實際應用場景1. 個人隱私助手2. 企業知識庫3. 學術研究4. 創意工…

AutoGPT

一、簡介 是一個基于openAI研發的GPT4模型的一個開源應用程序&#xff0c;根據用戶指定的目標&#xff0c;自動生成所需的提示&#xff0c;并且執行需要多個步驟才能完成的項目&#xff0c;整個過程不需要人類干預和指導&#xff08;無監督學習&#xff09;&#xff0c;生成式…

[C++] 小游戲 決戰蒼穹

大家好&#xff0c;各位看到這個標題&#xff0c;斗破蒼穹什么時候改叫決戰蒼穹了&#xff1f;其實&#xff0c;因為版權等一系列問題&#xff0c;斗破蒼穹正式改名為決戰蒼穹&#xff0c;這個版本主要更新內容為解決了皇冠競技場太過影響游戲平衡&#xff0c;并且提高了一些裝…

Spring的數據庫編程

本內容采用最新SpringBoot3框架版本,視頻觀看地址:B站視頻播放 1. JdbcTemplate概述 針對數據庫操作,Spring框架提供了JdbcTemplate類,JdbcTemplate是一個模板類,Spring JDBC中的更高層次的抽象類均在JdbcTemplate模板類的基礎上創建。 JdbcTemplate類提供了操作數據庫…

Debezium MySqlValueConverters詳解

Debezium MySqlValueConverters詳解 1. 類的作用與功能 1.1 核心作用 MySqlValueConverters是Debezium中負責MySQL數據類型轉換的核心類,主要功能包括: 數據類型映射:將MySQL的數據類型映射到Kafka Connect的Schema類型值轉換:將MySQL的原始值轉換為Kafka Connect可用的…

進程與線程:06 操作系統之“樹”

操作系統核心知識回顧與思維訓練 在之前的學習中&#xff0c;我們深入探討了CPU管理相關內容。 CPU管理內容回顧&#xff1a;我們學習了CPU直觀管理方法&#xff0c;了解如何讓簡單程序執行&#xff0c;分析了CPU效率低下的原因及處理辦法&#xff0c;即實現多程序執行。接著…

Android Studio Profiler

1.我們想要查看自己方法的調用鏈&#xff0c;或者分析方法耗時的情況&#xff0c;可以選擇Android Studio的Profiler&#xff0c;比較方便快捷。如下&#xff1a; 2.基本的面板參數講解&#xff1a; 3.可以通過搜索&#xff0c;查看對應的方法&#xff0c;以及方法的調用鏈…