《LPC入门笔记》之LPC系列单片机低功耗概述

作为一个Kinetis的老粉,现在也与时俱进开始研究LPC系列的单片机了。在看低功耗相关的材料时,整理了一则学习笔记。如有不当之处,请大家提意见,共同学习。

功耗管理,对于数字模块就是管理时钟,对于模拟模块就是管理供电(电压和电流)

LPC54608单片机使用SYSCON_PDRUNCFG0寄存器管理片上模拟模块在正常运行及休眠模式的供电。而在SYSCON_PDSLEEPCFG寄存器中可以设定模拟模块在不同模式下自动切换供电开关,即在特定功耗模式(Deep Sleep mode)下,各模拟模块的供电情况,是否能够继续存活。

LPC单片机片上包含两个供电域:
- 可控主供电域。通过VDD供电,经过片上调压器,服务于core,peripheral,memory,input及output。
- 始终供电域。通过VDD供电,直接服务于RTC和waku-up timer。只要VDD有电,这个供电域就有电。

管理片上模块用电情况的寄存器位于SYSCON模块中,包括切换CPU的功耗模式、外设模块的供电开关等等。

LPC单片机支持的几种功耗模式如下:

1. Active mode
上电之后的默认工作模式,供电系统全力供电。

在正常运行模式下,片上的外设模块可以通过AHB的总线开关管理时钟(没错,是时钟不是供电)。芯片上电复位之后,在如下寄存器中载入默认值:
- SYSCON_PDRUNCFG0
- SYSCON_PDRUNCFG1
- SYSCON_AHBCLKCTRL0
- SYSCON_AHBCLKCTRL1

- SYSCON_AHBCLKCTRL2


在运行时可以通过设定这些寄存器开关模拟模块的电源和数字模块的时钟,从而管理整个片上系统的功耗。具体说来,SYSCON_AHBCLKCTRLn寄存器控制内存和外设的时钟供给。SYSCON_PDRUNCFGn寄存器管理片上外设模拟部分的供电,例如RAM,PLL,振荡器及BOD电路。对于在应用中不需要用到的模块,可以手动关掉它们的时钟(电源)供给,从而节约能量。如果只需要在某些模块在特定的时间段中工作,那么在应用中可以临时打开模块的时钟(供电),用完之后再关掉时钟(供电),能省则省,够用就好。

系统时钟(给Platform,即芯片内核除了Core之外的模块,供应时钟的时钟源)的时钟源默认来自于FRO,也可以取自于高速外部晶振,PLL的输出,片内振荡器,32kHz的低速外部晶振或是看门狗振荡器。但通常来看,系统时钟的频率越低,功耗越小。如果不用PLL,最好把它关掉,即使用PLL,较低的输出频率也能省电。总之还是那句话,能省就省,够用就要。

某些外设模块还有一些独立的时钟源及各自的分频器(开小灶),根据应用需要,可以通过编程单独关闭这些外设模块的时钟,而保留时钟源继续,可以为其它模块继续服务。

2. Sleep mode
仅仅停止对CPU的供电,而保持外设模块及唤醒定时器的供电。此时,CPU的时钟也会被停掉。

Sleep mode对应Kinetis单片机中的WAIT模式。此时CPU停止工作,不再执行程序指令。仅仅停掉CPU也能省不少电。之后当被唤醒源或是复位之后,CPU才能恢复工作。在这个模式下,能省多少电基本上就靠CPU自觉了,其它外设模块完全不受影响,该工作继续工作。除了CPU的时钟被停掉,其它任何模块的时钟均不受功耗模式切换的影响,还是按照SYSCON_PDRUNCFGn和SYSCON_AHBCLKCTRLn中的设定来。

当唤醒信号(来自NVIC)到来之时,CPU被唤醒,继续执行进入休眠状态前后续的执行(跳过“WFI”指令,这句指令已经执行过了,否则也不会睡下去)。也就是从哪摔倒从哪爬起来。如果是通过复位事件唤醒,那就啥都别管了,单片机上程序的执行一切重来。

