查看: 2997|回复: 6

[求助] 关于LPC54114的SDK中POWER_SetLowPowerVoltage函数的使用方法

[复制链接]

该用户从未签到

6

主题

32

帖子

11

中级会员

Rank: 3Rank: 3

积分
463
最后登录
2023-2-23
发表于 2018-4-21 20:45:37 | 显示全部楼层 |阅读模式
50NXP金币
本帖最后由 imetro 于 2018-4-21 23:05 编辑

最近在测试HWVAD,写了个最小化功耗的语音活动唤醒程序,效果很不错,待机功耗约为200uA,可以秒杀各种需要使用CPU计算的方案。配置如下:
1. 将所有未用引脚置于确定状态,断开板上其它外设的连接。
2. 主时钟使用FRO 12 MHz,DMIC使用看门狗振荡器输出的800 kHz,其它时钟树未变。
3. DMIC的OSR设为25,并使能PHY_HALF功能(数字麦克风的实际时钟为400 kHz),其它同SDK中的dmic_hwvad程序。
4. 主循环调用POWER_EnterDeepSleep函数,在进入中断后点亮LED,退出中断后关闭(同dmic_hwvad程序)。

现在的问题是,我想尝试进一步优化功耗。查阅SDK的电源管理API,得知有一个函数POWER_SetLowPowerVoltage可用于为低功耗调节模式设置电压电平(英文原话为Set voltage levels for low power regulation mode.),该函数可以对使用FRO 12 MHz和48 MHz的情况进行优化。按理说这个函数应该适合我的应用,但是在使用这个函数后,发生了意想不到的错误。情况如下:
1. 直接在休眠前使用POWER_SetLowPowerVoltage函数,会导致在执行POWER_EnterDeepSleep函数后再也无法由HWVAD唤醒CPU。
2. 在执行POWER_EnterDeepSleep函数后将MAINCLKSELA改为看门狗振荡器,可以正确地由HWVAD唤醒CPU,但在将MAINCLKSELA改回FRO 12 MHz时死机。
3. 使用LPCOpen中的Chip_POWER_EnterDeepSleep函数,结果同1。
4. 我调用的函数POWER_EnterDeepSleep的语句为
  1. while (1) POWER_EnterDeepSleep(SYSCON_PDRUNCFG_PDEN_SRAM0(1) | SYSCON_PDRUNCFG_PDEN_WDT_OSC(1));
复制代码

如果添加FRO,即语句为
  1. while (1) POWER_EnterDeepSleep(SYSCON_PDRUNCFG_PDEN_SRAM0(1) | SYSCON_PDRUNCFG_PDEN_WDT_OSC(1) | SYSCON_PDRUNCFG_PDEN_FRO(1));
复制代码

再添加POWER_SetLowPowerVoltage函数就可以正常唤醒了,但此时的功耗显然很高(根据数据手册,FRO的电流为200uA,对于之前的结果来说太大了)。

在这里我想请教一下几个问题:
1. POWER_SetLowPowerVoltage函数到底应该如何使用呢?无论是在SDK还是LPCOpen都找不到调用该函数的地方。特别是英文中的low power regulation mode,感觉应该注明到底是什么意思。  
2. LPCOpen版本的电源管理API是有完整的源代码的,但SDK的似乎没有。看了一下LPCOpen的POWER_SetLowPowerVoltage函数,似乎调用了一个名为ROM_POWER的模块,但参考手册并未注明,推测是片上LDO的配置模块;另外还调用了ROM_SYSCONAHBCLKCTRL寄存器开启/关闭了部分模拟模块,这些模块也未在参考手册定义。可否解释一下POWER_SetLowPowerVoltage函数究竟是怎么工作的吗?同样地,还有POWER_SetVoltage函数。
3. 是否可以公布关于ROM_POWER这个模块的更多信息呢?特别是每个寄存器的定义。记得在STM32中相关的内容是公开的,这部分内容要是能够解释一下就再好不过了。


金币不多,还请见谅,谢谢各位回帖的朋友。

回复

