十四、STM32-----低功耗

一、電源框圖

????????VDDA 供電區域,主要是 ADC 電源以及參考電壓,STM32 ADC 模塊配備獨立的供電方
式,使用了 VDDA 引腳作為輸入,使用 VSSA 引腳作為獨立地連接,VREF 引腳為提供給 ADC
參考電壓。
電壓調節器是 STM32
的電源系統中最核心部分,連接 VDD 供電區域和 1.8 供電區域。
VDD供電來自于 VSS VDD,給 I/O 電路以及待機電路供電,電壓調節器主要為備份域以及待機電路以外的所有數字電路供電,其中包括內核、數字外設以及RAM,調節器的輸出電壓約為1.8V,因此由調壓器供電的區域稱為 1.8V 供電區域。電壓調節器根據應用方式不同有三種不同的工作模式。在運行模式下,調節器以正常工作模式為內核、內存和外設提供 1.8V;在停止模式下,調節器以低功耗模式提供 1.8V 電源,以保存寄存器和 SRAM 的內容。在待機模式下,調節器停止供電,除了備用電路和備份域外,寄存器和 SRAM 的內容全部丟失。
????????電池備份區域也就是后備供電區域,使用電池或者其他電源連接到 VBAT 腳上,當 VDD斷電
時,可以保存備份寄存器的內容和維持 RTC 的功能。同時 VBAT 引腳也為 RTC LSE 振蕩器
供電,這保證了當主要電源被切斷時,RTC 能夠繼續工作。切換到 VBAT 供電由復位模塊中的掉
電復位功能控制。

二、電源管理

電源管理的部分我們要關注低功耗模式,在 STM32 的正常工作中,具有四種工作模式,運
行、睡眠、停止以及待機。當單片機上電運行后,不需要內核繼續運行,就可以選擇睡眠、停止以及待機三種低功耗模式。
睡眠模式(Cortex?-M3內核停止,所有外設包括Cortex-M3核心的外設,如NVIC、系統時
(SysTick)等仍在運行)。
停止模式(所有的時鐘都已停止)。
待機模式(1.8V電源關閉)。
2.1、睡眠模式:

立即睡眠

在執行?WFI?或?WFE?指令時立即進入睡眠模式。

退出時睡眠

在退出優先級最低的中斷服務程序后才進入睡眠模式。

進入方式

內核寄存器的SLEEPDEEP?=?0?,然后調用WFIWFE指令即可進入睡眠模式;

另外若內核寄存器的SLEEPONEXIT=0時,進入“立即睡眠”模式,SLEEPONEXIT=1時,進入“退出時睡眠”模式。

喚醒方式

如果是使用WFI指令睡眠的,則可使用任意中斷喚醒;

如果是使用WFE指令睡眠的,則由事件喚醒。

睡眠時

關閉內核時鐘,內核停止,而外設正常運行,在軟件上表現為不再執行新的代碼。這個狀態會保留睡眠前的內核寄存器、內存的數據。

喚醒延遲

無延遲。

喚醒后

若由中斷喚醒,先進入中斷,退出中斷服務程序后,接著執行WFI指令后的程序;若由事件喚醒,直接接著執行WFE后的程序。

只需要調用這個函數,選擇一下進入模式,中斷進入/時間進入。PWR_SLEEPENTRY_WFI: enter SLEEP mode with WFI instructionPWR_SLEEPENTRY_WFE: enter SLEEP mode with WFE instructionHAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry)

2.2、停止模式

調壓器低功耗模式

在停止模式下調壓器可工作在正常模式或低功耗模式,可進一步降低功耗

FLASH掉電模式

在停止模式下FLASH可工作在正常模式或掉電模式,可進一步降低功耗

進入方式

內核寄存器的SLEEPDEEP?=1PWR_CR寄存器中的PDDS=0,然后調用WFIWFE指令即可進入停止模式;

PWR_CR?寄存器的LPDS=0時,調壓器工作在正常模式,LPDS=1時工作在低功耗模式;

喚醒方式

如果是使用WFI指令睡眠的,可使用任意EXTI線的中斷喚醒;

如果是使用WFE指令睡眠的,可使用任意配置為事件模式的EXTI線事件喚醒。

停止時

內核停止,片上外設也停止。這個狀態會保留停止前的內核寄存器、內存的數據。

喚醒延遲

基礎延遲為HSI振蕩器的啟動時間,若調壓器工作在低功耗模式,還需要加上調壓器從低功耗切換至正常模式下的時間,若FLASH工作在掉電模式,還需要加上FLASH從掉電模式喚醒的時間。

用KEY0來進入停止模式,然后使用任意外部中斷喚醒。uint8_t KEY0_Scan(void) {static uint8_t key_pressed = 0;         if (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4) == GPIO_PIN_RESET) {HAL_Delay(20);                        if (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4) == GPIO_PIN_RESET && key_pressed == 0) {key_pressed = 1;               while (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4) == GPIO_PIN_RESET);printf("按鍵0觸發了,進入停止模式\n");  I2C_Write(0,I2C_Wbuf,  strlen((char*)I2C_Wbuf) + 1);HAL_PWR_EnterSTOPMode(1, PWR_SLEEPENTRY_WFI);return 1;  }} else {key_pressed = 0;}return 0;}退出停止模式
因為停止模式,會關閉HSE和PLL,所以在退出時,必須重新開啟HSE和PLL。void CLK_Resume()
{//使能HSE__HAL_RCC_HSE_CONFIG(RCC_HSE_ON);while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET){}//使能PLL__HAL_RCC_PLL_ENABLE();while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET){}	//選擇PLL作為系統時鐘__HAL_RCC_SYSCLK_CONFIG(RCC_SYSCLKSOURCE_PLLCLK);while(__HAL_RCC_GET_SYSCLK_SOURCE() != 0x08 ){}
}void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if (GPIO_Pin == GPIO_PIN_2) {CLK_Resume();printf("退出停止模式\n");key_pressed_flag = 1;        key_debounce_start = HAL_GetTick(); __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_2); }
}

現象:

2.3、待機模式

進入方式

內核寄存器的SLEEPDEEP?=1PWR_CR寄存器中的PDDS=1PWR_CR寄存器中
的喚醒狀態位
WUF=0,然后調用WFIWFE指令即可進入待機模式;

喚醒方式

通過WKUP引腳的上升沿,RTC鬧鐘、喚醒、入侵、時間戳事件或NRST引腳外部復位
IWDG復位喚醒。

待機時

內核停止,片上外設也停止;內核寄存器、內存的數據會丟失;除復位引腳、
RTC_AF1引腳及WKUP引腳,其它I/O口均工作在高阻態。

喚醒延遲

芯片復位的時間

喚醒后

相當于芯片復位,在程序表現為從頭開始執行代碼。

代碼:
GPIO.C?
//下述代碼實現了,按鍵1進入待機模式,并且用中斷0進行喚醒,喚醒后相當于重新上電。
uint8_t  key_pressed_flag = 0;   
uint32_t key_debounce_start = 0; void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)  //將PA0配置為中斷模式
{if(GPIO_Pin == GPIO_PIN_0){HAL_ResumeTick();   //恢復systick中斷,否則不能使用HAL_Delayprintf("退出待機模式\n");key_pressed_flag = 1;        key_debounce_start = HAL_GetTick(); __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0); }
}void KEYUP_Scan(void) 
{
if (key_pressed_flag == 1) {if (HAL_GetTick() - key_debounce_start > 20) {if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET) {while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET) {if (HAL_GetTick() - key_debounce_start > 1000) {break; }}										printf("按鍵2觸發!LED狀態已翻轉\n");										                   }key_pressed_flag = 0; }						
}
}
uint8_t KEY1_Scan(void) {static uint8_t key_pressed = 0;         if (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_3) == GPIO_PIN_RESET) {HAL_Delay(20);                        if (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_3) == GPIO_PIN_RESET && key_pressed == 0) {key_pressed = 1;               while (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_3) == GPIO_PIN_RESET);printf("按鍵1觸發了,進入待機模式\n");  HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);  //使能喚醒引腳__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);HAL_PWR_EnterSTANDBYMode();      //進入到待機模式return 1;  }} else {          key_pressed = 0;}return 0;
}void Key_Process(void)
{KEY1_Scan();KEYUP_Scan();
}
現象:
按完按鍵1之后,相當于復位,程序從頭執行代碼。

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

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

