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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

stm32之电源管理(实现低功耗)

發(fā)布時(shí)間:2024/10/14 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 stm32之电源管理(实现低功耗) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

1.硬件原理

2.低功耗模式

3.睡眠模式實(shí)驗(yàn)

4.停止模式實(shí)驗(yàn)

5.待機(jī)模式實(shí)驗(yàn)


前言:STM32F10xxx系列產(chǎn)品都有電源管理模塊,芯片功耗會(huì)影響到一個(gè)產(chǎn)品的續(xù)航能力;比如在一些終端傳感器場(chǎng)合里,為了減輕后期的維護(hù)投入,要求長(zhǎng)期工作時(shí)間較長(zhǎng),更需要合理的芯片功耗管理。芯片自帶幾種運(yùn)行模式,包括正常模式、睡眠模式、停止模式、待機(jī)模式。越往后,芯片的功耗越低,但能執(zhí)行功能就越少。低功耗的電源管理策略就是在芯片不需要對(duì)外界響應(yīng)的時(shí)候進(jìn)入低功耗模式,而當(dāng)外界條件滿足的時(shí)候,退出低功耗模式(喚醒),正常執(zhí)行處理工作。下面對(duì)其模式之間的轉(zhuǎn)換和各個(gè)模式下的芯片內(nèi)部的運(yùn)轉(zhuǎn)情況等一探究竟。

寫代碼前要先了解芯片的特性及工作原理,難免會(huì)先閱讀一些長(zhǎng)長(zhǎng)的文檔。下面核心講解一些要點(diǎn)。

1.硬件原理

下圖是芯片的電源框架:

圖左邊7個(gè)電壓點(diǎn)對(duì)應(yīng)芯片的7個(gè)引腳,在芯片電路原理圖能找到對(duì)應(yīng)的引腳。

、:是ADC轉(zhuǎn)換器的參考電壓,有些芯片沒(méi)有這連個(gè)引腳,內(nèi)部已經(jīng)把他們接到、了。

、:是ADC轉(zhuǎn)換器的供電電源,獨(dú)立電源供電是為了過(guò)濾和屏蔽來(lái)自印刷電路板上的毛刺干擾,提高轉(zhuǎn)換的精確度。(也可以直接連到、)。

、:STM32的工作電壓(VDD)為2.0~3.6V。通過(guò)內(nèi)置的電壓調(diào)節(jié)器提供所需的1.8V電源。

使用電池或其他電源連接到VBAT腳上,當(dāng)VDD斷電時(shí),可以保存?zhèn)浞菁拇嫫鞯膬?nèi)容和維持RTC的

功能。(如果沒(méi)有外部電池,好像不接也可以,但是數(shù)據(jù)手冊(cè)說(shuō)必須接到)。

電池備份區(qū)域:

當(dāng)備份區(qū)域由VDD(內(nèi)部模擬開(kāi)關(guān)連到VDD)供電時(shí),下述功能可用:

??? ● PC14和PC15可以用于GPIO或LSE(低速外部時(shí)鐘)引腳

??? ● PC13可以作為通用I/O口、TAMPER引腳、RTC校準(zhǔn)時(shí)鐘、RTC鬧鐘或秒輸出

當(dāng)后備區(qū)域由VBAT供電時(shí)(VDD消失后模擬開(kāi)關(guān)連到VBAT),可以使用下述功能:

??? ● PC14和PC15只能用于LSE(低速外部時(shí)鐘)引腳

??? ● PC13可以作為TAMPER引腳、RTC鬧鐘或秒輸出

電壓調(diào)節(jié)器:

復(fù)位后調(diào)節(jié)器總是使能的。根據(jù)應(yīng)用方式它以3種不同的模式工作。

???? ● 運(yùn)轉(zhuǎn)模式:調(diào)節(jié)器以正常功耗模式提供1.8V電源(內(nèi)核,內(nèi)存和外設(shè))。

???? ● 停止模式:調(diào)節(jié)器以低功耗模式提供1.8V電源,以保存寄存器和SRAM的內(nèi)容。

