查看: 3319|回复: 0

[LPC双核挑战赛] 【imetro】LPC5411X的时钟、电源和低功耗特性

[复制链接]

该用户从未签到

6

主题

32

帖子

11

中级会员

Rank: 3Rank: 3

积分
463
最后登录
2023-2-23
发表于 2018-4-17 14:40:37 | 显示全部楼层 |阅读模式
本帖最后由 imetro 于 2018-6-11 13:04 编辑

前言
在我看来,所谓的(硬件)低功耗特性,无非就是时钟电源的合理搭配。越是功能复杂的设备,就越是需要更加精细和高效的时钟与电源管理,否则就会在效率和功耗上吃大亏。作为定位中高端的NXP LPC5411X系列单片机,复杂而灵活的低功耗特性自然是少不了的。
相较于经典型号的单片机,新一代单片机(包括最新的ARM单片机)主要在以下方面进行了优化:
1. 外设支持多时钟域:现在的单片机通常可以支持多时钟域,不仅不同的外设可以运行在不同的时钟下,甚至一些单片机还支持异步时钟域的外设总线,这些设计都为外设的时钟设置提供了无限可能。
2. 更细致的时钟控制选项:除了传统的外设专用时钟控制外,现在的单片机已经可以对各个外设的总线时钟进行控制,对于不使用或者不需修改的外设可以直接关闭总线时钟,在保留设置的前提下可以大大降低功耗。
3. 更丰富的电源控制选项:与时钟控制类似,电源控制也支持对单个外设的供电选择,并且还支持在深度睡眠模式中采用更激进的策略,现在的单片机已可以在深度睡眠模式下被大多数中断唤醒,这在以前是不可想象的。
虽然现在的单片机对低功耗的优化可谓是“无微不至”,但要发挥出最佳的效果,还得依赖软件的合理配置。很显然,时钟和电源在低功耗特性的地位是不同的,我们接下来先介绍LPC5411X的时钟和电源特性,然后再从整体的角度分析系统的低功耗特性。

时钟
时钟对于外设来说是必需的吗?答案是未必:对于IOCON和INPUT MUX之类的模块,通常只要配置一次即可,且配置后不需要再对寄存器进行读写,那么便可以在配置后关闭相应总线时钟即可。以上例子清楚地表明了总线时钟的作用:只有在需要对外设进行读写时才需要时钟,若关闭相关总线时钟则无法修改但可保持现有状态。这对其它时钟来说也是一样的。
当然,除了开关时钟以外,还有一种用法是调整时钟频率。我们知道,频率和功耗一般是正相关的关系,更高的频率通常带来更高的功耗,但同时也意味着更强的处理能力,这就需要通过测试找到一个平衡点了。对频率的调节可以通过选择时钟源和PLL/分频器来完成。

时钟源
LPC5411X的时钟源较为丰富,涵盖了低速(看门狗振荡器和RTC振荡器)到高速(FRO和PLL)等选项,并且除了主时钟树(见下文“时钟树”部分)之外还有一些特殊的应用,我们来细细分析。

FRO 12 MHz (fro_12m)
该时钟属于片内振荡器(IRC),且为CPU和总线的默认时钟,猜测从下文提到的fro_hf分频而来。根据参考手册,SYSCON模块的时钟源也是fro_12m。
FRO 48 MHz/96 MHz (fro_hf)
该时钟属于片内振荡器,可选48MHz或96MHz,出厂时经过校正,按数据手册精度可达±1%,足以用于USB的时钟。
Watchdog oscillator (wdt_clk)
也就是所谓的看门狗振荡器,也是片内振荡器,频率可在0.4 MHz到3.05 MHz(未分频)之间选择。精度比较差(按数据手册为±40%),但是功耗特别低。wdt_clk是Micro-tick和WWDT的唯一输入时钟,且可用于DMIC,在测量频率后应该还是个挺好用的时钟。
RTC oscillator (32k_clk)
搞过RTC的同学都知道32.768 kHz时钟的重要性。32.768 kHz时钟需要外接晶体才能产生,估计是因为体积太大不好集成。该时钟主要用于RTC模块(见下文“时钟树”部分),但也有一个特别的应用是UART在异步模式下作为从机检测输入信号。PLL可以将32k_clk作为输入源。
Clock IN (clk_in)
输入时钟,注意只能接有源晶振(类似于STM32的Bypass模式),因为片上没有振荡器,不能接无源晶体。估计这个时钟只在需要和其他器件同步时才用得到了。
PLL (pll_clk)
PLL大家应该都很熟悉了,参考文档也说得很详细,这里就不多提了。需要注意的是PLL的功耗也是相当可观的,如无必要可减少使用。
Flexcomm/DMIC clock (mclk_in)
专用于Flexcomm/DMIC模块的外部时钟,没啥好说的。

