越来越多的芯片设计人员将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指令。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !