CKS32F4xx系列低功耗模式之STANDBY模式

cks32f4xx系列低功耗模式
standby模式
第十七期 2023.7.6
    本章中,我们主要对cks32f4xx系列的待机模式(standby)做详细介绍。在该模式下,芯片功耗最低,1.2v供电区域、pll、hsi和hse振荡器也完全被关闭。除备份域(rtc寄存器、rtc备份寄存器和备份sram)和待机电路中的寄存器外,sram和寄存器内容丢失。因此,从待机模式唤醒后,只能从头开始执行程序,那我们如何进入standby模式及唤醒方式,可以按照下述表格中的步骤执行即可:
cks32f4xx系列标准库把进入standby模式这部分的操作封装到pwr_enterstandbymode函数中了,需要先通过pwr_cr设置pdds位以及sleepdeep位,使得芯片进入深度睡眠时进入待机模式,接着调用__force_stores函数确保存储操作完毕后再调用wfi指令,从而进入待机模式。需要注意的是,调用本函数前,还需要清空wuf 寄存器位才能进入待机模式。
rtc时钟简介
cks32f4xx系列的rtc,是一个独立的bcd定时器/计数器,rtc提供一个日历时钟(包含年月日时分秒信息)、两个可编程闹钟(alarm a和alarm b)中断,以及一个具有中断功能的周期性可编程唤醒标志。rtc还包含用于管理低功耗模式的自动唤醒单元。两个32位寄存器包含二进码十进数格式(bcd)的秒、分钟、小时(12或24小时制)、星期几、日期、月份和年份。此外,还可提供二进制格式的亚秒值。系统可以自动将月份的天数补偿为28、29(闰年)、30和31天。并且还可以进行夏令时补偿。其它32位寄存器还包含可编程的闹钟亚秒、秒、分钟、小时、星期几和日期。此外,还可以使用数字校准功能对晶振精度的偏差进行补偿。rtc模块和时钟配置是在后备区域,即在系统复位或从待机模式唤醒后rtc的设置和时间维持不变,只要后备区域供电正常,那么rtc将可以一直运行。但是在系统复位后,会自动禁止访问后备寄存器和rtc,以防止对后备区域(bkp)的意外写操作。所以在要设置时间之前,先要取消备份区域(bkp)写保护。rtc的框图,如下图所示:
采用rtc周期性唤醒standby模式实验
程序设计主要要点如下:
① rtc初始化;
② rtc周期性自动唤醒;
③ 清除wuf标志位,进入待机状态。
1)初始化rtc配置函数
void cks_rtc_init(void){ uint16_t retry = 0x1fff; rtc_inittypedef rtc_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) { return 1; } 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函数中,用来初始化rtc配置以及日期和时钟,但只在首次设置时间,随后重新上电/复位都不再进行时间设置(前提是备份电池有电)。为了时间更为精准,这里选用了lse,即外部32.768khz晶振作为rtc_clk的时钟源,而rtc时钟核心,要求提供1hz的时钟,所以接着是设置rtc_clk的预分频系数,包括异步和同步两个,这里设置异步分频因子为asynchprediv为(127),同步分频因子为asynchprediv(255),则产生的时钟ck_spre=32.768/(127+1)*(255+1)=1hz,即每秒更新一次。
2)rtc周期性唤醒配置函数
void rtc_set_wakeup(uint32_t wksel, uint16_t cnt){ nvic_inittypedef nvic_initstructure; exti_inittypedef exti_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函数中,首先通过rtc_wakeupcmd函数,关闭wakeup,接着调用rtc_wakeupclockconfig函数,配置wakeup时钟分频系数及来源,然后通过调用rtc_setwakeupcounter,设置wakeup自动装载寄存器,随后使能wakeup,最后开启配置闹钟中断以及nvic中断优先级。鉴于此处为rtc唤醒待机实验,仅做demo例程使用,因而不用编写中断服务函数。
3)芯片进入standby模式
查阅cks32f4xx系列标准库及相关手册,我们了解到使能rtc周期性唤醒,在进入standby模式前,需要进行以下操作,代码如下:
void cks_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函数中,先禁止rtc中断(alraie、alrbie、tsie、wutie和tampie等),接着清零对应中断标志位,以及清除pwr唤醒(wuf)标志,然后调用rtc_set_wakeup函数,设置每3s后唤醒standby模式,同时该函数中也重新使能rtc对应中断,最后调用pwr_enterstandbymode进入standby模式。
4)主函数配置
本例程中主函数主要对上文所述函数调用,程序编译下载至开发板,先进行相关外设初始化后,直接进入standby模式,每隔3s由rtc唤醒,随即又进入standby模式,循环往复,主函数代码如下:
int main(void){ cks_rtc_init(); while (1) { cks_set_standby_mode(); }}  


继辽宁舰、已下水001A舰,上海开建002舰后第四艘航母开建
介绍一下TIA Portal V18安装和授权获取的流程
基于FPGA的DDC的设计
net程序员工作两年的总结
人工智能具备哪一些识别功能
CKS32F4xx系列低功耗模式之STANDBY模式
镍铁合金薄壁零件车削加工研究
PicScope高级函数功能应用—编辑函数公式测量相位漂移
芯片巨头高层动荡:ARM任命新CEO挑战英特尔
捷扬微电子发布超宽带系统级芯片GT1000
NARLabs与比利时微电子合作 欲在MicroLED领域上跟韩国一战
电缆故障测试的原理与步骤
新一代主板BIOS技术
食用油过氧化值检测仪的应用以及功能的介绍
比特币还有扩展的余地吗
如何从生产制造环节减少电机振动因素?
Zoran推出新型高清中国有线机顶盒
运动可以佩戴降噪耳机吗?不可以!尤其是户外运动
7nm 工艺制程介绍 哪些处理器用到了7nm 工艺?
网关和路由器的区别是什么?