LPCXpresso环境下的LPC1100低功耗模式和唤醒时钟
1.简介
基于ARM Cortex-M0 CPU架构,LPC1100微控制器系列(8/16位应用),高性能、低功耗、简易指令、存储器寻址,与现有的8/16架构相比,代码体积更小。
LPC1100系列外设包括32KB flash 存储器,8KB数据存储器,一个C-CAN控制器(LPC11Cxx),一个高速+IIC总线接口,一个RS-485/EI-485UART,两个SPI接口(SSP特性),4个通用定时器,一个10位ADC,以及42个通用I/0引脚。
LPC11Cxx系列包含片上C-CAN驱动和通过C-CAN在线系统编程flash工具。LPC11C2x系列有一个片上高速CAN收发器。
LPC11xx(L)系列包含片上功率配置部件。
LPC1100系列定位于一系列广泛的应用,包括eMetering、照明、工业网络、报警系统以及白色家电。
本文档介绍了LPC11xx系列,LPC11xx(L)系列和LPC11Cxx系列的各种低功耗模式。进入低功耗模式、唤醒状态,可以有效降低功耗。本文档同时提供了一个软件示例,使用LPC1114 LPCXpresso板进入低功耗模式测量功耗和唤醒时钟。
本文档包括以下要点:
- (1) 低功耗模式
- (2) 进入低功耗模式
- (3) 唤醒状态
- (4) 降低功耗
- (5) LPC1114 LPCXpresso低功耗模式演示
2.低功耗模式
LPC11xx\、LPC11xx(L)、LPC11Cxx系列有三种省电模式:睡眠模式、深度睡眠模式和深度掉电(Power-down)模式。以下内容包含了低功耗模式的特性和配置。
2.1.1 睡眠模式
在睡眠模式,ARM Cortex-M0 内核系统时钟停止,指令的执行暂停,直到复位或者发生中断。
外设功能,如果选择SYSAHBCLKCTRL寄存器计时,在睡眠模式继续操作,则会产生中断,恢复处理器运行。睡眠模式取消了动态功率(用于处理器自身、存储器系统和相关的控制器、内部总线)。处理器状态和寄存器、外设寄存器、内部SRAM的值保持不变,引脚的逻辑电平不变。
2.1.2 深度睡眠模式
在深度睡眠模式,与睡眠模式一样,处理器系统时钟不可用。所有的模拟块都掉电,除了BOD电路和看门狗震荡器(必须在深度睡眠模式期间,在PDSLEEPCFG寄存器中选定或取消选定)。详细内容请参考3.5部分。
深度睡眠模式取消了所有用于flash、模拟外设的电源,用于处理器自身、存储器系统和相关控制器、内部总线的动态电源。处理器状态和寄存器、外设寄存器以及内部SRAM的值保持不变,引脚的逻辑电平不变。
2.1.3 深度掉电模式
在浓度掉电模式,WAKEUP引脚的异常切断了整个芯片的电源和时钟。在深度掉电模式期间,不保留SRAM和寄存器的内容,除了少数保存在电源管理单元中的5个32位通用寄存器的数据。
在深度掉电模式下,所有的功能引脚都是三态的,除了WAKEUP引脚。
3.进入低功耗模式
这部分描述了LPC11xx、LPC11xx(L)、LPC11Cxx系列进入三种低功耗模式的机制(睡眠模式、深度睡眠模式、深度掉电模式)。
3.1 系统控制寄存器(SCR)
SCR寄存器控制进入和退出低功耗模式的特性。
在Cortex-M0 系统控制寄存器(SCR)中,通过设置SLEEPDEEP位,进入睡眠模式和深度睡眠模式。
位描述如图1所示。

图1 系统控制寄存器(SCR,0xE000ED10)
在Cortex-M0系统控制寄存器(SCR)中,如果SLEEPDEEP 位是0,则是睡眠模式。
在Cortex-M0系统控制寄存器(SCR)中,如果SLEEPDEEP 位是1,则是深度睡眠模式。
3.2 电源控制寄存器(PCON)
PCON寄存器选择哪种睡眠模式(睡眠模式或深度睡眠模式),或者进入深度掉电模式。PCON分别提供了睡眠/深度睡眠模式和深度掉电模式的标志位,参看图2。