???? ● 待機(jī)模式:調(diào)節(jié)器停止供電。除了備用電路和備份域外,寄存器和SRAM的內(nèi)容全部丟失。

2.低功耗模式

STM32F10xxx有三種低功耗模式:

???? ● 睡眠模式(Cortex?-M3內(nèi)核停止,所有外設(shè)包括Cortex-M3核心的外設(shè),如NVIC、系統(tǒng)時(shí)鐘(SysTick)等仍在運(yùn)行)

???? ● 停止模式(所有的時(shí)鐘都已停止)

???? ● 待機(jī)模式(1.8V電源關(guān)閉)

此外,在運(yùn)行模式下,可以通過(guò)以下方式中的一種降低功耗:

● 降低系統(tǒng)時(shí)鐘

● 關(guān)閉APB和AHB總線上未被使用的外設(shè)時(shí)鐘。

注意:在睡眠模式、停止模式及待機(jī)模式中,若備份區(qū)域電源正常供電,備份區(qū)域的RTC都可以正常運(yùn)行、備份區(qū)域內(nèi)的寄存器及備份區(qū)域內(nèi)的SRAM數(shù)據(jù)會(huì)被保存,不受功耗模式影響。

3.睡眠模式實(shí)驗(yàn)

下面代碼利用編譯器內(nèi)置函數(shù)__WFI()進(jìn)入睡眠,任何中斷將退出睡眠(實(shí)驗(yàn)使用串口中斷和外部中斷)。利用串口將芯片狀態(tài)信息發(fā)送出來(lái)。可以先把代碼復(fù)制到工程編譯下載,實(shí)驗(yàn)現(xiàn)象通過(guò)串口上位機(jī)觀察,如果有可調(diào)電源的話,可以對(duì)比正常工作和睡眠模式下的電流大小,正常來(lái)說(shuō)睡眠模式下功率低,那么電流會(huì)比正常工作下低。下面程序并不復(fù)雜,程序進(jìn)入while循環(huán)延時(shí)一段時(shí)間就會(huì)進(jìn)入睡眠狀態(tài),利用上位機(jī)向串口發(fā)送數(shù)據(jù)或者將PA.0引腳接電源都可產(chǎn)生中斷,從而退出睡眠模式。

#include "stm32f10x.h" #include "stdio.h"static void EXTI_Key_Config(void); static void NVIC_Configuration(void); static void USART1_Config(void); static void Delay(__IO u32 nCount);int main(void) { USART1_Config();EXTI_Key_Config();//配置中斷控制器NVICNVIC_Configuration();while(1){printf("STM32正常運(yùn)行.\r\n");Delay(0xfffff);//NVIC_SystemLPConfig(NVIC_LP_SLEEPONEXIT,DISABLE);//調(diào)用__WFI時(shí)立即進(jìn)入睡眠NVIC_SystemLPConfig(NVIC_LP_SLEEPONEXIT,ENABLE);//調(diào)用__WFI時(shí),等待系統(tǒng)從最低優(yōu)先級(jí)的中斷處理程序中退出后進(jìn)入睡眠printf("STM32進(jìn)入睡眠.\r\n");__WFI();//WFI指令進(jìn)入睡眠//開(kāi)始等待中斷喚醒Delay(0xfffff);printf("已退出睡眠模式.\r\n");} }static void EXTI_Key_Config(void) {GPIO_InitTypeDef GPIO_InitStructure;EXTI_InitTypeDef EXTI_InitStructure;//開(kāi)啟外設(shè)時(shí)鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);//初始化 GPIOA.0 設(shè)置為下拉輸入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_Init(GPIOA, &GPIO_InitStructure);//GPIOA.0 中斷線配置GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);//GPIOA.0 中斷初始化配置EXTI_InitStructure.EXTI_Line=EXTI_Line0;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//上升沿時(shí)進(jìn)入中斷EXTI_InitStructure.EXTI_LineCmd = ENABLE;//初始化外設(shè)EXTI寄存器EXTI_Init(&EXTI_InitStructure); }void USART1_Config(void) {GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;//配置串口1(USART1)時(shí)鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);//配置串口1(USART1 Tx (PA.09))GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//配置串口1 USART1 Rx (PA.10)GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);//串口1模式(USART1 mode)配置 USART_InitStructure.USART_BaudRate = 9600;//一般設(shè)置為9600;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No ;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure);USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//開(kāi)啟中斷USART_Cmd(USART1, ENABLE); //使能串口 }int fputc(int ch, FILE *f)//重寫標(biāo)準(zhǔn)庫(kù)的fputc函數(shù) {//將Printf內(nèi)容發(fā)往串口USART_SendData(USART1, (unsigned char) ch);while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET); return (ch); }static void NVIC_Configuration(void) {NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);//使能外部中斷 PA.0NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_Init(&NVIC_InitStructure);//使能串口1中斷 }void Delay(__IO u32 nCount) //簡(jiǎn)單的延時(shí)函數(shù) {for(; nCount != 0; nCount--); }

