在本章節中,首先向大家介紹電源系統結構,接著簡述三種低功耗模式,最后重點介紹CKS32F4xx系列如何進入STOP模式以及使用按鍵實現中斷喚醒。
CKS32F4xx電源系統介紹
CKS32F4xx系列的電源系統框圖
CKS32F4xx系列的器件工作電壓(VDD)為1.8~3.6V。
①備份域電路:包含LSE振蕩器、RTC、備份寄存器及備份SRAM。電源開關自動切換VDD和VBAT供電。
②調壓器電路(1.2V域):為備份域及待機電路外的所有數字電路供電,其中包括內核、數字外設及RAM。
③ADC電路和參考電壓:ADC工作電源使用VDDA引腳輸入,使用VSSA作為獨立的地連接,VREF引腳則為ADC提供測量使用的參考電壓。
低功耗模式簡介
CKS32F4xx系列按功耗由高到低排列,分別是運行、睡眠、停止(STOP)和待機(STANDBY)四種工作模式。上電復位后,CKS32F4xx系列會處于正常運行狀態,當不需要繼續運行內核時,就可以選擇進入后面的三種低功耗模式降低功耗。這三種模式中,電源消耗不同、喚醒時間不同、喚醒源不同,用戶需要根據應用需求,選擇最佳的低功耗模式。其中,最低功耗的是待機模式,停機模式(STOP)是次低功耗的,最后是睡眠模式。低功耗相關寄存器主要有SCB_SCR、PWR_CR、PWR_CSR,進入各種低功耗需要調用的指令有WFI或WFE,以下做簡要介紹。
1.SCB_SCR(系統控制寄存器)
若進入停止模式or待機模式,需將SLEEPDEEP置1。
2.PWR_CR(電源控制寄存器)
若進入停止模式,需將PDDS清0,LPDS選調節器模式;若進入待機模式,需將PDDS置1,清除喚醒位CWUF。
3.PWR_CSR(電源控制/狀態寄存器)
若芯片處于待機模式下,需使用使用WKUP引腳喚醒并需要清除WUF標記位。
注:WKUP上升沿才能喚醒待機狀態,清除WUF標記位實則需操作CWUF位。
4.WFI與WFE指令
實質上都是內核指令,在庫文件core_cmInstr.h中把這些指令封裝成了函數,調用它們都能進入低功耗模式。調用時,需要使用函數的格式“__WFI();”和“__WFE();”,這是因為__w?及__wfe是編譯器內置的函數,函數內部使用調用了相應的匯編指令。其中WFI指令決定了它需要用中斷喚醒,而WFE則決定了它可用事件來喚醒。
以下表格是對三種低功耗模式的簡要概述。
本章中,我們主要對CKS32F4xx系列的低功耗模式—停止模式(STOP)做詳細介紹。該模式中,由于其1.2V區域的部分電源沒有關閉,會保留內核的寄存器、內存的信息,所以從STOP模式喚醒,并重新開啟時鐘后,還可以從上次停止處繼續執行代碼。停止模式可以由任意一個外部中斷(EXTI)喚醒。在停止模式中可以選擇電壓調節器為開模式或低功耗模式,可選擇內部FLASH工作在正常模式或掉電模式。那我們如何進入STOP模式,可以按照下述表格中的步驟執行即可:
CKS32F4xx系列標準庫把進入STOP模式這部分的操作封裝到PWR_EnterSTOPMode函數中了,并且需要注意的是進入STOP模式后,CKS32F4xx系列的所有IO都保持在停止前的狀態,且當它被喚醒時,CKS32F4xx系列使用HSI作為系統時鐘運行,由于系統時鐘會影響很多外設的工作狀態,所以一般我們在喚醒后會重新開啟HSE,把系統時鐘設置為原來的狀態。上面表格也提到在停止模式中,還可以控制FLASH的供電,使用庫函數PWR_FlashPowerDownCmd配置進入掉電狀態還是正常供電狀態,本質上是封裝了一個對FPDS寄存器位操作的語句,使用時需要再進入停止模式前被調用,可以進一步降低功耗。
采用EXTI喚醒STOP模式實驗
程序設計主要要點如下:
①初始化用于喚醒的中斷按鍵;
②配置不用的I/O端口;
③設置停滯狀態是FLASH掉電以及選擇電壓調節器的工作模式并進入停止狀態;
④使用按鍵中斷喚醒芯片;
⑤重啟HSE時鐘,使系統完全恢復停止之前的狀態。
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函數中,首先使能GPIOB時鐘,又因為用到外部中斷,所以必須先使能SYSCFG時鐘,接著對GPIOB初始化為上拉輸入,并調用函數 SYSCFG_EXTILineConfig配置GPIOB.1連接到中斷線1,最后初始化EXTI中斷線以及NVIC中斷優先級。
voidEXTI1_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line1)!=RESET) { EXTI_ClearITPendingBit(EXTI_Line1); } }
在中斷服務函數EXTI1_IRQHandler內,主要是清除LINE1上的中斷標志位。
2)配置未使用的I/O口
進入STOP模式之前,需要對I/O進行處理,若不處理很多配置為輸入浮空的I/O口在受到外界干擾的時候,狀態不定,消耗大量的電流,代碼如下:
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作為按鍵,產生外部中斷來將芯片從STOP模式喚醒。
3)芯片進入STOP模式
該部分代碼一般是程序執行一段時間再調用,我們先使用PWR_FlashPowerDownCmd配置停止模式下FLASH使用掉電模式,隨后調用PWR_EnterSTOPMode把調壓器設置在低功耗模式,最后使用WFI指令進入停止狀態。由上文可知,WFI進入停止模式可由任意的EXTI的中斷喚醒,所以此處使用按鍵中斷喚醒是可行的,代碼如下:
voidCKS_Set_Stop_Mode(void) { PWR_FlashPowerDownCmd(ENABLE); PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI); }
4)主函數配置
本例程中主函數主要對上文所述函數調用,程序編譯下載至開發板,先進行相關外設初始化后,直接進入STOP模式,此時按下按鍵,芯片可立即被喚醒,隨即又進入STOP模式,循環往復,主函數代碼如下:
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文章
17718瀏覽量
358409 -
低功耗
+關注
關注
10文章
2652瀏覽量
104402 -
電源系統
+關注
關注
3文章
662瀏覽量
38266 -
STOP模式
+關注
關注
0文章
9瀏覽量
3164
發布評論請先 登錄
相關推薦
MCU微課堂|CKS32F4xx系列產品時鐘配置
CKS32F4xx系列MCU的低功耗模式之睡眠模式

CKS32F4xx系列產品串口DMA傳輸
CKS32F4xx系列RNG功能設置

評論