图2 电源模式控制寄存器
3.3 中断等待(WFI)指令
设置完SLEEPDEEP位和PCON寄存器,执行WFI指令将直接进入低功耗省电模式。WFI指令是Cortex-M0指令,不能用ANSI C 直接访问。CMSIS(Cortex 微控制器软件接口标准)提供了一个内置函数,生成WFI指令,支持C编译器。
如果C编译器不支持WFI内置函数,用户必须使用汇编代码执行WFI指令。
3.4 进入睡眠模式的编程步骤
以下是进入睡眠模式的步骤:
- (1) PCON寄存器的DPDEN位必须设置为0。
- (2) ARM Cortex-M0 SCR 寄存器的SLEEPDEEP位必须设置为0。
- (3) 使用ARM Cortex-M0中断等待指令(WFI)。
图3为进入睡眠模式的示例代码

图3 示例代码(睡眠模式)
3.5 进入深度睡眠模式的编程步骤
以下为进入深度睡眠模式的步骤:
- (1)PCON寄存器的DPDEN位必须设置为0。
- (2)在PDSLEEPCFG寄存器深度睡眠模式下选择电源配置。
当器件进入深度睡眠模式,这个寄存器控制看门狗震荡器和BOD电路。在进入深度睡眠模式之前,必须至少一次使用下图中的值初始化这个寄存器。初始化失败,可能导致微控制器未定义错误。图4所列的是PDSLEEPCFG寄存器所允许的值。

图4 PDSLEEPCFG寄存器设置(深度睡眠模式)
- a.如果定时器需要控制自身唤醒,确保在PDRUNCFG寄存器中设置看门狗震荡器,并在MAINCLKSEL寄存器中选择看门狗震荡器的时钟源(细节请参考LPC11XX用户手册)。
- b.看门狗震荡器可以运行在深度睡眠模式,为看门狗定时器或者通用定时器提供时钟,如果它们需要自唤醒。更多细节请参考3.7部分。在这种情况下,看门狗震荡器模拟输出频率必须设置为它的最低值(WDTOSCCTRL中位FREQSEL=0001,参考LPC11XX用户手册),进入深度睡眠模式之前,在SYSAHBCLKCTRL寄存器中设置外设时钟为不可用(除了定时器时钟)。如果在深度睡眠模式下运行看门狗震荡器,将产生额外的电流损耗。
- c.如果没有定时器自唤醒需要,且看门狗震荡器关闭,确保在PDRUNCFG寄存器中设置对IRC的供电,并在进入深度睡眠模式前在MAINCLKSEL寄存器中为IRC选择时钟源。这样能确保顺利关闭系统时钟(更多细节请参考LPC11XX用户手册)。
- d.在深度睡眠模式下,使能BOD电路可以在低压下保护器件。虽然,在深度睡眠模式下,BOD电路会产生额外电流损耗。
(3) 唤醒之后,在PDAWAKECFG寄存器中选择电源配置。可以在寄存器中对该位进行编程,以决定芯片从深度睡眠模式唤醒时进入的状态。
(4) 如果使用外部引脚作为唤醒引脚,则在开始逻辑寄存器中使能并清除该唤醒引脚,并在NVIC中使能匹配开始逻辑的中断。
(5) 在SYSAHBCTRL寄存器中,禁用所有的外设,除了计数器/定时器或WDT(如果需要)。
(6) 在ARM Cortex-M0 SCR 寄存器中,SLEEPDEEP位写入1。
(7) 使用AMR Cortex-M0 中断等待指令(WFI)。
图5为进入深度睡眠模式的示例代码