时钟树
关于时钟树的部分我觉得没啥好说的,贴两个图让大家看看就好。注意第二个图是RTC的时钟树,详细地解释了32.768 kHz时钟的各种用途。 main-clock-tree.jpg
rtc-clock-tree.jpg

时钟域
对于每个模块来说,时钟域基本可以分为两个部分,一部分与总线同步,另一部分(如果有)则与一个决定工作或传输速度的时钟同步,无论是纯数字外设(例如Flexcomm和DMIC)还是模拟外设(例如USB和ADC)都存在这种双时钟域的情况。这种情况通常不需要太担心,外设内部会自动完成时钟域的同步工作的。

总线时钟开关
这个功能在前面已经提到过了,就是对每个总线上的外设时钟进行控制,对于不用修改或访问的外设可以关闭时钟以节省功耗。顺带一提,总线上还有一个复位开关,使用方法是类似的。

其它选项
LPC5411X还包含了其它和时钟有关的选项,但有些比较隐蔽,因此在这里整理一下,做个笔记。

Flash时钟和延时
Flash的读取延迟通常是比较大的,对于Flash时钟频率较高的情况,可能需要多个周期才能访问到Flash的数据,因此需要根据Flash频率调整对应的读取延时。引入读取延时会导致每MHz的性能有所下降,这是由于预取的时间变长、指令执行效率降低的缘故。
HWWAKE
即硬件唤醒寄存器,用于控制深度睡眠模式(见下文“低功耗模式”)下的总线时钟状态(这里的唤醒仅针对总线时钟)。其实蛮好理解的,就是临时打开时钟进行传输而已。不过,参考手册并没有说明时钟是否能在进入深度睡眠模式前关闭,也不清楚打开FORCEWAKE位时从CPU是否可以访问在PDSLEEPCFG0寄存器中关闭的外设,这个可能需要进行试验才知道了。
hwwake.jpg
时钟分频
分频的选项很容易理解,就是把高速时钟变成相关的低速时钟,除了特定需求(如控制Flexcomm的传输速度)之外,也可以是功耗控制的选项。0x40000300开始的一些寄存器就是用来改变分频系数的,好好看参考手册就知道了。
SRAM的自动时钟门控
LPC5411X有一个比较有趣的功能,就是在16个总线时钟没有访问后关闭相应SRAM的时钟,代价是下次访问需要额外的1个总线时钟来重新打开SRAM时钟。该功能默认是使能的,按参考手册的说法,关闭该功能会使系统获得1%到2%的性能提升,但提升的幅度显然与代码的关系是比较大的。

电源
相对于时钟,电源的作用更好理解:上电就照常工作,断电就停止工作,此时无法保持状态。因此,我们通常只在完全不需要用到某个外设或不需要保持外设状态的时候才关闭外设对应的电源。

电源域
按参考手册的分法,电源域可以分为主电源域(CPU、总线和绝大部分外设)与始终上电的电源域(仅有RTC和PMU),而我觉得前者还可再细分为数字电源域和模拟电源域(包括SRAM、Flash、USB等,见下文“模拟电源域”)。

