我太难了!芯片也要延年益寿 - LPC82X 电源配置

一、电源配置介绍

      单片机的应用不断增加会伴随着能耗增加等一系列问题,节能降耗才能增加芯片的寿命。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 ();

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论