本課講為大家講解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)先級組1 NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;//按鍵PE10使用中斷源EXTI15_10 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//配置搶占優(yōu)先級:1 NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//配置子優(yōu)先級:1 NVIC_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);//連接外部中斷源到PE10 EXTI_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ā)后驗證標志位,確保發(fā)生的是外部線中斷;其次外部中斷線發(fā)生事件后,中斷掛起寄存器EXTI_PR會置1,通過 EXTI_ClearITPendingBit再次在PR寫入1,從而清除它,進入下一次外部中斷等待。
voidEXTI15_10_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line10)!=RESET)//驗證是否產(chǎn)生了外部線中斷 { Delay(0x1FFFFFF);//簡單延時驗證電流 EXTI_ClearITPendingBit(EXTI_Line10);//清除標志位 } }
主函數(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。
intmain(void) { EXTI_Config();//配置及初始化GPIO、NVIC中斷、外部中斷 while(1) { Delay(0x1FFFFFF); //SCB->SCR|=SCB_SCR_SLEEPONEXIT_Msk;//如需設(shè)置成中斷退出后觸發(fā)睡眠模式 __WFI();//進入睡眠模式,電流從19.3mA降至13.3mA } }
來源:中科芯MCU
-
mcu
+關(guān)注
關(guān)注
146文章
17718瀏覽量
358363 -
轉(zhuǎn)換器
+關(guān)注
關(guān)注
27文章
8885瀏覽量
150189 -
低功耗
+關(guān)注
關(guān)注
10文章
2652瀏覽量
104398 -
電源系統(tǒng)
+關(guān)注
關(guān)注
3文章
662瀏覽量
38263
發(fā)布評論請先 登錄
相關(guān)推薦
MCU微課堂|CKS32F4xx系列產(chǎn)品時鐘配置
CKS32F4xx系列MCU的低功耗模式之睡眠模式

CKS32F4xx系列產(chǎn)品串口DMA傳輸
CKS32F4xx系列低功耗模式之STANDBY模式

CKS32F4xx系列RNG功能設(shè)置

評論