概述 越来越多的芯片设计人员将arm cortex-m0和cortex-m0+处理器用在多种超低功耗(ulp)微控制器和片上系统产品中。这里详细的介绍如何利用这些特性,以及在设计自己的低功耗应用时应注意什么。
那么软件开发人员需要理解的一个关键问题是,低功耗特性是和具体设备相关的。开发板人员需要参考微控制器供应商的应用笔记和例子,才能了解到可用的低功耗特性。
进入休眠模式 cortex-m0和cortex-m0+处理器默认支持一个休眠模式和一个尝试休眠模式,不过需要注意的是,微控制器供应商可以利用设备相关的可编程寄存器定义其他的休眠模式。在处理器内部,休眠模式和深度休眠模式的选择由系统控制寄存器中的sleepdeep位决定。
如果用的是符合cmsis的设备驱动库,系统控制寄存器可以通过“scb->scr”来访问。例如,要使能深度休眠模式,可以使用下面的语句
scb-> |= scb_scr_sleepdeep_ms; //使能深度休眠特性
系统控制寄存器只支持字大小的传输。
微控制器的普通休眠模式和深度休眠模式的实际区别取决于芯片系统设计,例如,普通休眠中一些时钟信号可能会被关掉,而深度休眠则可能会降低存储器块的电压且可能会关掉系统中的其他部件。
在选择了休眠模式后,可以利用wfe(等待事件)或wfi(等待中断)指令来进入休眠模式,为了提高可移植性,建议在执行wfi/wfe指令前加上一个dsb(数据同步屏障)指令(对于其他高性能处理器,进入休眠前可能还会有未完成的存储传输)。
多数情况下,微控制器供应商的设备驱动库中包含了进入低功耗模式的函数,并且已经为对应的微控制器做了一定的处理。利用这些函数可以使微控制器得到最高等级的功耗优化。
但是,如果开发的c代码要具有在多个cortex-m微控制器间的可移植性,可以使用下面的cmsis函数来直接访问wfe和wfi指令:
指令cmsis函数
wfe __wfe();
wfi __wfi():
如果未使用符合cmsis的设备驱动,可以使用c编译器提供的内在函数或者内联汇编来生成wfe和wfi指令。此时,软件代码和工具键相关,且可移植性不高。例如keilmdk-arm和arm-ds-5提供了如下面的内在函数(和cmsis版本不同,它们是小写格式的)。
指令keilmdk-arm或arm-ds-5的内在函数
wfe __wfe();
wfi __wfi():
从架构的角度来看,dsb指令要在wfe和wfi前执行,这样可以确保完成的数据存储指令(如缓冲写)在进入休眠前结束。然而,对于现有的cortex-m0和cortext-m0+处理器,不使用dsb也不会引起什么问题。
由于wfe可由各种事件唤醒,其中包括过去发生的事件,且一般用于空循环。例如
while(processing_required()==0){__dsb(); //推荐使用存储器屏障以提高可移植性__wfe();} 汇编编程环境用户可以直接在汇编代码中使用wfe和wfi指令。
没有对比就没伤害!iOS上最好用的输入法你知道吗?
学习Java编程 这10个技巧不容错过
5G时代的到来将会对消费互联网的下一步发展具有促进作用
VR搭配新闻的组合将带来媒体融合的新机遇
水下光通信系统的案例分享
超低功耗设计概述
新能源汽车的发展会给我们带来什么影响
华为Mate10外观配置售价全曝光:亮点多多,保时捷定制版破万元
苹果已要求供应商今年制造多达8000万部新iPhone
一套全新的手机系统测试基准
SoC与单片机应用技术的发展
工业互联网企业座谈会在京召开
Struts2远程代码执行漏洞复现编码
电脑机箱的电磁兼容设计
Maxis与华为合作将在马来西亚引入新的5G行业应用
iphone7什么时候上市 售价时间抢先发布会都知道了
美科学家研发机器人消防员 能理解手势语言
中兴Axon 30有望成为相机中性能最好的设备
用塑料封装和IMS技术实现功率模块的新方法
加密货币市场不容乐观,NFT又有何特点