使用道具 举报

  • TA的每日心情
    无聊
    2018-7-31 08:40
  • 签到天数: 43 天

    [LV.5]常住居民I

    299

    主题

    876

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    14702
    最后登录
    2020-3-1
    发表于 2018-4-23 10:05:14 | 显示全部楼层
    帮顶
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    该用户从未签到

    656

    主题

    6312

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    20053
    最后登录
    2024-4-28
    发表于 2018-5-2 14:21:45 | 显示全部楼层
    楼主你好,非常抱歉迟回复你了,现在回答你的几个问题:
    1. POWER_SetLowPowerVoltage函数到底应该如何使用呢?
    答: 其实我这边对这个API函数所拥有的资料也很少,没有例程和额外的讲解,只有user manual中提到的几句话。
        low power regulation mode就是低功耗模式。
        POWER_SetLowPowerVoltage函数,你说没有配置FDRUNCFG0中的PDEN_FRO=1的时候,进入低功耗后,不能用HWVAD唤醒CPU.这个时候,你的功耗情况和不加POWER_SetLowPowerVoltage,测试下来具体差别如何?
    2.   可否解释一下POWER_SetLowPowerVoltage函数究竟是怎么工作的吗?同样地,还有POWER_SetVoltage函数
    答:你说的“看了一下LPCOpen的POWER_SetLowPowerVoltage函数,似乎调用了一个名为ROM_POWER的模块”, 是否可以截个图,看看哪里调用ROM_POWER了?但是话说回来,这些功耗API本来就是ROM API,所以肯定是在ROM里面的。 而POWER_SetVoltage以及POWER_SetLowPowerVoltage,根据用户手册的描述,的确是配置了内部的片上调节器。POWER_SetVoltage是用于active mode下内部器件的电压的,我看到lpcopen的PMU代码里面也用了这个函数,而且手册里面讲的内容还比较多,也有注意事项,但是POWER_SetLowPowerVoltage这个倒是没有相关的例子。关于具体原理,由于ROM的代码是没有放出来的,所以目前还没有办法知道具体情况。看功能一个是ACTIVE下面用的,一个是低功耗下用的。如果不谈唤醒的问题,你那边加上低功耗电压配置和不加的实际功耗是否有较大区别?如果没有很大优势,我建议你先不用这个函数,因为这方面的资料真的很少。
    3.  是否可以公布关于ROM_POWER这个模块的更多信息呢?
    很抱歉,这个资料,是不对外开放,我们这边也无法拿到。
    回复

    使用道具 举报

    该用户从未签到

    656

    主题

    6312

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    20053
    最后登录
    2024-4-28
    发表于 2018-5-2 14:46:40 | 显示全部楼层
    楼主你那边意思是如果关掉FRO,进入低功耗,反而能够用HWVAD唤醒是吧?但是功耗很高?这个功耗指的是进入低功耗,还是唤醒之后的功耗?
    如果是唤醒之后的功耗,你试试用POWER_SetVoltage,就跟LPCopen例程里面那样,看看功耗是否能降下来。
    回复

    使用道具 举报

    该用户从未签到

    6

    主题

    32

    帖子

    11

    中级会员

    Rank: 3Rank: 3

    积分
    463
    最后登录
    2023-2-23
     楼主| 发表于 2018-5-2 17:12:39 | 显示全部楼层
    小恩GG 发表于 2018-5-2 14:46
    楼主你那边意思是如果关掉FRO,进入低功耗,反而能够用HWVAD唤醒是吧?但是功耗很高?这个功耗指的是进入低 ...

    之前部分内容说得不够清楚,可能引起误解,还请见谅。

    现在的配置是这样的:DMIC时钟由看门狗振荡器提供(WDTOSCCTRL设置为1.6 MHz二分频后得到800 kHz时钟,DMICCLKSEL设置为0x5即wdt_clk,DMICCLKDIV设置为0即不分频),外设系统时钟由FRO 12 MHz提供(理论上应该无所谓);低功耗模式是深度睡眠模式,PDSLEEPCFG设置看门狗振荡器和SRAM0运行(暂时不需要用到其它外设)。中断等其它设置均正确配置。
    然后实验结果如下:

    1. 不使用POWER_SetLowPowerVoltage函数,直接在循环中执行进入深度睡眠模式的函数,则一切正常,中断可被唤醒,不活动时电流为200 uA不到(包括数字麦克风,下同),算是正常的值。
    2. 在1的基础上使用POWER_SetLowPowerVoltage函数,执行的地方在进入休眠模式之前,此时可以进入深度睡眠模式,但表现为“睡死”的状态,中断无法被唤醒,此时电流接近400 uA。
    3. 在2的基础上把PDSLEEPCFG中的FRO振荡器打开,则一切正常,中断可被唤醒,不活动时电流大于300 uA,相对1来说多余的电流应该是被FRO消耗的。
    4. 在2的基础上在进入深度睡眠前把主时钟切换为看门狗振荡器,则中断可被唤醒,不活动时的电流和1差不多。但是无法在中断或程序的其它地方把主时钟切换回FRO 12 MHz,在执行完切换的代码后直接死机,表现和2类似。
    综上所述,我认为这个函数可能会导致FRO振荡器在进入深度睡眠模式时正常关闭后无法再被打开,至于这个函数执行后应该达到的效果如何无法预料(400 uA的电流可能是因为进入了重置或锁定的状态,不能用作参考),因此也没有办法去判断这个函数执行的必要性。

    未尽事宜可以参考我在NXP官网社区发布的帖子:Usage of POWER_SetLowPowerVoltageForFreq in LPC5411x SDK。话说在链接回复的也是你们吗?如果是的话我就只在这里回复了,毕竟英文打着累
    回复

    使用道具 举报

    该用户从未签到

    6

    主题

    32

    帖子

    11

    中级会员

    Rank: 3Rank: 3

    积分
    463
    最后登录
    2023-2-23
     楼主| 发表于 2018-5-2 17:33:39 | 显示全部楼层
    小恩GG 发表于 2018-5-2 14:21
    楼主你好,非常抱歉迟回复你了,现在回答你的几个问题:
    1. POWER_SetLowPowerVoltage函数到底应该如何使用 ...

    另外说说LPCOpen那边的事情。我这里参考的并不是集成在ROM里面的API。对于LPC5411x,参考手册没有提到电源管理的ROM API,只有LPCOpen和SDK两种API可以用,不像LPC5410x的参考手册还提到了电源管理的ROM API,虽然也提到了不推荐使用。
    网上可以下载到的LPCOpen和SDK,电源管理都是没有源代码的,只有已经编译好的库。官方的Application Note里面有电源管理的源代码,看接口应该是LPCOpen的,但是无法证实是否就是LPCOpen里面电源管理部分的源代码。不管是LPCOpen还是SDK,这两个函数执行的效果是相同的,我把SDK的电源管理库反汇编后执行的功能也基本和Application Note里面的源代码相同。
    我在原文里面提到的ROM_POWER实际上是出自这个Application Note里面电源管理的源代码,位置是lpc5411x_power_lib_source_keil_iar_v1.00.000\lpc5411x\examples_5411x\periph_pmu\src\power_library.c,我截个图给你看看。
    SetLPVD.JPG
    可以看到,这里使用了这个名为ROM_POWER的一些寄存器,而这个ROM_POWER定义的基地址是0x40020000,根据名字和功能来看像是设置片上LDO的模块。这个ROM_POWER在Chip_POWER_SetVoltage函数里面也有用到。不过,我也不明白这里为什么有ROM开头,毕竟这个库在编译后理论上和LPCOpen的电源管理库是一样的。
    回复

    使用道具 举报

    该用户从未签到

    6

    主题

    32

    帖子

    11

    中级会员

    Rank: 3Rank: 3

    积分
    463
    最后登录
    2023-2-23
     楼主| 发表于 2018-5-2 17:43:13 | 显示全部楼层
    小恩GG 发表于 2018-5-2 14:21
    楼主你好,非常抱歉迟回复你了,现在回答你的几个问题:
    1. POWER_SetLowPowerVoltage函数到底应该如何使用 ...

    最后吐点槽,说几个发现的问题:
    1. 我把SDK和LPCOpen的电源管理库给反汇编了,发现有几个函数的实现略有些不一样,比如SDK的库在深度掉电模式下关闭了除(可选的)RTC振荡器外的其它模块,但LPCOpen的库还保留了一些模块的运行,实际测试的效果基本没有区别。我想知道这种情况下是否优先选择SDK的实现?
    2. SDK中没有配置看门狗振荡器的函数,现在只能直接修改寄存器,这个算是相关功能没有实现吧。
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-28 19:01 , Processed in 0.123686 second(s), 25 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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