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/MSP430FR2111:控制器在20秒后重置,看门狗被禁用。

Guru**** 2582415 points
Other Parts Discussed in Thread: MSP430FR2111, MSP430FR2311

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/615771/ccs-msp430fr2111-controller-resets-after-20-seconds-watchdog-diabled

部件号:MSP430FR2111
主题中讨论的其他部件: MSP430FR2311

工具/软件:Code Composer Studio

您好,

我正在使用MSP430FR2111在LPM3中等待一段时间后读取ADC值。 我正在使用计时器B0中断唤醒。 ADC也使用中断。

一切正常(LED´s闪烁,ADC_RESult填充´s数据),直到控制器在大约20秒后重置。 ADC_Result中的数据被擦除,ADC再次开始在位置0中写入数据。

我尝试了几件事,但没有任何帮助。

我正在使用CCS 7.2 和MSP430FR2311 LaunchPad对自己的MSP板进行编程。

这是我的代码:

#include <msp430fr2111.h>

无符号int计数器=0;
无符号int i =0;
无符号int ADC_Result [60];

void main (void){
WDTCTL = WDTPW + WDTHOLD;//停止WDT

P1DIR |=0x03;//将WFP 1.2 设置为输出方向
P2DIR |= 0x01;//将WFP 2.0 设置为输出方向
P2DIR |= 0x02;//将WFP 2.1 设置为输出方向
P1OUT = 0x00;//将P1输出设置为低
P2OUT = 0x00;//设置P2输出过低

PM5CTL0 &=~LCKLPM5;//禁用GPIO开机默认高阻抗模式
//以激活先前配置的端口设置

//配置ADC10
ADCCTL0 |= ADCSHT_2 | ADCON;// ADCON,S&H=16 ADC CLKS
ADCCTL1 |= ADCSHP;// ADCCLK = MODOSC;采样计时器
ADCCTL2 |= ADCRES;// 10位转换结果
ADCMCTLS0 |= ADCINCH_0;// A0 ADC输入选择;Vref=AVCC
ADCIE |= ADCIE0;//启用ADC连接完全中断

TB0CCTL0 = CCIE;// CCR0中断已启用
TB0CCR0 = 511;//计时器计数比较:4095 -> 1秒,
TBCTL = TBSSEL_1 + ID_3 + MC_1;// ACLK,/8,upmode

_BIS_SR (LPM3_Bits + GIE);//输入带中断的LPM3

用于(;){}
}

//计时器A0中断服务例程
#pragma vector=TIMER0_B0_vector
__interrupt void Timer_B (void)

计数器++;
IF (计数器= 5)// 1 min 480

P1OUT |= 0x03;//设置输出WFP 1.2
P2OUT |= 0x01;//将LED设置为绿色
}
IF (计数器=6)

ADCCTL0 |= ADCENC | ADCSC;//开始采样和转换
P2OUT &=~(0x01);//透明LED绿色
P2OUT |= 0x02;//将LED设置为红色
计数器= 0;
_BIS_SR (LPM0_BITS | GIE);// LPM0,带中断
}
否则

_BIS_SR (LPM3_Bits + GIE);//输入带中断的LPM3
}


}

// ADC中断
#pragma vector=ADC_vector
__interrupt void ADC_ISR(void)

SWITCH(__EIV_IN_RANGE(ADCIV,ADCIV_ADCIFG))

案例ADCIV_NONE:
_BIS_SR (LPM3_Bits + GIE);//输入带中断0的LPM3
中断;
Case ADCIV_ADCOVIFG:
_BIS_SR (LPM3_Bits + GIE);//输入带中断0的LPM3
中断;
Case ADCIV_ADCTOVIFG:
_BIS_SR (LPM3_Bits + GIE);//输入带中断0的LPM3
中断;
Case ADCIV_ADCHIIFG:
_BIS_SR (LPM3_Bits + GIE);//输入带中断0的LPM3
中断;
Case ADCIV_ADCLOIFG:
_BIS_SR (LPM3_Bits + GIE);//输入带中断0的LPM3
中断;
Case ADCIV_ADCINIFG:
_BIS_SR (LPM3_Bits + GIE);//输入带中断0的LPM3
中断;
问题ADCIV_ADCIFG:
P1OUT &=~(0x03);//清除输出WFP 1.2
P2OUT &=~(0x02);//透明LED红色
ADC_result[i]= ADCMEMM0;
I++;
_BIS_SR (LPM3_Bits + GIE);//输入带中断0的LPM3
中断;
默认:
_BIS_SR (LPM3_Bits + GIE);//输入带中断0的LPM3
中断;
}
}

非常感谢!

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

    首先,请从ISR中删除所有_BIS_SR(LPM3_bits + GIE);命令。 退出ISR后,LPM3将自动继续,如果您希望输入LPM0,则应在设置LPM0之前清除LMP3位,但无需重置GIE位。 有关详细信息,请参阅TI提供的代码示例。 您还可以检查SYSRSTIV以查看导致重置的特定违规。

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

    感谢您的快速响应。 现在我只清除中断中的LPM,并在main()中设置for循环中的LPM。 这解决了问题。


    非常感谢!
    Florian