数字电源域
目前没有看到可以显式关闭的选项,或许关闭总线时钟后的功耗就可以忽略不计了?不过模拟部分的功耗确实是通常更高。
模拟电源域
LPC5411X对于模拟模块的定义可能是比较特别的,不过相关的配置选项都在PDRUNCFG0和PDSLEEPRUNCFG0中展示了(虽然我有理由相信参考手册还是藏了一些模块没有注明),其中后者用于深度睡眠模式,而前者用于其它模式(有趣的是深度掉电模式也用了前者,见下文“低功耗模式”)。
pdruncfg0.jpg
始终上电的电源域
该电源域与主电源域是分开的,为的就是让RTC模块能在其它模块都关闭的时候还能照常工作。当然,如果用不到RTC的话,也是可以将RTC的电源关闭的。

内部稳压器(Regulator)
LPC5411X的参考手册一直在强调PMU对于低功耗的作用,不过却很少提及PMU的原理。在阅读电源的源码库时,我发现了内部稳压器的存在,而这个模块并没有出现在参考手册里,可以说是十分有趣了。
简单来说,内部稳压器的作用自然是为片上各个模块提供合适的电压。我们前面提到过频率对功耗的影响,因此内部稳压器需要根据系统频率进行电压输出的微调。其实这个模块并不新鲜,STM32中也有类似的功能,只不过设置的选项更透明一些罢了。

低功耗特性
终于说到重点了。LPC5411X关于功耗的控制选项还是比较丰富的,虽然没有STM32L系列这么变态(STM32L4系列的低功耗可以有七八种状态),但是用起来要舒服得多。当然,用得好的前提是合理的配置。

低功耗模式
低功耗模式可以在两个层次上定义,即CPU(核心)和SoC(芯片)。

CPU
我们知道,在Cortex-M系列单片机中一共定义了两种低功耗模式,分别是睡眠模式和深度睡眠模式,两者的区别主要在供电上。
睡眠模式主要做的就是关闭CPU上运行的大部分时钟以节省功耗。当然,有些时钟还是要保持运行的,例如SysTick和NVIC。由于仅仅是关闭了时钟而没有切断电源,所以降低的主要是动态功耗部分,对静态功耗没有影响,但是唤醒速度也是最快的。需要将SLEEPDEEP位置为0。
深度睡眠模式采取的策略更为激进,通过切断CPU的大部分电源以节省功耗。为了保持CPU的运行状态,一些寄存器和逻辑电路将不会被切断电源。在深度睡眠模式下,NVIC的工作将移至WIC进行,后者可在前者被断电后继续保持运行,并在中断来临时唤醒整个CPU。深度睡眠模式进一步削减了静态功耗,代价是更长的唤醒时间。需要将SLEEPDEEP位置为1。

SoC
LPC5411X的低功耗模式共有三种,分别是睡眠模式、深度睡眠模式和深度掉电模式。
睡眠模式对应CPU的睡眠模式,除了CPU的时钟被停止之外,其它外设通常保持运行,包括可以用作总线和可以作为主机运行的DMA、USB等外设。睡眠模式的外设设置和工作模式下没有区别。
深度睡眠模式对应CPU的深度睡眠模式,进一步关闭了总线和大部分数字外设的运行时钟,并可以选择性地关闭模拟外设的电源。深度睡眠模式需要配置的寄存器包括PDSLEEPCFGx和STARTERx,前者用于配置深度睡眠模式下的模拟外设的电源(睡眠模式只和PDRUNCFGx有关),后者则像是配置WIC(按照标准,WIC不需要显式配置,但STARTERx寄存器只影响深度睡眠模式下的中断配置,此处存疑)。
深度掉电模式则是功耗最低的模式,通过关闭除RTC和PMU的电源以最大程度地降低功耗,代价是唤醒后无法恢复到先前状态,只能复位后重新执行代码。该模式的原理在参考手册上基本没怎么提及,后来在LPCOpen的电源管理API源代码中找到了线索,其实就是通过直接操作PDRUNCFGx寄存器的方式来关闭电源的,可谓是简单粗暴,这可能也是不提供详细说明的原因之一。

