在本章節(jié)中,首先向大家介紹電源系統(tǒng)結(jié)構(gòu),接著簡述三種低功耗模式,最后重點介紹CKS32F4xx系列如何進入STOP模式以及使用按鍵實現(xiàn)中斷喚醒。
CKS32F4xx電源系統(tǒng)介紹
CKS32F4xx系列的電源系統(tǒng)框圖
CKS32F4xx系列的器件工作電壓(VDD)為1.8~3.6V。
①備份域電路:包含LSE振蕩器、RTC、備份寄存器及備份SRAM。電源開關自動切換VDD和VBAT供電。
②調(diào)壓器電路(1.2V域):為備份域及待機電路外的所有數(shù)字電路供電,其中包括內(nèi)核、數(shù)字外設及RAM。
③ADC電路和參考電壓:ADC工作電源使用VDDA引腳輸入,使用VSSA作為獨立的地連接,VREF引腳則為ADC提供測量使用的參考電壓。
低功耗模式簡介
CKS32F4xx系列按功耗由高到低排列,分別是運行、睡眠、停止(STOP)和待機(STANDBY)四種工作模式。上電復位后,CKS32F4xx系列會處于正常運行狀態(tài),當不需要繼續(xù)運行內(nèi)核時,就可以選擇進入后面的三種低功耗模式降低功耗。這三種模式中,電源消耗不同、喚醒時間不同、喚醒源不同,用戶需要根據(jù)應用需求,選擇最佳的低功耗模式。其中,最低功耗的是待機模式,停機模式(STOP)是次低功耗的,最后是睡眠模式。低功耗相關寄存器主要有SCB_SCR、PWR_CR、PWR_CSR,進入各種低功耗需要調(diào)用的指令有WFI或WFE,以下做簡要介紹。
1.SCB_SCR(系統(tǒng)控制寄存器)
若進入停止模式or待機模式,需將SLEEPDEEP置1。
2.PWR_CR(電源控制寄存器)
若進入停止模式,需將PDDS清0,LPDS選調(diào)節(jié)器模式;若進入待機模式,需將PDDS置1,清除喚醒位CWUF。
3.PWR_CSR(電源控制/狀態(tài)寄存器)
若芯片處于待機模式下,需使用使用WKUP引腳喚醒并需要清除WUF標記位。
注:WKUP上升沿才能喚醒待機狀態(tài),清除WUF標記位實則需操作CWUF位。
4.WFI與WFE指令
實質(zhì)上都是內(nèi)核指令,在庫文件core_cmInstr.h中把這些指令封裝成了函數(shù),調(diào)用它們都能進入低功耗模式。調(diào)用時,需要使用函數(shù)的格式“__WFI();”和“__WFE();”,這是因為__w?及__wfe是編譯器內(nèi)置的函數(shù),函數(shù)內(nèi)部使用調(diào)用了相應的匯編指令。其中WFI指令決定了它需要用中斷喚醒,而WFE則決定了它可用事件來喚醒。
以下表格是對三種低功耗模式的簡要概述。
本章中,我們主要對CKS32F4xx系列的低功耗模式—停止模式(STOP)做詳細介紹。該模式中,由于其1.2V區(qū)域的部分電源沒有關閉,會保留內(nèi)核的寄存器、內(nèi)存的信息,所以從STOP模式喚醒,并重新開啟時鐘后,還可以從上次停止處繼續(xù)執(zhí)行代碼。停止模式可以由任意一個外部中斷(EXTI)喚醒。在停止模式中可以選擇電壓調(diào)節(jié)器為開模式或低功耗模式,可選擇內(nèi)部FLASH工作在正常模式或掉電模式。那我們?nèi)绾芜M入STOP模式,可以按照下述表格中的步驟執(zhí)行即可:
CKS32F4xx系列標準庫把進入STOP模式這部分的操作封裝到PWR_EnterSTOPMode函數(shù)中了,并且需要注意的是進入STOP模式后,CKS32F4xx系列的所有IO都保持在停止前的狀態(tài),且當它被喚醒時,CKS32F4xx系列使用HSI作為系統(tǒng)時鐘運行,由于系統(tǒng)時鐘會影響很多外設的工作狀態(tài),所以一般我們在喚醒后會重新開啟HSE,把系統(tǒng)時鐘設置為原來的狀態(tài)。上面表格也提到在停止模式中,還可以控制FLASH的供電,使用庫函數(shù)PWR_FlashPowerDownCmd配置進入掉電狀態(tài)還是正常供電狀態(tài),本質(zhì)上是封裝了一個對FPDS寄存器位操作的語句,使用時需要再進入停止模式前被調(diào)用,可以進一步降低功耗。
采用EXTI喚醒STOP模式實驗
程序設計主要要點如下:
①初始化用于喚醒的中斷按鍵;
②配置不用的I/O端口;
③設置停滯狀態(tài)是FLASH掉電以及選擇電壓調(diào)節(jié)器的工作模式并進入停止狀態(tài);
④使用按鍵中斷喚醒芯片;
⑤重啟HSE時鐘,使系統(tǒng)完全恢復停止之前的狀態(tài)。
1)初始化用于喚醒的中斷按鍵
此處選擇連接PB1引腳的按鍵用于將芯片從STOP模式喚醒,代碼如下:
voidCKS_EXTI_Init(void) { GPIO_InitTypeDefGPIO_InitStructure; EXTI_InitTypeDefEXTI_InitStructure; NVIC_InitTypeDefNVIC_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE); /*ConfigurePB1asEXTI*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP; GPIO_Init(GPIOB, GPIO_InitStructure); /*ConfigurePB1toEXTIline1*/ SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB,EXTI_PinSource1); /*EXTIconfiguration*/ EXTI_InitStructure.EXTI_Line=EXTI_Line1; EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd=ENABLE; EXTI_Init( EXTI_InitStructure); /*NVICconfiguration*/ NVIC_InitStructure.NVIC_IRQChannel=EXTI1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1; NVIC_InitStructure.NVIC_IRQChannelSubPriority=1; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init( NVIC_InitStructure); }
在CKS_EXTI_Init函數(shù)中,首先使能GPIOB時鐘,又因為用到外部中斷,所以必須先使能SYSCFG時鐘,接著對GPIOB初始化為上拉輸入,并調(diào)用函數(shù) SYSCFG_EXTILineConfig配置GPIOB.1連接到中斷線1,最后初始化EXTI中斷線以及NVIC中斷優(yōu)先級。
voidEXTI1_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line1)!=RESET) { EXTI_ClearITPendingBit(EXTI_Line1); } }
在中斷服務函數(shù)EXTI1_IRQHandler內(nèi),主要是清除LINE1上的中斷標志位。
2)配置未使用的I/O口
進入STOP模式之前,需要對I/O進行處理,若不處理很多配置為輸入浮空的I/O口在受到外界干擾的時候,狀態(tài)不定,消耗大量的電流,代碼如下:
voidCKS_Stop_Mode_IO_Set(void) { /*setpinsnotusedtoAIN*/ GPIO_InitTypeDefGPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOI,ENABLE); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; GPIO_Init(GPIOA, GPIO_InitStructure); GPIO_Init(GPIOC, GPIO_InitStructure); GPIO_Init(GPIOD, GPIO_InitStructure); GPIO_Init(GPIOF, GPIO_InitStructure); GPIO_Init(GPIOG, GPIO_InitStructure); GPIO_Init(GPIOH, GPIO_InitStructure); GPIO_Init(GPIOI, GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=(~GPIO_Pin_1); GPIO_Init(GPIOB, GPIO_InitStructure); }
由上述代碼可知,我們將沒用到的I/O全部設置為模擬輸入,保留PB1作為按鍵,產(chǎn)生外部中斷來將芯片從STOP模式喚醒。
3)芯片進入STOP模式
該部分代碼一般是程序執(zhí)行一段時間再調(diào)用,我們先使用PWR_FlashPowerDownCmd配置停止模式下FLASH使用掉電模式,隨后調(diào)用PWR_EnterSTOPMode把調(diào)壓器設置在低功耗模式,最后使用WFI指令進入停止狀態(tài)。由上文可知,WFI進入停止模式可由任意的EXTI的中斷喚醒,所以此處使用按鍵中斷喚醒是可行的,代碼如下:
voidCKS_Set_Stop_Mode(void) { PWR_FlashPowerDownCmd(ENABLE); PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI); }
4)主函數(shù)配置
本例程中主函數(shù)主要對上文所述函數(shù)調(diào)用,程序編譯下載至開發(fā)板,先進行相關外設初始化后,直接進入STOP模式,此時按下按鍵,芯片可立即被喚醒,隨即又進入STOP模式,循環(huán)往復,主函數(shù)代碼如下:
intmain(void) { GPIO_Configuration(); CKS_EXTI_Init(); CKS_Stop_Mode_IO_Set(); while(1) { CKS_Stop_Mode_IO_Set(); CKS_Set_Stop_Mode(); SystemInit(); Delay(0xffffff); } }
來源:中科芯MCU
-
mcu
+關注
關注
146文章
16665瀏覽量
347751 -
低功耗
+關注
關注
10文章
2286瀏覽量
103321 -
電源系統(tǒng)
+關注
關注
3文章
596瀏覽量
37661 -
STOP模式
+關注
關注
0文章
9瀏覽量
3051
發(fā)布評論請先 登錄
相關推薦
評論