本課講為大家講解CKS32F4xx系列產品的低功耗模式之睡眠(Sleep)模式。MCU為滿足某些應用場景:如小型化低容量設備,長期監測設備等,低功耗應運而生,其中根據需求,用戶可以選擇睡眠模式、停止模式及待機模式,今天本課將帶大家一起配置睡眠模式。
電源系統及低功耗
首先,MCU要做到低功耗,必須要知道電源是怎么分配的,CKS32F4xx系列的電源系統框圖如下所示:
電源框圖中,第1部分是備份域電路,由VDD或Vbat電池供電,接入3V紐扣電池后,可保證VDD掉電時,能夠保留關鍵數據。
第2部分為電壓調壓器供電,由于其輸出約為1.2V,又稱1.2V域。1.2V域給除備份域和待機電路以外的所有數字電路供電,在低功耗的三種模式中,1.2V域也對應三種狀態:正常開啟、低功耗和關閉。
第3部分為A/D轉換器及參考電壓供電,故為VDDA供電區,目的是使用獨立電源能更好的濾波,從而提高精度,也可以在Vref上外接高精度電源,進一步提高進度。
所謂低功耗,即是關閉相應功耗路線,1)睡眠模式僅關閉第二部分中的內核時鐘;2)停止模式關閉所有時鐘,且調壓器可選擇正常開啟或低功耗運行;3)待機模式關閉所有時鐘以及調壓器,僅保留備份域及待機電路;
外部中斷喚醒睡眠模式驗證
接下來舉一個低功耗睡眠模式且由外部中斷喚醒的例子,睡眠模式比較簡單,直接調用編譯器內置函數__WFE()或__WFI(),取決于使用事件喚醒還是中斷喚醒;另外默認SCR(系統控制寄存器)的SLEEPDEEP位和SLEEPONEXIT位置0,效果是立即觸發睡眠,如果將SLEEPONEXIT置1可以設置成中斷退出后觸發睡眠,也就是說內核將會只在中斷內工作。
驗證流程如下圖,電源串聯萬用表電流檔,直觀比較睡眠模式開啟前后的電流大小。
程序配置及中斷服務函數
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;//設置引腳為輸入模式 GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;//不上拉也不下拉 GPIO_Init(GPIOE, GPIO_InitStructure);//使用上面的結構體初始化按鍵
2)總中斷NVIC初始化如下,GPIO外部中斷源一共對應7個通道,PX0~PX4分別對應EXTI0~EXTI4的5個通道,PX5~PX9對應通道EXTI_9_5,PX10~PX15 對應通道EXTI_15_10,故PE10對應中斷服務函數EXTI15_10_IRQHandler()。
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//配置NVIC為優先級組1 NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;//按鍵PE10使用中斷源EXTI15_10 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//配置搶占優先級:1 NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//配置子優先級:1 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//使能中斷通道 NVIC_Init( NVIC_InitStructure);//使用上面的結構體初始化總中斷
3)外部中斷配置如下,主要在初始化中對中斷屏蔽寄存器EXTI_IMR及下降沿觸發選擇寄存器EXTI_FTSR配置,將EXTI_IMR的MR10位置1,可開放相應通道中斷請求。
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;//下降沿觸發 EXTI_InitStructure.EXTI_LineCmd=ENABLE;//使能中斷/事件線 EXTI_Init( EXTI_InitStructure);//使用上面的結構體初始化外部中斷:EXTI_IMR的MR10位置1等
4)中斷服務函數如下,觸發后驗證標志位,確保發生的是外部線中斷;其次外部中斷線發生事件后,中斷掛起寄存器EXTI_PR會置1,通過 EXTI_ClearITPendingBit再次在PR寫入1,從而清除它,進入下一次外部中斷等待。
voidEXTI15_10_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line10)!=RESET)//驗證是否產生了外部線中斷 { Delay(0x1FFFFFF);//簡單延時驗證電流 EXTI_ClearITPendingBit(EXTI_Line10);//清除標志位 } }
主函數及現象
Main函數首先初始化GPIO、NVIC中斷、外部中斷,進入主循環后先延遲觀測電流,測得19.3mA,延遲后,__WFI()自動觸發睡眠模式,電流測得13.3mA,如果不進行按鍵操作,MCU將一直睡眠,不再執行任何代碼,此時按下輕觸開關,觸發外部中斷,電流回升至19.3mA,睡眠模式喚醒時間無延遲,執行完中斷服務程序后,會回到代碼睡眠時的句段,繼續執行。PS:如果需要設置成中斷退出后觸發睡眠模式,則將SLEEPONEXIT置1。
intmain(void) { EXTI_Config();//配置及初始化GPIO、NVIC中斷、外部中斷 while(1) { Delay(0x1FFFFFF); //SCB->SCR|=SCB_SCR_SLEEPONEXIT_Msk;//如需設置成中斷退出后觸發睡眠模式 __WFI();//進入睡眠模式,電流從19.3mA降至13.3mA } }
來源:中科芯MCU
-
mcu
+關注
關注
146文章
16984瀏覽量
350293 -
轉換器
+關注
關注
27文章
8624瀏覽量
146861 -
低功耗
+關注
關注
10文章
2362瀏覽量
103592 -
電源系統
+關注
關注
3文章
612瀏覽量
37751
發布評論請先 登錄
相關推薦
評論