工具/软件: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。