相關文章

一篇文章帶你徹底搞懂 JVM 垃圾收集器

垃圾收集器是 JVM 內存管理的執行引擎,負責自動回收無用的對象內存。其設計核心是 權衡:主要是吞吐量和停頓時間之間的權衡。沒有“最好”的收集器,只有“最適合”特定場景的收集器。一、核心基礎:分代收集模型主流 HotSpot JVM 采…

服務器排故隨筆:服務器無法ssh遠程登錄

文章目錄服務器排故隨筆:服務器無法遠程登錄問題現象解決過程第一步:確認故障描述是否準確第二步:確認網絡是否有問題第三步:確認ssh服務是否有問題第四步:確認防火墻是否放行sshd服務第五步:試試萬能的“重…

Deeplizard深度學習課程(六)—— 結合Tensorboard進行結果分析

前言 Tensorboard最初是tensorflow的可視化工具,被用于機器學習實驗的可視化,后來也適配了pytorch。Tensorboard是一個前端web界面,,能夠從文件里面讀取數據并展示它(比如損失、準確率、網絡圖)。具體使用可…

C語言————實戰項目“掃雷游戲”(完整代碼)

無論是找工作面試,還是課設大作業、考研,都離不開實戰項目的積累,如果你能把一個項目搞明白,并且給別人熟練的講出來,即使你沒有過項目經歷,也可以說是非常加分的,下面來沉浸式體驗一下這款掃雷…

數據結構之加餐篇 -順序表和鏈表加餐

目錄一、鏈表分割二、隨機鏈表的復制總結一、鏈表分割 鏈表分割 題目描述的意思就如下圖: 也就是把1,2挪到前面,6,3,5挪到后面,前者的相對順序不發生改變 這里要想往后挪就要先遍歷,遍歷到6…

JSP與Servlet整合數據庫開發:構建Java Web應用的全棧指南

JSP與Servlet整合數據庫開發:構建Java Web應用的全棧指南 概述 在Java Web開發領域,JSP(JavaServer Pages)與Servlet是構建動態Web應用的核心技術組合。Servlet作為Java EE的基礎組件,負責處理客戶端請求、執行業務邏…

設計五種算法精確的身份證號匹配

問題定義與數據準備 我們有兩個Excel文件: small.xlsx: 包含約5,000條記錄。large.xlsx: 包含約140,000條記錄。 目標:快速、高效地從large.xlsx中找出所有其“身份證號”字段存在于small.xlsx“身份證號”字段中的記錄,并將這些匹配的記錄保…

Spring 框架(IoC、AOP、Spring Boot) 的必會知識點匯總

目錄:🧠 一、Spring 框架概述1. Spring 的核心功能2. Spring 模塊化結構🧩 二、IoC(控制反轉)核心知識點1. IoC 的核心思想2. Bean 的定義與管理3. IoC 容器的核心接口4. Spring Bean 的創建方式🧱 三、AOP…

簡單工廠模式(Simple Factory Pattern)?? 詳解

?作者簡介:大家好,我是 Meteors., 向往著更加簡潔高效的代碼寫法與編程方式,持續分享Java技術內容。 🍎個人主頁: Meteors.的博客 💞當前專欄: 設計模式 ?特色專欄: 知識分享 &…

新電腦硬盤如何分區?3個必知技巧避免“空間浪費癥”!

剛到手的新電腦,硬盤就像一間空蕩蕩的大倉庫,文件扔進去沒多久就亂成一鍋粥?別急,本文會告訴你新電腦硬盤如何分區,這些方法不僅可以幫你給硬盤分區,還可以調整/合并分區大小等。所以,本文的分區…