3. Deep Sleep mode
深度休眠模式是可配置的,几乎所有片上模块都可以在这个模式下被停掉,但是唤醒时间可能会更长。深度休眠模式对整个片上系统的工作产生影响,CPU的时钟被停掉,在没有特别设定的情况下,外设模块也将收不到任何内部(常规)时钟,SRAM和寄存器仅仅能保持状态。但是通过编程,某些外设模块仍能够在深度休眠模式下存活,例如:USB,DMIC,SPI,I2C,USART,WWDT,RTC,Micro-tickTimer及BOD。

在深度休眠模式下,CPU的那个死样子跟在休眠模式下是一样一样的。不同之处在于外设模块:在默认情况下,所有模拟模块的供电全部停掉(硬件自动搞定),但如果预先通过软件在SYSCON_PDRUNCFGn寄存器中设定,也可以特别设定某些模块可以在深度休眠模式下继续工作,这些模块通常是用来作为唤醒源而被特殊关照的,否则不必要的浪费电能就是有点太任性了。在时钟系统这块,主时钟和外设时钟全部停掉,FRO也被关掉,FLASH存储器进入待机自保状态,这一切都是由硬件(PMC模块为主导)自动操作完成的。注意,这里有一些模块是被停掉时钟但是保持供电的模块,这些模块有些可以从额外的时钟源获取时钟驱动信号继续工作,有些就是支持异步驱动模式,即外部事件信号直接驱动唤醒源管理模块(AWIC)。

深度休眠模式能够节约多少供电消耗,主要还是靠各个模块各自的待机(停电、停时钟后的耗电情况)特性自觉实现的,没有额外的节能减排专用模块(PMC)开始起作用。系统内部的各个模块及寄存器状态仍继续保持,IO端口的电平状态保持不变。

上文提到,在休眠状况下,仍有许多外设模块可以继续存活从而在必要的情况下产生唤醒事件,包括:USB0, USB1, DMIC, SPI, I2C, USART, WWDT, RTC, Micro-tick Timer, and BOD。此时,FRO,RTC振荡器及看门狗振荡器仍可以继续作为存活模块的时钟源提供时钟驱动信号。甚至在某些情况下,DMA也可以在深度休眠模式下工作。

在深度休眠模式下,系统的能量主要是通过仍在存活作为唤醒源模块消耗掉的。串行通信外设和引脚中断作为唤醒模块的时候是不消耗主控芯片的功耗的,因为在此时,产生唤醒事件的时钟是由与之相连接的外部电路驱动的。另外需要注意的是,在深度休眠模式下,所有唤醒源的唤醒信号能够进入内核唤醒整个系统,是通过SYSCON_STARTER寄存器和NVIC的中断管理器把控的,只有在进入深度休眠模式前预先留好后门,才能在休眠后再被指定的唤醒事件唤醒。

编程要点:
(1)进入深度休眠模式之前要选定唤醒源并在SYSCON_STARTER寄存器中启用对应的唤醒事件,在NVIC中启用对应中断向量。
(2)选定FR0 12MHz作为系统的主时钟,因为在深度休眠模式下,芯片内部只有这一个时钟还能继续工作。
(3)禁用BOD及其复位控制(SYSCON_BODCTRL寄存器的第2位和第6位),否则在系统供电降低到一定程度的时候,会触发BOD复位,从而中断进入低功耗的过程。
(4)配置SYSCON_PDRUNCFGn寄存器,指定哪些模块在深度休眠模式下能够继续存活。
(5)设定ARM核内部的DeepSleep控制位,再执行“WFI”指令,一个猛子扎入低功耗模式。

通过如下事件可以讲系统从深度休眠中唤醒:
(1)通过8个引脚中断通道中的一个引脚捕获到中断触发信号。不过前提是,对应的引脚中断在SYSCON_STARTER寄存器和NVIC中挂上号。
(2)捕获到在深度休眠模式下仍继续存活的模块(例如RTC,看门狗,串行通信引擎等)所产生的中断信号,同上类似,也需要预先挂号才能为唤醒信号放行。
(3)使用复位引脚,或是BOD,或是WWDT

