一、电源配置介绍
单片机的应用不断增加会伴随着能耗增加等一系列问题,节能降耗才能增加芯片的寿命。LPC824 的电源配置是一种对芯片内部电源设置和程序操作的优化管理,在工作(Active)和睡眠(Sleep)模式下可通过简单调用 ROM 上的电源配置 API 而优化功耗,只需要一句简单的程序调用就能实现。
二、模式分类
根据实际需要电源配置可以将 LPC824 配置成以下四种功耗模式:
1. 缺省模式(Default Mode)
上电复位后为缺省功耗方式。
2. CPU 性能模式(CPU Performance Mode)
提供更多的处理能力,CPU 性能相比默认选项高30%。
3. 效率模式(Efficiency Mode)
寻找当前电流大小和 CPU 执行代码以及处理数据的能力之间的平衡,保持更高的 CPU 性能,并降低当前电流大小,这两个方面都优于默认模式。
4. 低电流模式(Low-Current Mode)
重点降低功耗而非提升 CPU 性能。
如下图 1 为模式切换对比图:
如下图 2 为运行方式比较图:
由图一和图二可知,相对于默认模式总结如下:
CPU 性能模式:提高大约 30% 的性能;
低电流模式:耗电下降大约 20% 至 30%;
效率模式:平衡整体效率,居于 CPU 性能与低电流模式之间。
三、程序实现电源配置
1、由 ROM 驱动表中指针所指来执行 ROM 的 API 调用,如图 3 所示:
图 3 为电源配置指针结构图:
LPC_ROM_API -> pPWRD -> set_power(cmdData, &response);
2、这里引入一个示例代码,主时钟和系统时钟都是 12 MHz,电源配置优化功耗的模式为效率模式。set_power 在配置微控制器的内部功率控制功能之后,返回值为 0,代表配置成功,代码执行流程如图 4 所示:
注:在调用电源配置 API 之前,需要先禁用所有中断,完成调用电源配置API之后,可以重新使能中断。
//Boot ROM 驱动表结构体:
typedef struct ROM_API {
const uint32_t unused[3];
const PWRD_API_T* pPWRD; //电源配置指针
const uint32_t p_dev1;
const I2CD_API_T* pI2CD;
const uint32_t p_dev3;
const uint32_t p_dev4;
const uint32_t p_dev5;
const UARTD_API_T* pUARTD;
} LPC_ROM_API_T;
//电源配置结构体:
typedef struct PWRD_API {
void (*set_pll)
(uint32_t cmd [], uint32_t resp []);
void (*set_power)
(uint32_t cmd [], uint32_t resp []); //电源配置 API
} PWRD_API_T;
#define LPC_ROM_API_BASE_LOC (0x1FFF1FF8UL)
#define LPC_ROM_API
(*(LPC_ROM_API_T * *) LPC_ROM_API_BASE_LOC)
//电源配置模式选择
#define PWR_DEFAULT 0 //缺省模式
#define PWR_CPU_PERFORMANCE 1 // CPU 性能模式
#define PWR_EFFICIENCY 2 //效率模式
#define PWR_LOW_CURRENT 3 //低电流模式
//返回结果选项
#define PWR_CMD_SUCCESS 0 //电源配置成功
#define PWR_INVALID_FREQ 1 //配置频率超出范围
#define PWR_INVALID_MODE 2 //配置模式出错
uint32_t cmdData [3]; //主时钟、模式选择和系统时钟设置
uint32_t response; //函数执行返回值
/* 参数 cmdData [0] 为主时钟(MHz),即是控制器用来获取系统和外设时钟的时钟速率。通过成功调用时钟例程或用户提供的类似代码来对其进行配置。此操作数必须是介于 1 和 30 MHz(包含1和30)之间的 整数。如果提供的数值超出此范围,则 set_power 返回 PWR_INVALID_FREQ 且不会改变电源控制系统。 */
cmdData [0] = 12;
/* 参数 cmdData [1] 为指定四种可用电源设置中的一种。如果是其他的非法选项,则 set_power 返回 PWR_INVALID_MODE 且代码不会改变电源控制系统。 */
cmdData [1] = PWR_EFFICIENCY;
/* cmdData [2] 为系统时钟(MHz),即是在调用 set_power 时微控制器运行的时钟速率。此参数是介于 1 至 30 MHz (包括 1 和 30)之间的整数。 */
cmdData [2] = 12;
//禁用中断
__disable_irq ();
//调用电源配置 API
LPC_ROM_API->pPWRD->set_power(cmdData, &response);
//使能中断
__enable_irq ();
评论