查看: 1629|回复: 1

[原创] 【经验分享】LPC541XX 系列唤醒执行时间长问题解决

[复制链接]

该用户从未签到

656

主题

6312

帖子

0

超级版主

Rank: 8Rank: 8

积分
19946
最后登录
2024-4-19
发表于 2018-10-12 16:52:30 | 显示全部楼层 |阅读模式
本帖最后由 小恩GG 于 2018-10-12 16:56 编辑

【经验分享】LPC541XX 系列唤醒执行时间长问题解决

     最近有些客户在使用LPC54102LPC54114的时候,使用的代码是lpcopen的,发现进入低功耗,再唤醒,唤醒的时间比较长,经过进一步定位,发现问题的关键点出在Chip_SetupIrcClocking这个函数上面,这个函数里面有使用PLL,配置PLL的代码,而PLL代码在计算M decodeencode的时候耗费了太多的时间,所以修改了sysinit_5410x.c文件里面的void Chip_SetupIrcClocking(uint32_tiFreq)函数,还有pll_5410x.c里面的static uint32_t pllDecodeM(uint32_tMDEC) 以及static uint32_t pllEncodeM(uint32_t M)

下面给出具体修改代码:
  1. void Chip_SetupIrcClocking(uint32_t iFreq)
  2. {
  3.         PLL_CONFIG_T pllConfig;
  4.         PLL_SETUP_T pllSetup;
  5.         PLL_ERROR_T pllError;
  6.         bool usePLL = false;

  7.         /* Turn on the IRC by clearing the power down bit */
  8.         Chip_SYSCON_PowerUp(SYSCON_PDRUNCFG_PD_IRC_OSC | SYSCON_PDRUNCFG_PD_IRC);

  9.         /* Select the PLL input to the IRC */
  10.         Chip_Clock_SetSystemPLLSource(SYSCON_PLLCLKSRC_IRC);

  11.         /* Setup FLASH access */
  12.         setupFlashClocks(iFreq);

  13.        if (iFreq > 12000000) {
  14.                 usePLL = true;
  15.         }

  16.         if (usePLL)
  17.                 {
  18.                 /* Select the PLL input to the IRC */

  19.                 /* Power down PLL to change the PLL divider ratio */
  20.                 Chip_SYSCON_PowerDown(SYSCON_PDRUNCFG_PD_SYS_PLL);

  21.                 /* Setup PLL configuration */
  22.                 pllConfig.desiredRate = iFreq;
  23.                 pllConfig.InputRate = 0;
  24.                 pllConfig.flags = PLL_CONFIGFLAG_FORCENOFRACT;
  25.                 pllError = Chip_Clock_SetupPLLData(&pllConfig, &pllSetup);
  26.                 if (pllError == PLL_ERROR_SUCCESS) {
  27.                         pllSetup.flags = PLL_SETUPFLAG_WAITLOCK | PLL_SETUPFLAG_ADGVOLT;
  28.                         pllError = Chip_Clock_SetupSystemPLLPrec(&pllSetup);
  29.                 }
  30.         }

  31.         /* Set system clock divider to 1 */
  32.         Chip_Clock_SetSysClockDiv(1);

  33.         /* Set main clock source to the system PLL. This will drive 24MHz
  34.            for the main clock and 24MHz for the system clock */
  35.        if (usePLL)
  36.                 Chip_Clock_SetMainClockSource(SYSCON_MAINCLKSRC_PLLOUT);
  37.       else
  38.                 Chip_Clock_SetMainClockSource(SYSCON_MAINCLKSRC_IRC);</font>

  39.         /* ASYSNC SYSCON needs to be on or all serial peripheral won't work.
  40.            Be careful if PLL is used or not, ASYNC_SYSCON source needs to be
  41.            selected carefully. */
  42.         Chip_SYSCON_Enable_ASYNC_Syscon(true);
  43.         Chip_Clock_SetAsyncSysconClockDiv(1);
  44.         Chip_Clock_SetAsyncSysconClockSource(SYSCON_ASYNC_IRC);
  45. }

  46. /* Find encoded MDEC value for raw M value, max M = MVALMAX */
  47. static uint32_t pllEncodeM(uint32_t M)
  48. {
  49.         uint32_t i, x;

  50.         /* Find MDec */
  51.         switch (M) {
  52.         case 0:
  53.                 x = 0x1FFFF;
  54.                 break;

  55.         case 1:
  56.                 x = 0x18003;
  57.                 break;

  58.         case 2:
  59.                 x = 0x10003;
  60.                 break;

  61.        case 7:
  62.                 x = 0x1F;
  63.                 break;

  64.         case 8:
  65.                 x = 0x3F;
  66.                 break;

  67.         case 10:
  68.                 x = 0xFF;
  69.                 break;

  70.         case 12:
  71.                 x = 0x3FF;
  72.                 break;

  73.         default:
  74.                 x = 0x04000;
  75.                 for (i = M; i <= MVALMAX; i++) {
  76.                         x = (((x ^ (x >> 1)) & 1) << 14) | ((x >> 1) & 0x3FFF);
  77.                 }
  78.                 break;
  79.         }

  80.         return x & (PLL_SSCG0_MDEC_VAL_M >> PLL_SSCG0_MDEC_VAL_P);
  81. }

  82. /* Find decoded M value for raw MDEC value */
  83. static uint32_t pllDecodeM(uint32_t MDEC)
  84. {
  85.         uint32_t m, i, x;

  86.         /* Find MDec */
  87.         switch (MDEC) {
  88.         case 0x1FFFF:
  89.                 m = 0;
  90.                 break;

  91.         case 0x18003:
  92.                 m = 1;
  93.                 break;

  94.         case 0x10003:
  95.                 m = 2;
  96.                 break;

  97.         case 0x1F:
  98.               m = 7;
  99.                 break;

  100.         case 0x3F:
  101.                 m = 8;
  102.                 break;

  103.         case 0xFF:
  104.                 m = 10;
  105.                 break;

  106.         case 0x3FF:
  107.                 m = 12;
  108.                 break;

  109.         default:
  110.                 x = 0x04000;
  111.                 m = 0xFFFFFFFF;
  112.                 for (i = MVALMAX; ((i >= 3) && (m == 0xFFFFFFFF)); i--) {
  113.                         x = (((x ^ (x >> 1)) & 1) << 14) | ((x >> 1) & 0x3FFF);
  114.                         if ((x & (PLL_SSCG0_MDEC_VAL_M >> PLL_SSCG0_MDEC_VAL_P)) == MDEC) {
  115.                                 /* Decoded value of MDEC */
  116.                                 m = i;
  117.                         }
  118.                 }
  119.                 break;
  120.         }

  121.         return m;
  122. }
复制代码


红色的地方是经过后面添加的。

下面分别给出LPC54102以及LPC54114修改前和修改后的Chip_SetupIrcClocking函数的运行时间:

1. LPC54102

修改前

LPC54102_NO.png

修改后

LPC54102_ok.png


2 Lpc54114

修改前

LPC54114_no modify_60ms.png

修改后

LPC54114_modified_260us.png

可以发现,经过修改后,Chip_SetupIrcClocking运行时间缩短,其实也是启动时间的缩短。
这里也分享了LPC54114和LPC54102的代码,希望对大家有帮助。
lpc5411x_xpresso54114_keil_iar_v3.01.000.rar (4.85 MB, 下载次数: 23)
回复

使用道具 举报

  • TA的每日心情
    开心
    2021-6-10 15:47
  • 签到天数: 1251 天

    [LV.10]以坛为家III

    6

    主题

    2396

    帖子

    3

    金牌会员

    Rank: 6Rank: 6

    积分
    7534
    最后登录
    2023-3-8
    发表于 2018-10-14 20:18:19 | 显示全部楼层
    不错啊,,,
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-20 10:08 , Processed in 0.117156 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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