【微知】git submodule的一些用法總結(不斷更新)

文章目錄綜述要點細節如何新增一個submodule?如何手動.gitmodules修改首次增加一個submodule?git submodule init,init子命令依據.gitmodules.gitmodules如何命令修改某個成員以及同步?如果submodule需要修改分支怎么辦&#xff1…

【Spring Cloud微服務】9.一站式掌握 Seata:架構設計與 AT、TCC、Saga、XA 模式選型指南

文章目錄一、Seata 框架概述二、核心功能特性三、整體架構與三大角色1. Transaction Coordinator (TC) - 事務協調器(Seata Server)2. Transaction Manager (TM) - 事務管理器(集成在客戶端)3. Resource Manager (RM) - 資源管理器…

AI賦能!Playwright帶飛UI自動化腳本維護

80%的自動化腳本因一次改版報廢? 開發隨意改動ID導致腳本集體崩潰?背景UI自動化在敏捷開發席卷行業的今天,UI自動化測試深陷一個尷尬困局:需求迭代速度(平均2周1次)> 腳本維護速度(平…

Redis、Zookeeper 與關系型數據庫分布式鎖方案對比及性能優化實戰指南

Redis、Zookeeper 與關系型數據庫分布式鎖方案對比及性能優化實戰指南 1. 問題背景介紹 在分布式系統中,多節點并發訪問共享資源時,如果不加鎖或加鎖不當,會導致數據不一致、超賣超買、競態條件等問題。常見的分布式鎖方案包括基于Redis、Zoo…

網絡安全A模塊專項練習任務十一解析

任務十一:IP安全協議配置任務環境說明: (Windows 2008)系統:用戶名Administrator,密碼Pssw0rd1.指定觸發SYN洪水攻擊保護所必須超過的TCP連接請求數閾值為5;使用組合鍵winR,輸入regedit打開注冊表編輯器&am…

金蝶中間件適配HGDB

文章目錄環境文檔用途詳細信息環境 系統平臺:Microsoft Windows (64-bit) 10 版本:5.6.5 文檔用途 本文章主要介紹金蝶中間件簡單適配HGDB。 詳細信息 一、金蝶中間件Apusic安裝與配置 1.Apusic安裝與配置 Windows和Linux下安裝部署過程相同。 &…

使用a標簽跳轉之后,會刷新一次,這個a標簽添加的樣式就會消失

<ul class"header-link"><li><a href"storeActive.html">到店活動</a></li><li><a href"fuwu.html">服務</a></li><li><a href"store.html">門店</a></l…

線程池實現及參數詳解

線程池概述 Java線程池是一種池化技術&#xff0c;用于管理和復用線程&#xff0c;減少線程創建和銷毀的開銷&#xff0c;提高系統性能。Java通過java.util.concurrent包提供了強大的線程池支持。 線程池參數詳解 1. 核心參數 // 創建線程池的完整構造函數 ThreadPoolExecu…

K8S 部署 NFS Dynamic Provisioning(動態存儲供應)

K8S 部署 NFS Dynamic Provisioning&#xff08;動態存儲供應&#xff09; 本文檔提供完整的 K8s NFS 動態存儲部署流程&#xff0c;包含命名空間創建、RBAC 權限配置、Provisioner 部署、StorageClass 創建及驗證步驟。 2. 部署步驟 2.1 創建命名空間 首先創建獨立的命名空間 …

JavaEE 進階第二期:開啟前端入門之旅(二)

專欄&#xff1a;JavaEE 進階躍遷營 個人主頁&#xff1a;手握風云 目錄 一、VS Code開發工具的搭建 1.1. 創建.html文件 1.2. 安裝插件 1.3. 快速生成代碼 二、HTML常見標簽 2.1. 換行標簽 2.2. 圖片標簽: img 2.3. 超鏈接 三、表格標簽 四、表單標簽 4.1. input標…