This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/MSP430FR5994:从中断返回时,有条件地关闭低功耗模式。 (LPM2至激活)

Guru**** 2595800 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/630152/ccs-msp430fr5994-conditionally-turn-off-low-power-mode-when-returning-from-interrupt-lpm2-to-active

部件号:MSP430FR5994

工具/软件:Code Composer Studio

大家好,

我正在尝试减少此代码中断唤醒的数量,但它的行为不符合我的预期。  

通常,ISR每秒发生512次。 在ISR中,每32次检查一个计数器并设置一个标志(因此每秒16次)。

我在每个ISR上使用"__BIC_SR_REGISTER_ON_EXIT (APP_SLEE_Bits)",这意味着每次运行主循环(512Hz),但会检查该标志,因此它仅以16Hz的频率执行相关操作。  

如下所示。  

我认为这是一种浪费,所以我修改为在 ISR的“IF (发生了32个中断)”条件内只使用“__BIC_SR_REGISTER_ON_EXIT (APP_SLEEGE_Bits)”,所以只会以16Hz唤醒主环路。这会增加电流!

 155uA (在512hz唤醒,但以16Hz进入"ISR_Flag_Set"过程时)。  

 在16hz唤醒时为280uA。  

while (1)
{
	IF (ISR_Flag_Set)//16Hz
	{
		//DO stuff
	}//
	检查并处理其他任务。
	FRCTL0 = FRCTLPW;
	GCCTL0 &=~FRPWR;
	__bis_sr_register(app_sleep_bits | GIE);
	__no_operation();//用于调试器
} 

/* ------------------------ ISR例程,512Hz ----------------------- */

#pragma vector=DMA_vector
__interrupt void DMA_ISR(void)
{
范围_蓝色_高;
SWITCH(__EIV_IN_RANGE(DMAIV,16))
{
案例0:中断;//不中断
案例2:中断;// DMA0IFG
案例4:// DMA1IFG

//做一些事情

如果(发生了32个中断)
{
//主回路中的过程(16Hz时)
ISR_Flag_Set =真;
}
__BIC_SR_REGISTER_ON_EXIT (APP_SLEE_Bits);
中断;
案例6:中断;// DMA2IFG
案例8:中断;//保留
案例10:中断;//保留
案例12:中断;//保留
判例14:中断;//保留
判例16:中断;//保留
默认值:break;
}
scope_blue_low;
} 

我想可能是因为FRAM在ISR中通电,但在修改的版本中没有关闭,所以我补充说:

FRCTL0 = FRCTLPW;//仅在16Hz唤醒时会消耗更多电量。FRAM保持通电??
GCCTL0 &=~FRPWR;//无法禁用ealier,因为任何访问都能使其再次启用??

在ISR结束时,这没有改变,不确定我打电话给它后,FRAM控制器是否只是直接唤醒它。  

我想在收到IRQ时会自动启用某项功能,我没有将其关闭。但我想不出什么原因。有什么想法?

我看到的大多数示例代码在 每个ISR中无条件地使用__BIC_SR_REGISTER_ON_EXIT。 这是因为不建议在ISR中进行条件唤醒吗?

谢谢,

Michael。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    根据您的编码方式,每次中断后,您将始终唤醒并检查主环路。 如果只想在满足条件时唤醒(又称每16Hz唤醒),则需要将LPM2_Exit移动到条件内。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,JH。 干杯,但正如我所说的,我将其移到条件内,这增加了电流。我本应该表明,在上面的代码块中,它会更清晰。
    我确实验证了它只在16Hz唤醒,但电流增加了。所以我想知道是不是FRAM自动打开,而是只在16Hz打开,而是每次都关闭它。
    引述:
    "我认为这是一种浪费,因此我修改为只在ISR中的" IF (发生了32次中断){...}"条件内使用"__BIC_SR_REGISTER_ON_EXIT (APP_SLEEGE_Bits)",因此只会以16Hz唤醒主环路..."
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好Michaelmac:

    FRAM确实需要额外的电流来保持打开,但设备的大部分电流由时钟控制。低功耗模式确实会关闭每个模式中的某些时钟以节省电量。 但是,由于自动时钟请求功能,如果外围设备在您进入关闭时请求时钟,该部件将保持该时钟处于活动状态,从而有效地使设备保持高于预期的LPM。 在这些线路上,DMA仅使用MCLK进行操作。 这很可能是因为DMA一直处于活动状态,所以您看到的电流增加,这导致MCLK处于活动状态,因此您只能进入LPM0。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嘿,
    尽管如此,DMA仍以相同的方式运行,并且仍生成512Hz的中断。
    您的意思是,当ISR完成时,睡眠位在返回时恢复,但DMA不允许完全恢复,因此它将进入LPM0? 然后回到主循环中,在调用"__bis_sr_register (app_sleep_bits | gie);"时,现在允许进入完全休眠状态。 (睡眠位= LPM2)。
    所以当我只在16Hz的频率下唤醒主回路时,它只能正常地进入睡眠状态,每32个中就有1个。 (512/16)?

    谢谢!
    Michael。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    为了澄清,这些位是正确写入的,只是由于外围设备自动请求使有效的LPM的顺序高于指定的顺序,时钟仍可以打开。 这完全取决于时间安排以及不同外设使用的时钟。 您的DMA的teh触发器是什么?触发器使用什么时钟?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    您是否能够解决您的问题? 如果没有响应,此线程将很快关闭。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Jace:  

    不,我无法做到,但可以自由地闭合螺纹。  

    谢谢,

    Michael。