图5 代码示例(深度睡眠模式)
3.6 进入深度掉电模式的编程步骤
进入深度掉电模式的步骤如下:
- (1)在PCON寄存器中,DPDEN位写入1。
- (2)保存通用寄存器中的数据(更多细节请参考LPC11XX用户手册)。
- (3)ARM Cortex-M0 SCR 寄存器,SLEEPDEEP位写入1。
- (4)在进入深度掉电模式之前,在PDRUNCFG寄存器中,IRCOUT-PD和IRC-PD位写入0,以确保对IRC供电。
- (5)使用ARM Cortex-M0 中断等待指令(WFI)。
请注意,在进入深度掉电模式之前,WAKEUP引脚需要外部拉高。

图6 示例代码(深度掉电模式)
3.7 唤醒
以下部分描述了LPC11xx、LPC11xx(L)、LPC11Cxx系列每种模式的唤醒。
3.7.1.1 从睡眠模式唤醒
当NVIC 中断或者复位发生时,自动退出睡眠模式。关于哪个中断源与NVIC连接,请参考LPC11XX用户手册。中断唤醒后,微控制器返回到最开始的电源配置状态(由PDRUNCFG和SYSAHBCLKDIV寄存器决定)。如果发生复位,微控制器进入激活模式的默认状态。
3.7.1.2 从深度睡眠模式唤醒
微控制器从深度睡眠模式唤醒有以下几种方式:
(1) 连接到开始逻辑(start logic)的外部引脚信号。某一端口引脚可以作为开始逻辑的输入。关于有哪些端口引脚连接到开始逻辑并可作为唤醒引脚,请参考LPC11XX用户手册。开始逻辑不需要任何时钟,如果在NVIC中使能从深度睡眠模式唤醒,则可以产生中断。
(2) 开始逻辑的输入信号(由某一通用定时器外部输入引起的事件所产生)。引脚(保持定时器匹配功能)在NVIC中设置为开始逻辑的输入,在SYSABHCLKCTRL寄存器中使能相应的定时器,且看门狗震撼器运行在深度睡眠模式(更多细节请参考LPC11XX用户手册)。当触发了相匹配的输入时,唤醒机制允许器件自唤醒。如图7所示,反馈到开始逻辑,引发器件自唤醒。这种方式不需要外部触发,减少了板上的外部元件。用这种方法所花的唤醒时间比第一种方法长。关于唤醒时间将在演示部分讨论。

图7 自唤醒框图
(3) BOD电路复位。此时,需要在PDSLEEPCFG寄存器中使能BOD电路,且在BODCTRL寄存器中使能BOD复位(更多细节请参考LPC11XX用户手册)。
(4) 看门狗定时器复位。此时,看门狗震荡器必须运行在深度睡眠模式(参看PDSLEEPCFG寄存器),且在SYSAHBCLKCTRL寄存器中使能看门狗定时器外设。
(5) 外部RESET引脚。
3.7.1.3 从深度掉电模式唤醒
拉低WAKEUP引脚从深度掉电唤醒,芯片复位。WAKEUP引脚最小脉冲宽度为50ns。
(1) 当WAKEUP引脚从高电平到低电平转换时,唤醒有效(电平触发)。
- a.电源管理单元(PMU)打开片上电压调节器。当内核电压达到电源复位(power-on-reset)跳变点,系统复位,芯片重新引导。
- b.所有寄存器(除了GPREG0-GPREG4、PCON)回到复位状态。
(2) 一旦芯片引导完成,可以从PCON寄存器中读取深度掉电标志位,以确认由唤醒事件引发的复位。
(3) 清除PCON寄存器深度掉电标志位。
(4) (可选)读取通用寄存器保存的数据。
请注意,RESET引脚在深度掉电模式下没有任何功能。
3.8 降低功耗补充材料
进一步降低电流损耗,可以考虑以下几点:
3.8.1.1 CPU时钟频率
可以根据需要控制CPU时钟频率。
(1) 改变时钟源:内部震荡器(12MHz +/-1%)、系统震荡器(1MHz to 25MHz),看门狗震荡器(7.8kHz to 1.7MHz +/-40%)。
(2) 重设PLL的值,和/或变更AHB Clock Divider(SYSAHBCLKDIV)的值。
(3) 降低PLL输出频率(FCCO,156MHz to 320MHz)可以降低功耗。
(4) 8位系统AHB Clock divider寄存器(SYSAHBCLKDIV)可以降低CPU的操作到某一低的频率,临时降低功耗而无需关闭SYS PLL。见图8所示。

