查看: 2781|回复: 5

[求助] kl25不会进去VLPR

[复制链接]

该用户从未签到

2

主题

21

帖子

0

注册会员

Rank: 2

积分
138
最后登录
2017-12-26
发表于 2016-8-6 21:42:26 | 显示全部楼层 |阅读模式
使用蓝宙的KL25核心板及底层,自己配寄存器进入VPLR,失败了

代码如下:

//自带的初始化代码
void sys_init(void)  
{
  SIM_SCGC5 |= SIM_SCGC5_PORTA_MASK
                          | SIM_SCGC5_PORTB_MASK
                          | SIM_SCGC5_PORTC_MASK
                          | SIM_SCGC5_PORTD_MASK
                          | SIM_SCGC5_PORTE_MASK;

  #if defined(NO_PLL_INIT)
    core_clk_mhz = 20;                      //如果定义不初始化锁相环,则进入 FEI mode
#else
    /* 增强系统频率   可以在这里设置超频  */
    core_clk_mhz = pll_init(MCG_CLK_MHZ);
#endif

    //通过pll_init函数的返回值来计算内核时钟和外设时钟,便于其他函数可查询时钟频率
    core_clk_khz = core_clk_mhz * 1000;
    bus_clk_khz = core_clk_khz / (((SIM_CLKDIV1 & SIM_CLKDIV1_OUTDIV4_MASK) >> 16) +1);


//   uart_init(LANDZO_PORT, LANDZO_BAUD);    //初始化 printf 函数所用到的串口

}


////////////////////////自己加的进入VLPR的代码
  SMC_PMPROT =  SMC_PMPROT | SMC_PMPROT_AVLP_MASK;

  SMC_PMCTRL =  SMC_PMCTRL | SMC_PMCTRL_RUNM(2);

  while(SMC_PMSTAT != 0x04);//进入VLPR


然后就卡在最后一句while里了,查此时
SMC_PMPROT = 0X20
SMC_PMCTRL = 0X40
SMC_PMSTAT - 0X01

这是怎么回事



我知道答案 目前已有5人回答
回复

使用道具 举报

  • TA的每日心情

    2017-1-4 08:05
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    85

    主题

    1629

    帖子

    1

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2569

    优秀版主

    最后登录
    2019-3-28
    发表于 2016-8-6 23:02:29 | 显示全部楼层
    SDK2.0里面有低功耗模式的代码,建议LZ下载了研究一下
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24858
    最后登录
    2025-7-17
    发表于 2016-8-8 09:34:57 | 显示全部楼层
    楼主你好。
    如果需要KL25的低功耗寄存器控制方式的例程,请参考官方的FRDM板,蓝宙的板子以及代码没测过,所以不清楚。
    建议你参考官方的低功耗例程中的VLPR配置方式,例程下载链接:
    http://cache.nxp.com/files/32bit/software/KL25_SC.exe?fpsp=1&WT_TYPE=Lab%20and%20Test%20Software&WT_VENDOR=FREESCALE&WT_FILE_FORMAT=exe&WT_ASSET=Downloads&fileExt=.exe

    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24858
    最后登录
    2025-7-17
    发表于 2016-8-8 09:37:28 | 显示全部楼层
    进入VLPR的代码:

    1. int enter_vlpr(void)
    2. {
    3.   int i;
    4.   unsigned int return_value = 0;  //default return value = indicates error
    5.   if ((SMC_PMSTAT & SMC_PMSTAT_PMSTAT_MASK)== 4){
    6.          return_value = 0x14;
    7.          }
    8.   /* The PMPROT register may have already been written by init code
    9.      If so then this next write is not done.  
    10.      PMPROT is write once after RESET  
    11.      this write-once bit allows the MCU to enter the
    12.      very low power modes: VLPR, VLPW, and VLPS   */
    13.   SMC_PMPROT = SMC_PMPROT_AVLP_MASK;  
    14.    
    15.   /* Set the (for MC1)LPLLSM or (for MC2)STOPM field
    16.      to 0b010 for VLPS mode -
    17.      and RUNM bits to 0b010 for VLPR mode  */
    18.   SMC_PMCTRL &= ~SMC_PMCTRL_RUNM_MASK;
    19.   SMC_PMCTRL  |= SMC_PMCTRL_RUNM(0x2);
    20.   /* Wait for VLPS regulator mode to be confirmed */
    21.   for (i = 0 ; i < 10000 ; i++)
    22.     {     /* check that the value of REGONS bit is not 0
    23.              once it is a zero we can stop checking */
    24.       if ((PMC_REGSC & PMC_REGSC_REGONS_MASK) ==0x04){
    25.        /* 0 Regulator is in stop regulation or in transition
    26.             to/from it
    27.           1 MCU is in Run regulation mode */
    28.       }  
    29.       else  break;
    30.     }  
    31.   if ((PMC_REGSC & PMC_REGSC_REGONS_MASK) ==0x04)
    32.     {  
    33.       return_value = 0x24;
    34.     }
    35.   /* SMC_PMSTAT register only exist in Mode Controller 2 MCU versions */
    36.   if ((SMC_PMSTAT & SMC_PMSTAT_PMSTAT_MASK) == 4)  
    37.     {
    38.       return_value = SMC_PMSTAT;
    39.     }
    40.   return (return_value);
    41. }<p> </p>
    复制代码

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-7-31 10:09
  • 签到天数: 392 天

    连续签到: 1 天

    [LV.9]以坛为家II

    45

    主题

    1338

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    3163
    最后登录
    2024-12-27
    发表于 2016-8-8 09:53:38 | 显示全部楼层
    进入VLPR对晶振的频率有要求,你要注意一下!
    今天天气不错!签到!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24858
    最后登录
    2025-7-17
    发表于 2016-8-8 10:04:38 | 显示全部楼层
    进入VLPR需要注意时钟模式:
    If entering VLPR mode, MCG has to be configured and enter BLPE mode or BLPI mode with the Fast IRC clock selected (C2[IRCS]=1). After it enters VLPR mode, writes to any of the MCG control registers that can cause an MCG clock mode switch to a non low power clock mode must be avoided.
    内核时钟最大4Mhz, bus最大1Mhz, flash最大1Mhz。
    所以,如果当前不是BLPE或者BLPI,需要做时钟模式转换:

                    op_mode = what_mcg_mode();
                    if(op_mode==PEE)
                    {
                      vlp_clock_config(BLPE);
                    } else if (op_mode==FEI)
                    {
                      vlp_clock_config(BLPI);
                    }
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-18 14:01 , Processed in 0.096673 second(s), 26 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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