【環(huán)球速看料】CKS32F4xx系列MCU的低功耗模式之睡眠模式

2023-06-26 10:12:15 來源:中科芯MCU

本課講為大家講解CKS32F4xx系列產(chǎn)品的低功耗模式之睡眠(Sleep)模式。MCU為滿足某些應(yīng)用場景:如小型化低容量設(shè)備,長期監(jiān)測設(shè)備等,低功耗應(yīng)運而生,其中根據(jù)需求,用戶可以選擇睡眠模式、停止模式及待機模式,今天本課將帶大家一起配置睡眠模式。

電源系統(tǒng)及低功耗

首先,MCU要做到低功耗,必須要知道電源是怎么分配的,CKS32F4xx系列的電源系統(tǒng)框圖如下所示:


(資料圖)

電源框圖中,第1部分是備份域電路,由VDD或Vbat電池供電,接入3V紐扣電池后,可保證VDD掉電時,能夠保留關(guān)鍵數(shù)據(jù)。

第2部分為電壓調(diào)壓器供電,由于其輸出約為1.2V,又稱1.2V域。1.2V域給除備份域和待機電路以外的所有數(shù)字電路供電,在低功耗的三種模式中,1.2V域也對應(yīng)三種狀態(tài):正常開啟、低功耗和關(guān)閉。

第3部分為A/D轉(zhuǎn)換器及參考電壓供電,故為VDDA供電區(qū),目的是使用獨立電源能更好的濾波,從而提高精度,也可以在Vref上外接高精度電源,進一步提高進度。

所謂低功耗,即是關(guān)閉相應(yīng)功耗路線,1)睡眠模式僅關(guān)閉第二部分中的內(nèi)核時鐘;2)停止模式關(guān)閉所有時鐘,且調(diào)壓器可選擇正常開啟或低功耗運行;3)待機模式關(guān)閉所有時鐘以及調(diào)壓器,僅保留備份域及待機電路;

外部中斷喚醒睡眠模式驗證

接下來舉一個低功耗睡眠模式且由外部中斷喚醒的例子,睡眠模式比較簡單,直接調(diào)用編譯器內(nèi)置函數(shù)__WFE()或__WFI(),取決于使用事件喚醒還是中斷喚醒;另外默認SCR(系統(tǒng)控制寄存器)的SLEEPDEEP位和SLEEPONEXIT位置0,效果是立即觸發(fā)睡眠,如果將SLEEPONEXIT置1可以設(shè)置成中斷退出后觸發(fā)睡眠,也就是說內(nèi)核將會只在中斷內(nèi)工作。

驗證流程如下圖,電源串聯(lián)萬用表電流檔,直觀比較睡眠模式開啟前后的電流大小。

程序配置及中斷服務(wù)函數(shù)

1)開啟時鐘及GPIO初始化如下,按鍵直連PE10,按下為低電平。

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE ,ENABLE);     //開啟按鍵GPIO口的時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); //由于使用外部中斷需要使能 SYSCFG 時鐘GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;           //選擇按鍵PE10的引腳   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;     //設(shè)置引腳為輸入模式GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;  //不上拉也不下拉GPIO_Init( GPIOE, &GPIO_InitStructure);            //使用上面的結(jié)構(gòu)體初始化按鍵

2)總中斷NVIC初始化如下,GPIO外部中斷源一共對應(yīng)7個通道,PX0~PX4分別對應(yīng)EXTI0~EXTI4的5個通道,PX5~PX9對應(yīng)通道EXTI_9_5,PX10~PX15 對應(yīng)通道EXTI_15_10,故PE10對應(yīng)中斷服務(wù)函數(shù)EXTI15_10_IRQHandler()。

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);          //配置NVIC為優(yōu)先級組1NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;   //按鍵PE10使用中斷源EXTI15_10NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //配置搶占優(yōu)先級:1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;       //配置子優(yōu)先級:1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;      //使能中斷通道NVIC_Init(&NVIC_InitStructure);                   //使用上面的結(jié)構(gòu)體初始化總中斷

3)外部中斷配置如下,主要在初始化中對中斷屏蔽寄存器EXTI_IMR及下降沿觸發(fā)選擇寄存器EXTI_FTSR配置,將EXTI_IMR的MR10位置1,可開放相應(yīng)通道中斷請求。

SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource10); //連接外部中斷源到PE10EXTI_InitStructure.EXTI_Line = EXTI_Line10; //選擇EXTI中斷源EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //選擇為中斷模式EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //下降沿觸發(fā)EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能中斷/事件線EXTI_Init(&EXTI_InitStructure); //使用上面的結(jié)構(gòu)體初始化外部中斷:EXTI_IMR的MR10位置1等

4)中斷服務(wù)函數(shù)如下,觸發(fā)后驗證標(biāo)志位,確保發(fā)生的是外部線中斷;其次外部中斷線發(fā)生事件后,中斷掛起寄存器EXTI_PR會置1,通過 EXTI_ClearITPendingBit再次在PR寫入1,從而清除它,進入下一次外部中斷等待。

void EXTI15_10_IRQHandler(void){  if(EXTI_GetITStatus(EXTI_Line10) != RESET)        //驗證是否產(chǎn)生了外部線中斷  {    Delay(0x1FFFFFF);                         //簡單延時驗證電流    EXTI_ClearITPendingBit(EXTI_Line10);         //清除標(biāo)志位  }  }

主函數(shù)及現(xiàn)象

Main函數(shù)首先初始化GPIO、NVIC中斷、外部中斷,進入主循環(huán)后先延遲觀測電流,測得19.3mA,延遲后,__WFI()自動觸發(fā)睡眠模式,電流測得13.3mA,如果不進行按鍵操作,MCU將一直睡眠,不再執(zhí)行任何代碼,此時按下輕觸開關(guān),觸發(fā)外部中斷,電流回升至19.3mA,睡眠模式喚醒時間無延遲,執(zhí)行完中斷服務(wù)程序后,會回到代碼睡眠時的句段,繼續(xù)執(zhí)行。PS:如果需要設(shè)置成中斷退出后觸發(fā)睡眠模式,則將SLEEPONEXIT置1。

int main(void){ EXTI_Config();      //配置及初始化GPIO、NVIC中斷、外部中斷  while(1)  {    Delay(0x1FFFFFF);        //SCB->SCR |= SCB_SCR_SLEEPONEXIT_Msk;  //如需設(shè)置成中斷退出后觸發(fā)睡眠模式    __WFI();            //進入睡眠模式,電流從19.3mA降至13.3mA  }}
審核編輯:湯梓紅

標(biāo)簽:

上一篇:在超純晶圓上堆疊超高純層的外延技術(shù)-全球最新
下一篇:最后一頁