在stm32f10x_it.c文件加入:

#include "delay.h" void EXTI0_IRQHandler(void) { Delay(0xFFFFF);//防抖//檢查指定的EXTI0線路觸發(fā)請(qǐng)求發(fā)生與否if(EXTI_GetITStatus(EXTI_Line0) != RESET) { printf("按鍵中斷喚醒.\r\n");}//清除EXTI0線路掛起位EXTI_ClearITPendingBit(EXTI_Line0); }void USART1_IRQHandler(void) {unsigned char code;if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){ code=USART_ReceiveData(USART1);printf("串口中斷喚醒.\r\n");} } 睡眠模式的各種特性特性??????????????????????????????????????????????????????????????????????????????????????? 說(shuō)明
立即睡眠在執(zhí)行__WFI或__WFE指令時(shí)立即進(jìn)入睡眠模式
退出時(shí)睡眠在退出優(yōu)先級(jí)最低的中斷服務(wù)程序后才進(jìn)入睡眠模式
進(jìn)入方式

內(nèi)核寄存器SLEEPDEEP=0,然后調(diào)用WFI或者WFE指令即可進(jìn)入睡眠模式

另外若內(nèi)核寄存器SLEEPONEXIT=0,進(jìn)入“立即睡眠”模式;SLEEPONEXIT=1,進(jìn)入“退出時(shí)睡眠”

喚醒方式

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

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

睡眠時(shí)關(guān)閉內(nèi)核時(shí)鐘,內(nèi)核停止,而外設(shè)正常運(yùn)行,在軟件上表現(xiàn)為不再執(zhí)行新的代碼。這個(gè)狀態(tài)會(huì)保留睡眠前的內(nèi)核寄存器、內(nèi)存數(shù)據(jù)(RAM數(shù)據(jù)),所有的I/O引腳都保持它們?cè)谶\(yùn)行模式時(shí)的狀態(tài)
喚醒延時(shí)無(wú)延時(shí)
喚醒后若有中斷喚醒,先進(jìn)入中斷,退出中斷服務(wù)程序后,接著執(zhí)行WFI指令后的程序;若由事件喚醒,直接執(zhí)行WFE后的程序

注意:在系統(tǒng)處于睡眠低功耗模式(包括后面介紹的停止模式、待機(jī)模式)時(shí),不能用下載器進(jìn)行程序下載,所以下載程序時(shí)要先把系統(tǒng)喚醒。或者使用如下方法:按著板子的復(fù)位鍵,點(diǎn)擊電腦端的“下載”,然后松開(kāi)復(fù)位鍵,就能正常給板子下載程序了。

4.停止模式實(shí)驗(yàn)

停止模式是在Cortex?-M3的深睡眠模式基礎(chǔ)上結(jié)合了外設(shè)的時(shí)鐘控制機(jī)制,在停止模式下電壓調(diào)節(jié)器可運(yùn)行在正常或低功耗模式。此時(shí)在1.8V供電區(qū)域的的所有時(shí)鐘都被停止,PLL、HSI和HSE RC振蕩器的功能被禁止,SRAM和寄存器內(nèi)容被保留下來(lái)。

停止模式的功耗比睡眠模式更低,代碼操作上相對(duì)比睡眠模式復(fù)雜一點(diǎn)。跟睡眠模式的喚醒不同,只有EXTI線的中斷才能退出停止模式,因?yàn)槠渌庠O(shè)在停止模式時(shí)被關(guān)閉,并不能響應(yīng)中斷。將mani函數(shù)替換為下面代碼,其他不變:

int main(void) { USART1_Config();EXTI_Key_Config();NVIC_Configuration();//配置中斷控制器NVICRCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能電源管理單元的時(shí)鐘while(1){printf("STM32正常運(yùn)行.\r\n");Delay(0xfffff);printf("STM32進(jìn)入停止模式.\r\n");PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);//進(jìn)入停止模式,設(shè)置電壓調(diào)節(jié)器為低功耗模式,等待中斷喚醒//PWR_EnterSTOPMode(PWR_Regulator_ON,PWR_STOPEntry_WFI);//進(jìn)入停止模式,設(shè)置電壓調(diào)節(jié)器為正常模式,等待中斷喚醒//開(kāi)始等待任意EXTI線中斷喚醒SystemInit();//喚醒后需要恢復(fù)系統(tǒng)時(shí)鐘,因?yàn)橥顺鐾V鼓J胶?#xff0c;系統(tǒng)默認(rèn)使用的HSI作為系統(tǒng)時(shí)鐘/*實(shí)際上在運(yùn)行main函數(shù)前,會(huì)先執(zhí)行SystemInit函數(shù)以配置系統(tǒng)時(shí)鐘,這個(gè)在啟動(dòng)文件里可以看到。*///剛退出停止模式時(shí),使用HSI作為系統(tǒng)時(shí)鐘,回影響串口波特率//輸出不對(duì),在重新配置時(shí)鐘后才能使用串口的輸出Delay(0xfffff);printf("已退出停止模式.\r\n");} } 停止模式的各種特性特性說(shuō)明
調(diào)壓器低功耗模式調(diào)壓器可工作在正常模式或低功耗模式,可進(jìn)一步降低功耗
進(jìn)入方式

內(nèi)核寄存器SLEEPDEEP=1,PWR_CR寄存器的PDDS=0,然后調(diào)用WFI或者WFE指令即可進(jìn)入睡眠模式

PWR_CR寄存器的LPDS=0時(shí),調(diào)壓器工作在正常模式,LPDS=1時(shí)工作在低功耗模式

除了通過(guò)配置寄存器,還可以直接調(diào)用標(biāo)準(zhǔn)庫(kù)函數(shù)PWR_EnterSTOPMode,如上代碼

喚醒方式

如果是WFI指令進(jìn)入停止模式的,可使用任意EXTI線的中斷喚醒

如果是WFE指令進(jìn)入停止模式的,可使用任意配置為事件模式的EXTI線事件喚醒

停止時(shí)內(nèi)核停止,外設(shè)也停止。這個(gè)狀態(tài)會(huì)保留停止前的內(nèi)核寄存器、內(nèi)存的數(shù)據(jù)(RAM)
喚醒方式基礎(chǔ)延時(shí)是HSI振蕩器的啟動(dòng)時(shí)間,若調(diào)壓器工作在低功耗模式,還需要加上調(diào)壓器從低功耗模式切換至正常模式下的時(shí)間
喚醒后若有中斷喚醒,先進(jìn)入中斷,退出中斷服務(wù)程序后,接著執(zhí)行WFI指令后的程序;若由事件喚醒,直接執(zhí)行WFE后的程序。喚醒后,STM32會(huì)使用HSI作為系統(tǒng)時(shí)鐘

5.待機(jī)模式實(shí)驗(yàn)

待機(jī)模式可實(shí)現(xiàn)系統(tǒng)的最低功耗。該模式是在Cortex-M3深睡眠模式時(shí)關(guān)閉電壓調(diào)節(jié)器。整個(gè)1.8V供電區(qū)域被斷電。PLL、HSI和HSE振蕩器也被斷電。SRAM和寄存器內(nèi)容丟失。只有備份的寄存器和待機(jī)電路維持供電。也就是說(shuō)從待機(jī)模式喚醒后,由于沒(méi)有之前代碼的運(yùn)行記錄,只能對(duì)芯片復(fù)位,重新檢測(cè)boot條件,從頭開(kāi)始執(zhí)行程序。它有4種喚醒方式,分別是WAUP(PA0)引腳的上升沿、RTC鬧鐘事件、NRST引腳的復(fù)位和IWDG(獨(dú)立看門狗)復(fù)位。

我們不需要對(duì)PA.0引腳進(jìn)行如上面的初始化,也不需要初始化一個(gè)外部中斷,將下面兩個(gè)函數(shù)替換,其余保持不變:

int main(void) { USART1_Config();//EXTI_Key_Config();//配置中斷控制器NVICNVIC_Configuration();RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能電源管理單元的時(shí)鐘if(PWR_GetFlagStatus(PWR_FLAG_WU)){printf("\r\n待機(jī)模式復(fù)位.\r\n");}else{printf("\r\n非待機(jī)模式復(fù)位.\r\n");}while(1){printf("STM32正常運(yùn)行.\r\n");Delay(0xfffff);printf("STM32進(jìn)入待機(jī)模式.\r\n");PWR_ClearFlag(PWR_FLAG_WU);//清除喚醒標(biāo)志狀態(tài)PWR_WakeUpPinCmd(ENABLE);//使能Wake引腳的喚醒功能,使能PA0PWR_EnterSTANDBYMode();//進(jìn)入待機(jī)模式} }static void NVIC_Configuration(void) {NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //NVIC_Init(&NVIC_InitStructure);//使能外部中斷 PA.0NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_Init(&NVIC_InitStructure);//使能串口1中斷 }

程序下載后,按下復(fù)位鍵,串口會(huì)打印非待機(jī)模式復(fù)位,接著運(yùn)行while函數(shù),延時(shí)后進(jìn)入待機(jī)模式,等待喚醒,在PA0引腳給上升沿信號(hào),串口打印已待機(jī)模式復(fù)位,代碼重頭開(kāi)始執(zhí)行。

待機(jī)模式的各種特性特性說(shuō)明
進(jìn)入方式內(nèi)核寄存器SLEEPDEEP=1,PWR_CR寄存器中的PDDS=1,PWR_CR寄存器中的喚醒狀態(tài)為WUF=0,然后調(diào)用WFI或者調(diào)用WFE指令即可進(jìn)入待機(jī)模式(沒(méi)區(qū)別)
喚醒方式通過(guò)WAUP引腳的上升沿,RTC鬧鐘、喚醒、入侵、時(shí)間戳事件或NRST引腳外部復(fù)位及IWDG復(fù)位喚醒
待機(jī)時(shí)內(nèi)核停止,片上外設(shè)也停止;內(nèi)核寄存器、內(nèi)存的數(shù)據(jù)會(huì)丟失;除了復(fù)位引腳、RTC_AF1引腳及WAUP引腳外,其他I/O口均工作在高阻態(tài)
喚醒延遲芯片復(fù)位時(shí)間
喚醒后相當(dāng)于芯片復(fù)位,在程序表現(xiàn)為從頭開(kāi)始執(zhí)行代碼(等于重新上電)

最后,除了利用上面三種模式實(shí)現(xiàn)低功耗外,還可以在運(yùn)行模式下,關(guān)閉某些外設(shè)時(shí)鐘或者利用分頻器降低外設(shè)時(shí)鐘,同樣也可以減低系統(tǒng)功耗。電池備份區(qū)域部分這里沒(méi)有細(xì)說(shuō),后面單獨(dú)一篇介紹。

?

?

道雖邇,不行不至,事雖小,不為不成。——《荀子》

總結(jié)

以上是生活随笔為你收集整理的stm32之电源管理(实现低功耗)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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