本章中,我們主要對CKS32F4xx系列的待機模式(STANDBY)做詳細介紹。在該模式下,芯片功耗最低,1.2V供電區(qū)域、PLL、HSI和HSE振蕩器也完全被關(guān)閉。除備份域(RTC寄存器、RTC備份寄存器和備份SRAM)和待機電路中的寄存器外,SRAM和寄存器內(nèi)容丟失。因此,從待機模式喚醒后,只能從頭開始執(zhí)行程序,那我們?nèi)绾芜M入STANDBY模式及喚醒方式,可以按照下述表格中的步驟執(zhí)行即可:
CKS32F4xx系列標準庫把進入STANDBY模式這部分的操作封裝到PWR_EnterSTANDBYMode函數(shù)中了,需要先通過PWR_CR設(shè)置PDDS位以及SLEEPDEEP位,使得芯片進入深度睡眠時進入待機模式,接著調(diào)用__force_stores函數(shù)確保存儲操作完畢后再調(diào)用WFI指令,從而進入待機模式。需要注意的是,調(diào)用本函數(shù)前,還需要清空WUF 寄存器位才能進入待機模式。
RTC時鐘簡介
CKS32F4xx系列的RTC,是一個獨立的BCD定時器/計數(shù)器,RTC提供一個日歷時鐘(包含年月日時分秒信息)、兩個可編程鬧鐘(ALARM A和ALARM B)中斷,以及一個具有中斷功能的周期性可編程喚醒標志。RTC還包含用于管理低功耗模式的自動喚醒單元。兩個32位寄存器包含二進碼十進數(shù)格式(BCD)的秒、分鐘、小時(12或24小時制)、星期幾、日期、月份和年份。此外,還可提供二進制格式的亞秒值。系統(tǒng)可以自動將月份的天數(shù)補償為28、29(閏年)、30和31天。并且還可以進行夏令時補償。其它32位寄存器還包含可編程的鬧鐘亞秒、秒、分鐘、小時、星期幾和日期。此外,還可以使用數(shù)字校準功能對晶振精度的偏差進行補償。RTC模塊和時鐘配置是在后備區(qū)域,即在系統(tǒng)復(fù)位或從待機模式喚醒后RTC的設(shè)置和時間維持不變,只要后備區(qū)域供電正常,那么RTC將可以一直運行。但是在系統(tǒng)復(fù)位后,會自動禁止訪問后備寄存器和RTC,以防止對后備區(qū)域(BKP)的意外寫操作。所以在要設(shè)置時間之前,先要取消備份區(qū)域(BKP)寫保護。RTC的框圖,如下圖所示:
采用RTC周期性喚醒STANDBY模式實驗
程序設(shè)計主要要點如下:
① RTC初始化;
② RTC周期性自動喚醒;
③清除WUF標志位,進入待機狀態(tài)。
1)初始化RTC配置函數(shù)
voidCKS_RTC_Init(void) { uint16_tretry=0x1FFF; RTC_InitTypeDefRTC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE); PWR_BackupAccessCmd(ENABLE); RCC_LSEConfig(RCC_LSE_ON); while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET) { retry--; Delay(0xffff); } if(retry==0) { return1; } RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); RCC_RTCCLKCmd(ENABLE); RTC_InitStructure.RTC_AsynchPrediv=0x7F; RTC_InitStructure.RTC_SynchPrediv=0xFF; RTC_InitStructure.RTC_HourFormat=RTC_HourFormat_24; RTC_Init( RTC_InitStructure); }
在CKS_RTC_Init函數(shù)中,用來初始化RTC配置以及日期和時鐘,但只在首次設(shè)置時間,隨后重新上電/復(fù)位都不再進行時間設(shè)置(前提是備份電池有電)。為了時間更為精準,這里選用了LSE,即外部32.768kHz晶振作為RTC_CLK的時鐘源,而RTC時鐘核心,要求提供1Hz的時鐘,所以接著是設(shè)置RTC_CLK的預(yù)分頻系數(shù),包括異步和同步兩個,這里設(shè)置異步分頻因子為ASYNCHPREDIV為(127),同步分頻因子為ASYNCHPREDIV(255),則產(chǎn)生的時鐘CK_SPRE=32.768/(127+1)*(255+1)=1HZ,即每秒更新一次。
2)RTC周期性喚醒配置函數(shù)
voidRTC_Set_WakeUp(uint32_twksel,uint16_tcnt) { NVIC_InitTypeDefNVIC_InitStructure; EXTI_InitTypeDefEXTI_InitStructure; RTC_WakeUpCmd(DISABLE); RTC_WakeUpClockConfig(wksel); RTC_SetWakeUpCounter(cnt-1); RTC_ClearITPendingBit(RTC_IT_WUT); EXTI_ClearITPendingBit(EXTI_Line22); RTC_ITConfig(RTC_IT_WUT,ENABLE); RTC_WakeUpCmd(ENABLE); EXTI_InitStructure.EXTI_Line=EXTI_Line22; EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd=ENABLE; EXTI_Init( EXTI_InitStructure); NVIC_InitStructure.NVIC_IRQChannel=RTC_WKUP_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02; NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init( NVIC_InitStructure); }
在RTC_Set_WakeUp函數(shù)中,首先通過RTC_WakeUpCmd函數(shù),關(guān)閉WakeUp,接著調(diào)用RTC_WakeUpClockConfig函數(shù),配置WakeUp時鐘分頻系數(shù)及來源,然后通過調(diào)用RTC_SetWakeUpCounter,設(shè)置WakeUp自動裝載寄存器,隨后使能WakeUp,最后開啟配置鬧鐘中斷以及NVIC中斷優(yōu)先級。鑒于此處為RTC喚醒待機實驗,僅做demo例程使用,因而不用編寫中斷服務(wù)函數(shù)。
3)芯片進入STANDBY模式
查閱CKS32F4xx系列標準庫及相關(guān)手冊,我們了解到使能RTC周期性喚醒,在進入STANDBY模式前,需要進行以下操作,代碼如下:
voidCKS_Set_Standby_Mode(void) { RTC_ITConfig(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA,DISABLE); RTC_ClearITPendingBit(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA); PWR_ClearFlag(PWR_FLAG_WU); RTC_Set_WakeUp(RTC_WakeUpClock_CK_SPRE_16bits,3); PWR_EnterSTANDBYMode(); }
在CKS_Set_Standby_Mode函數(shù)中,先禁止RTC中斷(ALRAIE、ALRBIE、TSIE、WUTIE和TAMPIE等),接著清零對應(yīng)中斷標志位,以及清除PWR喚醒(WUF)標志,然后調(diào)用RTC_Set_WakeUp函數(shù),設(shè)置每3s后喚醒STANDBY模式,同時該函數(shù)中也重新使能RTC對應(yīng)中斷,最后調(diào)用PWR_EnterSTANDBYMode進入STANDBY模式。
4)主函數(shù)配置
本例程中主函數(shù)主要對上文所述函數(shù)調(diào)用,程序編譯下載至開發(fā)板,先進行相關(guān)外設(shè)初始化后,直接進入STANDBY模式,每隔3s由RTC喚醒,隨即又進入STANDBY模式,循環(huán)往復(fù),主函數(shù)代碼如下:
intmain(void) { CKS_RTC_Init(); while(1) { CKS_Set_Standby_Mode(); } }
來源:中科芯MCU
-
mcu
+關(guān)注
關(guān)注
146文章
17317瀏覽量
352640 -
振蕩器
+關(guān)注
關(guān)注
28文章
3847瀏覽量
139360 -
寄存器
+關(guān)注
關(guān)注
31文章
5363瀏覽量
121158 -
低功耗
+關(guān)注
關(guān)注
10文章
2418瀏覽量
103895
發(fā)布評論請先 登錄
相關(guān)推薦
MCU微課堂|CKS32F4xx系列產(chǎn)品時鐘配置
CKS32F4xx系列MCU的低功耗模式之睡眠模式
![<b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>MCU的<b class='flag-5'>低功耗</b><b class='flag-5'>模式</b>之睡眠<b class='flag-5'>模式</b>](https://file1.elecfans.com/web2/M00/8B/6B/wKgaomSY8kCAKDJ7AABYMDSOazU095.png)
CKS32F4xx系列產(chǎn)品串口DMA傳輸
CKS32F4xx系列RNG功能設(shè)置
![<b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>RNG功能設(shè)置](https://file1.elecfans.com/web2/M00/A3/86/wKgaomT6gH2AHojwAAAPwIIu7n0544.jpg)
評論