本帖最后由 小恩GG 于 2022-3-7 16:29 编辑
LPC43xx系列 (deep) power down 唤醒注意事项 1 问题描述 LPC43xx系列在运行LPCOpen低功耗例程 misc_pmc_states时,遇到power down和deep power down这两种模式无法成功通过Alarm Timer唤醒问题,本文对该系列问题进行分析并提供了相应的解决方法。通过RTC唤醒同样存在相同问题和解决方案。 2 原因分析 唤醒失败的原因包括以下三方面: - SRAM掉电问题:lpc43xx系列在power down 模式下,只有8K的SRAM不掉电,其它SRAM掉电。而从power down模式唤醒后,程序继续向后执行,并非reset, 所以应保证进入power down时,stack在不掉电的8K SRAM中,数据不丢失。 - Alarm timer中断使能问题:LPC43xx系列 Alarm timer中断使能不能立即生效,需要一段时间。如果进入低功耗前,没有成功使能,依然无法从低功耗模式下唤醒。 - Downcounter寄存器问题:LPC43xx系列,为了确保指定时间唤醒,需要判断设定值成功写入Downcounter寄存器。 powerdown和deep powerdown这两种模式唤醒失败原因表格总结如下: 3 解决方法 对于power down 唤醒失败需根据三种问题分别解决; 对于deep power down 唤醒不存在数据丢失问题,因为从deep power down 模式唤醒后,程序重新复位执行,不需要之前的数据。所以解决方案跳过第一条,只需要3.2和3.3. 3.1 SRAM掉电问题解决方法 如手册所示,LPC43xx系列Power-down模式下仅有8kB local SRAM中不会失电。注意:带内部flash 不带内部flash芯片的8K SRAM地址范围不同。 对于 LPC4330/LPC4350/LPC4370这类不带内部flash系列产品,此8K SRAM地址范围是0x10090000– 0x10092000(8KB)地址范围, 而LPC4337/LPC4367这类带内部flash的芯片地址范围是0x10088000 –0x1008A000(8KB)时.将stack放到此8KSRAM区域就可以解决丢失数据的问题。 以LPC4350为例,在MCUXpressoIDE中设置方法如下:
1 按 Project \ Properties \ C\C++ Build\MCU settings路径找到以下界面,单独定义此8K SRAM,地址为0x10090000,大小设置为0x2000。 2 进入Project \ Properties \ C\C++ Build \Settings\MCULinker\Managed Linker Script路径,将Heap and Stackplacement切换为MCUXpressoStyle,并将Stack区域改为上一步所设置的SRAM。 此时,SRAM区域失电问题设置完成。
3.2 Alarm timer中断使能问题解决方法 为确保使能ATarm timer 中断,在其后添加while循环查询,直到成功使能。以src\pmc_states.c路径进入函数,在相应case模式的Chip_ATIMER_IntEnable(LPC_ATIMER);函数语句之后添加while((LPC_ATIMER->ENABLE& 0x01) != 0x01){}。
3.3 Downcounter寄存器写入问题解决方法 此问题解决方案与3.2类似,仍以src\pmc_states.c路径进入函数,在相应mode的case中(与3.2位置一致)找到LPC_ATIMER->DOWNCOUNTER= RTC_ALARM_TIME*1000; 在其后添加while判断语句: while(LPC_ATIMER->DOWNCOUNTER != RTC_ALARM_TIME*1000); 如下图。
4 验证注意事项 在没有内部flash 开发板上测试(如:LPC4370,LPC4350…)时,例如Hitex LPC4350Evaluation board,需要将启动配置为外部 flash 启动,参考图片如下。 在启动时需要将引脚P2_9,P2_8,P1_2,P1-1设置为低低低高的形式,以SPIFI形式启动。跳线设置如图。
|