新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > stm32 低功耗設計[操作寄存器+庫函數]

        stm32 低功耗設計[操作寄存器+庫函數]

        作者: 時間:2016-11-25 來源:網絡 收藏
        stm32的低功耗模式有三種:
        • 睡眠模式(內核停止,外設運行)
        • 停機模式(所有時鐘都停止)
        • 待機模式(1.8V內核電源也關閉)
        在這三種模式中,最低功耗的是待機模式,在此模式下,最低只需要2uA左右的電流。整個1.8V供電區被斷電,PLL、HSI、HSE振蕩器都被關閉。SRAM和寄存器內容丟失。停機模式是次低功耗的的,其典型的電流損耗在20uA左右。最后就是睡眠模式。
        stm32低功耗一覽表
        這三種低功耗模式,喚醒后程序都會初始化運行。在例子中做了一番論證,結果如此。
        直接操作寄存器
        進入待機模式的通用步驟,其中涉及到2個寄存器,也就是電源控制寄存器(PWR_CR)和電源控制/狀態寄存器(PWR_CSR)。
        電源控制寄存器(PWR_CR),該寄存器的各位描述如下:
        這是一個低9位有效的寄存器。
        • DBP[8]:取消后備區域的寫保護 位 8 在復位后,RTC和后備寄存器處于被保護狀態以防意外寫入。0:禁止寫入RTC和后備寄存器 1:允許寫入RTC和后備寄存器
        • PLS[ 7:5]:PVD電平選擇。 這些位用于選擇電源電壓監測器的電壓閥值。
        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]:電源電壓監測器(PVD)使能。0:禁止PVD 1:開啟PVD
        • CSBF[3]:清除待機位,始終讀出為0。 0:無功效 1:清除SBF待機位(寫)
        • CWUF[2]:清除喚醒位,始終讀出為0。 0:無功效 1:2個系統時鐘周期后清除WUF喚醒位(寫)
        • PDDS[1]:掉電深睡眠,與LPDS位協同操作。 0:當CPU進入深睡眠時進入停機模式,調壓器的狀態由LPDS位控制。 1:CPU進入深睡眠時進入待機模式。
        • LPDS[0]:深睡眠下的低功耗。PDDS=0時,與PDDS位協同操作 0:在停機模式下電壓調壓器開啟 1:在停機模式下電壓調壓器處于低功耗模式

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

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

        待機相關代碼參見 system.c文件中


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 南宫市| 吴川市| 舟曲县| 天祝| 宜宾市| 霞浦县| 闻喜县| 筠连县| 龙海市| 监利县| 沙河市| 嫩江县| 依兰县| 建德市| 连城县| 周宁县| 萝北县| 彭泽县| 雷山县| 乐业县| 汝南县| 磐安县| 绥滨县| 大理市| 麻城市| 新建县| 怀来县| 娄底市| 卢湾区| 荥经县| 溧水县| 错那县| 滨海县| 宣汉县| 柳林县| 安吉县| 永城市| 德庆县| 安龙县| 时尚| 柏乡县|