1. 之前有提问过LPM4 使用RTC唤醒的问题(https://e2echina.ti.com/question_answer/microcontrollers/msp430/f/55/t/176268),大概原因就是:CSCTL8寄存器中的ACLKRREQEN(时钟请求默认是启用的),当进入LPM4之前检测到RTC是活动的,ACLK会开启,导致不能真正进入LPM4模式。
2. 上述现象,我是不是可以理解为实际进入的是LPM3模式?因为我在实际测试中发现,睡眠唤醒都很正常,加上我的一些外围电路,睡眠时的功耗只有约6ua。
3. 如果我的猜想成立,那我程序中睡眠时直接写入LPM3模式,功耗应该也差不多是6ua?,但我实际测试同样的电路功耗约24ua,差别很大,(RTC唤醒方式:程序用LPM3模式睡眠功耗约24,程序用LPM4模式睡眠功耗约6ua)。
4. 如果我的猜想不成立,那RTC唤醒的情况下,程序使用LPM4睡眠到底真正是进入什么睡眠状态呢,这种方式到底可不可正常使用用呢?
请教各位高手,谢谢!
Susan Yang:
通常对于RTC,您需要从ACLK获取时钟。在这种情况下,您可以使用的最低功耗模式是LPM3模式,因为LPM3模式不会禁用ACLK。
若是您使用LPM4的话,按照我的理解应该会进入一个没有明确编号的LPM模式。也就是说所谓的LPM名称并不存在。它们只是状态寄存器中不同的位组合,具有部分组合和部分独立的效果。
因为在设置中CPUOFF位会停止CPU。该位是所有LPM的一部分,无论其他位是否有效,它总是有效的。
您甚至可以创建其他尚不存在的组合。就像禁用DCO但让CPU保持活动状态一样。
它没有自己的LPM编号,但是可能的,有时是有用的组合。
jie sun:
回复 Susan Yang:
1. 但我是目前使用LPM3模式与LPM4模式(RTC唤醒)的功耗相关太大了,因为我目前对LPM4模式+RTC的理解,应该就是ACLK开启了,其它能关闭的都关闭,如下图
2. 我在LPM3模式下按理应该同样可以达到LPM4+RTC配置效果,如下图
与LPM4不同的都是可选项(意味着我可以关闭)达到只开启ACLK的效果。
3. 但是我现在测试(LPM3+RTC),最后睡眠只开启了RTC,其它外设都是关闭的(未使用到的时钟应该都会关闭),功耗与LPM4+RTC相关很大(6ua,24ua)
灰小子:
回复 jie sun:
楼主你好,LPM3和LPM4之间的差别,除了你用红框圈出的,还有中断源等内部电路。
实际上,在mcu选用低功耗模式的时候,除了关注某种低功耗模式的电流外,更关心的是mcu在这种低功耗模式下可用的资源,以及系统在软件和硬件上的低功耗实现。
Susan Yang:
回复 jie sun:
既然您要使用RTC,那为何不直接使用LPM3.5呢?
jie sun:
回复 Susan Yang:
1. 我想搞清楚两者功耗差距的原因:
A)我LPM3模式操作有问题?(进入LPM3模式还需要其它特定操作?所有外设都是关闭的包括看门狗,;只开启了RTC;CS寄存器我也反复查看过,没有特定操作来降低LPM3的功耗,时钟条件请求位也禁用了),
B)又或者是LPM3与LPM4的功耗相差本来就这么大(但是从官方手册上看不应该有这么大的差距)
Susan Yang:
回复 jie sun:
个人感觉您的LPM3配置估计有问题,官方数据
ILPM3, RTC Low-power mode 3, RTC, excludes SVS3 V25℃下 Supply Currents 为 1.25 µA
而Low-power mode 4, excludes SVS3 V25℃下 Supply Currents 为 0.58µA
若是可以的话,给出您的相关代码
Susan Yang:
回复 jie sun:
另外官网有进入LPM3的例程,您也可以测试一下
ti\msp\MSP430Ware_3_80_07_00\examples\devices\MSP430FR2xx_4xx\MSP430FR413x_MSP430FR203x_Code_Examples\C
内
msp430fr413x_LPM3_01.cEnters LPM3 with ACLK = XT1CLK = 32768Hz.
msp430fr413x_LPM3_02.cConfigure MCLK and SMCLK up and down to adapt LPM3.
jie sun:
回复 Susan Yang:
void sleep(void);int main(void){// Stop Watchdog timerWDTCTL = WDTPW + WDTHOLD;//初始化gpio /* 按低功耗要求配置 */LowPower_InitGPIO( );CSCTL3 |= 0x0010;//REFO做为FLL稳定频率__bic_SR_register(SCG0); // enable FLLwhile(CSCTL7 & (FLLUNLOCK0 | FLLUNLOCK1)); // 等待频率锁相环FLL锁定// 选择MCLK和SMCLK时钟源:DCOCLKDIV(FLL将MCLK和SMCLK的频率稳定为1MHz 并且DCOCLKDIV频率为1MHz),// SMCLK默认与MCLK同频;选择ACLK时钟源:REFO(内部32kHz 时钟源)CSCTL4 = SELMS__DCOCLKDIV | SELA__REFOCLK;CSCTL8 = 0; //禁用时钟条件请求__enable_interrupt();sleep();...... }void sleep(void){RTCMOD = LOWPOWER_TIME_10SEC;// TI 建议在使能RTC 计数器中断前通过读取RTCIV 寄存器将RTCIFG 位清零。if ( RTCIV ){} else {}//1000分频,VLOCLK时钟源RTCCTL |= RTCPS__1000 | RTCSS__VLOCLK | RTCIE | RTCSR;__bis_SR_register(LPM3_bits | GIE);}1. 这是我贴出的部分低功耗处理代码,麻烦看一下
2. 我对比了TI官方的LPM3例程,好像没有太大的区别,只是官方使用的是XT1,而我用的是REFO
3. GPIO部分我没有贴出,都是按照低功耗要求处理的,因为在LPM4+RTC模式下没有功耗异常,应该是正确的