4. Deep power down mode
深度掉电模式几乎停掉了片上所有模块的供电(比深度休眠模式还要绝),更省电,但对应需要更长的唤醒事件。为了最大范围地省电,整个片上系统(包括CPU及外设模块)都被停电了,只有PMU(管理供电的模块)和RTC(使用外部供电和外部晶振时钟驱动的模块)能够继续工作。芯片唤醒后,不得不执行复位流程,因为没有更多的能量用于保存海量的环境状态信息。

在深度掉电模式下,芯片内部的SRAM及除了RTC之外的其它寄存器的内容全部丢失(因此也就无法在唤醒时还原,只能重新执行程序),所有的引脚均处于高阻状态(三态)。

深度掉电模式下,对于软件来讲没有啥可以配置的,除了RTC,芯片上的内核、所有的外设模块全部完蛋。此时,只有RTC作为外设模块产生的中断能够唤醒系统,或者就直接复位。但即使是RTC超时之后唤醒的系统,芯片仍然会走一遍完整的复位过程,之后PMU将会启用片上稳压器为内核供电,当内核供电电压达到POR(上电复位)触发阈值后,系统开始执行复位序列开始复位,所有的寄存器也将被重新还原成复位状态。


在手册UM10912的Table 161 Peripheral configuration in reduced power modes 表中,列入了LPC54608片上所有外设模块在不同功耗模式下的供电情况。

file:///C:/Users/Andrew/AppData/Local/Temp/enhtmlclip/Image.png

唤醒过程

在任何休眠模式(低功耗模式)被唤醒后均返回到正常运行模式(Active mode)。通常情况下,可以通过中断唤醒系统,当不同的功耗模式下还支持更多的唤醒源,在手册UM10912的 Table 162. Wake-up sources for reduced power modes表中,罗列的各个功耗模式下的唤醒源及唤醒条件:





file:///C:/Users/Andrew/AppData/Local/Temp/enhtmlclip/Image(1).png
file:///C:/Users/Andrew/AppData/Local/Temp/enhtmlclip/Image(2).png
file:///C:/Users/Andrew/AppData/Local/Temp/enhtmlclip/Image(3).png
电源管理调试要点:

在正常运行模式下,CPU可以正常跑代码,此时可以预先配置好各个模块在不同功耗模式下的开关模式。
在低功耗模式下,调试模块不能工作。因此在调试低功耗模式的程序时,一定要在下载程序之后断开调试器,重新上电运行。

附件:  LPC系列单片机的功耗管理系统概述——基于LPC54608.pdf (837.3 KB, 下载次数: 132)

https://www.nxpic.org.cn/module/forum/thread-609635-1-1.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
基于LPC1786单片机软件,我们可以进行各种应用开发。LPC1786是一款高性能ARM Cortex-M3内核的32位单片机,它具有丰富的外设和强大的处理能力,非常适合各种嵌入式系统设计。 首先,我们可以利用LPC1786的GPIO(通用输入/输出)引脚来控制外部设备。通过软件编程,可以配置GPIO的输入输出模式、电平状态等,并与其他设备进行通信交互,如连接LED灯、按钮、传感器等。这样我们就可以实现各种控制和监测功能。 其次,LPC1786还具有多个定时器和计数器,可以用于测量时间、生成脉冲信号等。通过软件编程,我们可以配置这些定时器和计数器的工作模式、频率、触发条件等,以实现精确的定时和计数功能。 此外,LPC1786还内置了多个串口接口(UART、SPI、I2C等),可以用于与其他设备进行数据通信。通过软件编程,我们可以配置串口通信参数,并通过发送和接收数据,实现与外部设备的数据交换,如与电脑、传感器、显示屏等设备的无线通信。 另外,LPC1786还支持多种中断,并具有优先级设置功能。通过软件编程,我们可以针对不同的中断源进行优先级设置和中断处理程序编写,以实现实时响应和多任务处理。 最后,LPC1786还支持存储器管理单元(MMU)和外设保护单元(MPU),可以提供安全的内存管理和外设访问控制。通过软件编程,我们可以配置MMU和MPU的工作模式、权限等,确保系统运行的安全和稳定。 综上所述,基于LPC1786单片机软件,我们可以开发出各种嵌入式系统应用,包括控制、测量、通信、中断处理等功能。这些功能大大拓展了单片机的应用范围,广泛应用于工业自动化、物联网、智能家居等领域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值