<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > stm32 低功耗設(shè)計(jì)[操作寄存器+庫函數(shù)]

          stm32 低功耗設(shè)計(jì)[操作寄存器+庫函數(shù)]

          作者: 時(shí)間:2016-11-25 來源:網(wǎng)絡(luò) 收藏
          stm32的低功耗模式有三種:
          • 睡眠模式(內(nèi)核停止,外設(shè)運(yùn)行)
          • 停機(jī)模式(所有時(shí)鐘都停止)
          • 待機(jī)模式(1.8V內(nèi)核電源也關(guān)閉)
          在這三種模式中,最低功耗的是待機(jī)模式,在此模式下,最低只需要2uA左右的電流。整個(gè)1.8V供電區(qū)被斷電,PLL、HSI、HSE振蕩器都被關(guān)閉。SRAM和寄存器內(nèi)容丟失。停機(jī)模式是次低功耗的的,其典型的電流損耗在20uA左右。最后就是睡眠模式。
          stm32低功耗一覽表
          這三種低功耗模式,喚醒后程序都會(huì)初始化運(yùn)行。在例子中做了一番論證,結(jié)果如此。
          直接操作寄存器
          進(jìn)入待機(jī)模式的通用步驟,其中涉及到2個(gè)寄存器,也就是電源控制寄存器(PWR_CR)和電源控制/狀態(tài)寄存器(PWR_CSR)。
          電源控制寄存器(PWR_CR),該寄存器的各位描述如下:
          這是一個(gè)低9位有效的寄存器。
          • DBP[8]:取消后備區(qū)域的寫保護(hù) 位 8 在復(fù)位后,RTC和后備寄存器處于被保護(hù)狀態(tài)以防意外寫入。0:禁止寫入RTC和后備寄存器 1:允許寫入RTC和后備寄存器
          • PLS[ 7:5]:PVD電平選擇。 這些位用于選擇電源電壓監(jiān)測器的電壓閥值。
          000:2.2V 100:2.6V 001:2.3V 101:2.7V
          010:2.4V 110:2.8V 011:2.5V 111:2.9V
          • PVDE[4]:電源電壓監(jiān)測器(PVD)使能。0:禁止PVD 1:開啟PVD
          • CSBF[3]:清除待機(jī)位,始終讀出為0。 0:無功效 1:清除SBF待機(jī)位(寫)
          • CWUF[2]:清除喚醒位,始終讀出為0。 0:無功效 1:2個(gè)系統(tǒng)時(shí)鐘周期后清除WUF喚醒位(寫)
          • PDDS[1]:掉電深睡眠,與LPDS位協(xié)同操作。 0:當(dāng)CPU進(jìn)入深睡眠時(shí)進(jìn)入停機(jī)模式,調(diào)壓器的狀態(tài)由LPDS位控制。 1:CPU進(jìn)入深睡眠時(shí)進(jìn)入待機(jī)模式。
          • LPDS[0]:深睡眠下的低功耗。PDDS=0時(shí),與PDDS位協(xié)同操作 0:在停機(jī)模式下電壓調(diào)壓器開啟 1:在停機(jī)模式下電壓調(diào)壓器處于低功耗模式

          本文引用地址:http://www.ex-cimer.com/article/201611/321195.htm
          電源控制寄存器(PWR_CR),該寄存器的各位描述如下:
          低9位有效的寄存器,只用了4位,其他位保留
          • EWUP[8]:使能WKUP引腳 ,在系統(tǒng)復(fù)位時(shí)清除這一位。
          • PVDO[2]:PVD輸出 ,當(dāng)PVD被PVDE位使能后該位才有效。
          • SBF[1]:待機(jī)標(biāo)志。
          • WUF[0]:喚醒標(biāo)志。
          待機(jī)函數(shù)實(shí)現(xiàn):(參見 system.c文件)

          01//THUMB指令不支持匯編內(nèi)聯(lián)
          02//采用如下方法實(shí)現(xiàn)執(zhí)行匯編指令WFI
          03__asmvoidWFI_SET(void)
          04{
          05WFI;
          06}
          07
          08
          09//進(jìn)入待機(jī)模式
          10//參數(shù)說明:
          11// var = 0 ,設(shè)定為睡眠模式
          12// var = 1 ,設(shè)定為停機(jī)模式,電流消耗在20uA左右
          13// var = 2 ,設(shè)定為待機(jī)模式,電流消耗在2uA左右
          14
          15voidSys_Standby(u8 var)
          16{
          17
          18RCC->APB1ENR |= 1<<28;//使能電源時(shí)鐘
          19
          20switch(var)
          21{
          22case0:{break; }//WFI進(jìn)入睡眠模式
          23
          24case1:{//PDDS+LPDS+SLEEPDEEP+WFI進(jìn)入停機(jī)模式
          25
          26SCB->SCR |= 1<<2;//使能SLEEPDEEP位 (SYS->CTRL)
          27PWR->CR |= 1<<0;//LPDS置位
          28PWR->CR |= 1<<1;//PDDS置位
          29break;
          30}
          31
          32case2:{//PDDS+SLEEPDEEP+WFI進(jìn)入待機(jī)模式
          33
          34SCB->SCR |= 1<<2;//使能SLEEPDEEP位 (SYS->CTRL)
          35PWR->CR|=1<<1;//PDDS置位
          36break;
          37}
          38}
          39
          40PWR->CR |= 1<<2;//清除Wake-up 標(biāo)志
          41PWR->CSR |= 1<<8;//允許寫入RTC和BKP寄存器
          42WFI_SET();//執(zhí)行WFI指令
          43}
          44
          45
          46//系統(tǒng)軟復(fù)位
          47
          48voidSys_Soft_Reset(void)
          49{
          50SCB->AIRCR =0X05FA0000|(u32)0x04;
          51}
          代碼如下:(system.h 和stm32f10x_it.h等相關(guān)代碼參照stm32 直接操作寄存器開發(fā)環(huán)境配置)
          User/main.c
          01#include
          02#include "system.h"
          03#include "wdg.h"
          04#include "exti.h"
          05
          06#define LED1 PAout(4)
          07#define LED2 PAout(5)
          08
          09#define PWR_MODE_Sleep 0 //開啟睡眠模式
          10
          11#define PWR_MODE_STOP 1 //開啟停機(jī)模式
          12
          13#define PWR_MODE_STANDBY 0 //開啟待機(jī)模式
          14
          15
          16voidGpio_Init(void);
          17
          18intmain(void)
          19{
          20u32 i= 10,j=10;
          21
          22Rcc_Init(9);//系統(tǒng)時(shí)鐘設(shè)置
          23
          24Exti_Init(GPIO_A,0,FTIR);//設(shè)置PA1為下降沿觸發(fā),參數(shù)GPIO_x 和 FTIR 在system.h中有定義
          25
          26Nvic_Init(0,0,EXTI0_IRQChannel,0);//設(shè)置外部中斷
          27
          28Gpio_Init();
          29
          30while(i--){
          31
          32LED1 = !LED1;
          33
          34delay(30000);//延時(shí)30ms
          35
          36}
          37
          38#if PWR_MODE_Sleep //睡眠模式,外部中斷喚醒后會(huì)復(fù)位
          39
          40Sys_Standby(0);
          41
          42#elif PWR_MODE_STOP //停機(jī)模式,外部中斷喚醒,喚醒后復(fù)位
          43
          44Sys_Standby(1);
          45
          46#elif PWR_MODE_STANDBY //待機(jī)模式,由獨(dú)立看門狗喚醒,喚醒后會(huì)初始化,LED閃爍5次后,暗一段時(shí)間
          47
          48Iwdg_Init(3,2000);//設(shè)置為1.6s內(nèi)不喂狗復(fù)位,使用獨(dú)立看門狗喚醒,喚醒后復(fù)位
          49
          50Sys_Standby(2);
          51
          52#endif
          53
          54
          55while(j--){//這段程序用于檢驗(yàn)喚醒后是否會(huì)繼續(xù)運(yùn)行后面的程序,還是會(huì)導(dǎo)致復(fù)位
          56
          57LED2 = !LED2;
          58
          59delay(10000);//延時(shí)10ms
          60
          61}
          62}
          63
          64
          65voidGpio_Init(void)
          66{
          67RCC->APB2ENR|=1<<2;//使能PORTA時(shí)鐘
          68
          69GPIOA->CRL&=0x0000FFFF;// PA0~3設(shè)置為浮空輸入,PA4~7設(shè)置為推挽輸出
          70GPIOA->CRL|=0x33334444;
          71
          72}
          User/stm32f10x_it.c
          01#include "stm32f10x_it.h"
          02#include "system.h"
          03
          04#define LED1 PAout(4)
          05#define LED2 PAout(5)
          06#define LED3 PAout(6)
          07#define LED4 PAout(7)
          08
          09
          10voidEXTI0_IRQHandler(void)
          11{
          12LED4 = !LED4;
          13EXTI->PR = 1<<0;//清除中斷標(biāo)志位
          14}

          待機(jī)相關(guān)代碼參見 system.c文件中


          上一頁 1 2 下一頁

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();