低功耗策略
所谓的低功耗策略是时钟、电源和低功耗模式的配置组合。在不同的情况下,低功耗策略是不同的。

CPU工作时
在CPU需要正常工作时,显然不适合使用任何低功耗模式。要降低系统功耗,就必须在以下几个方面下手:
  • 关闭不需要使用的电源和时钟。前者可通过PDRUNCFGx寄存器完成,而后者则与AHBCLKCTRLx、ASYNCAPBCLKCTRL寄存器有关。
  • 合理选择系统各部分模块的时钟。需要时使用分频器也是不错的选择。
  • 使用内部稳压器设置合适的工作电压。可以调用Chip_POWER_SetVoltage(使用LPCOpen)或POWER_SetVoltageForFreq(使用SDK)来设置。

CPU休息时
在CPU可以暂停工作时,便可以考虑进入到低功耗模式。关于低功耗模式的选择可以这样考虑:
  • 如果只需要RTC保持运行且不需要暂存任何数据或配置,那么深度掉电模式是不二之选。深度掉电模式只适用于需要直接关闭整个SoC或者RTC可以满足要求的情况。
  • 如果CPU在一段时间内没有动作,仅需要被动地接收来自外界的信号或数据,不需要进行复杂的控制和处理,那么可以尝试使用深度睡眠模式。深度睡眠模式下基本只能接收而不能处理或发送数据,对于单片机而言适合作为类似于从机的方式运行,可以配置在FIFO达到一定状态才唤醒SoC,也可让DMA和总线在必要时保持工作。
  • 如果CPU在操作过程中需要等待外界信号或者数据,但是等待的时间较短(如使用Mailbox中的互斥量)或需要进行一些传输/发送的操作(如通过I2S输出音频信号),则使用睡眠模式会比较合适。

除此之外,还有一些关于降低系统功耗的建议:
  • 尽可能使用FRO 12 MHz/48 MHz作为深度睡眠模式下的时钟,特别是FRO 12 MHz。根据参考手册,芯片内部已对该时钟在低功耗模式下进行了优化,调用Chip_POWER_SetLowPowerVoltage(使用LPCOpen)或POWER_SetLowPowerVoltageForFreq(使用SDK)可以有针对性地优化低功耗模式下的电源效率。
  • 合理地使用HWWAKE寄存器。这可以在深度睡眠模式下允许临时进行总线的数据传输操作。由于翻译的原因,中文版的参考手册说得不是很清楚,建议参考英文版的参考手册。
  • 在睡眠模式下,可以将不用的引脚至于一个固定的状态以减小功耗,但在深度睡眠模式下无效。深度睡眠模式下的GPIO已经断电,应该不会产生功耗。
  • 在USB部分看到一种说法,在深度掉电模式下必须要将DP和DM引脚进行外部上拉或下拉的方式,也就是不允许处于浮动模式。目前尚不清楚不使用USB(PDSLEEPCFG0的PDEN_USB_PHY为1)时是否也要遵循这一模式,也不知道是否会和USB标准有冲突。
  • 我们知道可以在SRAM中执行程序。从应用笔记中可以看出,对于在Flash中进入深度睡眠模式和在SRAM中进入深度睡眠模式这两种情况,待机功耗应该是大致相同的,但是在从深度睡眠模式中恢复时后者的时间要小于前者,因此尽可能在SRAM中执行进入深度睡眠模式的代码。LPCOpen和SDK中的电源管理API就是这么做的。

总结
LPC5411X的低功耗特性是比较丰富的,这允许我们尽可能降低系统功耗。但是,低功耗策略必须要结合当前项目的实际情况,否则可能会适得其反。



评分

参与人数 1 +3 收起 理由
doatello + 3 赞一个!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /4 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2024-4-25 21:04 , Processed in 0.107656 second(s), 20 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表