图8 时钟发生单元(CGU)框图
3.9 系统AHB 时钟控制寄存器(AHBCLKCTRL)
如图8所示,SYSAHBCLKCTRL寄存器使能系统和外充模块的时钟。根据需要,用户可以使用该寄存器禁用未使用的外设时钟,以达到降低功耗的目的。更多细节请参考LPC11XX用户手册。
3.10 外设时钟除法器
选定的外设有各自的时钟除法器(SPI0CLKDIV,UARTCLKDIV,SPI1CLKDIV,WDTCLKDIV,CLKOUTDIV),可以控制提供给相应外设的时钟信号的频率(见图8)。根据实际需要,用户可以使用除法器降低外设时钟频率或者关闭时钟以降低功耗。更多细节请参考LPC11XX用户手册。
3.11 掉电配置寄存器(PDRUNCFG)
PDRUNCFG 寄存器包含模拟块电源开关的控制位,通过模拟外设可以消除电源消耗。更多细节请参考LPC11XX用户手册。
3.12 其他
3.12.1 软件
大部分嵌入式应用都以while(1) loop 结束,用于中断。此时,仍然从片上flash获取代码并执行,增加了功耗。一种较好的解决方案是选择睡眠省电模式,并等待中断。外设的中断可以把器件从睡眠模式唤醒。内核在等待中断时保持睡眠模式,可以有效的降低功耗。
3.12.2 端口引脚
可以增加一些步骤,在低功耗模式下降低电流损耗。LPC11xx、LPC11xx(L)、LPC11Cxx系列的通用端口引脚,默认可编程内部拉高。在进入低功耗模式之前,可以通过以下几种方法降低IO的电流:
(1) 所有通用I/O引脚(GPIO)默认带有输入上拉电阻。首先,使用IOCON寄存器,禁用所有通用端口引脚内部上拉(pull-ups)。其次,设置I/O为GPIO输出,低电平。确保引脚没有外部拉高。
(2) 所有通用I/O引脚(GPIO)默认带有输入上拉电阻。首先,使用IOCON寄存器,禁用所有通用端口引脚内部上拉(pull-ups)。其次,设置I/O为GPIO输出,高电平。确保引脚没有外部拉低。
(3) 使用IOCON寄存器,首先,禁用所有通用端口引脚内部上拉(pull-ups)。其次,设置I/O为GPIO输入且使用外部电阻,把I/O拉高或拉低。
请注意,在深度睡眠模式,端口引脚的状态不影响电流的损耗,以上提到的方法在这个模式下无需考虑。
3.12.3 CAN引脚
LPC11C1x器件,如果不使用CAN部件,CAN引脚(CAN-RXD和CAN-TXD)建议外部拉低,以降低IO电流。
3.12.4 RESET-N/PIO0-0引脚
LPC11xx、LPC11xx(L)、LPC11Cxx,在深度掉电模式时,RESET/PIO0-0引脚需要通过外部10K-47K电阻拉高。如果引脚悬空,用户可以看到电流损耗的增加。
3.12.5 调试
用户应该知道的关于一些调度的限制。最重要的是,由于Cortex-M0集成方面的一些限制,LPC11xx、LPC11xx(L)、LPC11Cxx在一般方式下,不能从睡眠、深度睡眠和深度掉电模式下唤醒。建议不要在这些模式下调试。一旦通过SWD接口下载应用程序,USB和SWD之间的适配器要从板上移除。另一个问题是,调式模式改变了Cortex-M0 CPU处理降低功耗模式的方式。这将导致器件级的电源模式不同于通常模式下的操作。这些不同,意味着在调试时不能测试电源;在应用中,测试结果将比通常操作时要高。
4.低功耗模式演示
5.总结
下载完整PDF文档: