本课讲为大家讲解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为优先级组1nvic_initstructure.nvic_irqchannel = exti15_10_irqn; //按键pe10使用中断源exti15_10nvic_initstructure.nvic_irqchannelpreemptionpriority = 1; //配置抢占优先级:1nvic_initstructure.nvic_irqchannelsubpriority = 1; //配置子优先级:1nvic_initstructure.nvic_irqchannelcmd = enable; //使能中断通道nvic_init( nvic_initstructure); //使用上面的结构体初始化总中断
3)外部中断配置如下,主要在初始化中对中断屏蔽寄存器exti_imr及下降沿触发选择寄存器exti_ftsr配置,将exti_imr的mr10位置1,可开放相应通道中断请求。
syscfg_extilineconfig(exti_portsourcegpioe,exti_pinsource10); //连接外部中断源到pe10exti_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,从而清除它,进入下一次外部中断等待。
void exti15_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。
int main(void){ exti_config(); //配置及初始化gpio、nvic中断、外部中断 while(1) { delay(0x1ffffff); //scb->scr |= scb_scr_sleeponexit_msk; //如需设置成中断退出后触发睡眠模式 __wfi(); //进入睡眠模式,电流从19.3ma降至13.3ma }}
来源:中科芯mcu
台式万用表如何使用
ARTM-24安科瑞智能24路温度巡检仪
如何提高电子元器件可靠性?
车灯照明差需要注意,莫要留下行车安全的隐患!
5G技术推动内需市场的转型升级
CKS32F4xx系列低功耗模式SLEEP模式
刹车电机的结构原理
哈佛研究世界第一个全软体机器人:宛如章鱼
中国移动正式发布了2020年至2021年分布式块存储产品集采招标公告
万元以下听个响?来试试这款3000元的Hi-Fi音箱吧!好声音之外,还有时尚的设计
华为Mate20系列全球出货量超过750万台 全球25个国家和地区的份额超过10%
盛科网络推出了面向运营商5G承载和边缘计算应用的TsingMa芯片
LED灯防水气密性测试方案图展示
MOMAX摩米士KAWAII移动电源拆解评测:十分可爱实用
为什么说云计算不是阿里的核心竞争力?
LED彩灯PLC编程接线及梯形图
拼接屏能不能触屏操作?
调频立体声发射机和BA1404应用
欧洲主要运营商采用1400 MHz 基站天线
华为将在28日召开发布会,或将发布其最新折叠屏手机Mate X3?