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.

MSP430FR6972: 运行一两个月后看门狗无法复位芯片

Part Number: MSP430FR6972
  1. 芯片型号:MSP430FR6972
  2. 自己的电路板
  3. 烧录器型号以及烧录软件版本:稀微离线编程器
  4. 非官方例程
  5. 使用的开发环境以及版本:CCS11.1.0
  6. 电脑操作系统:WINDOWS 11

单片机直接连接3.6V电池,开关机实现方式:

在Fram中创建开关机变量power_state,mcu运行后判断该变量的值,如果是1,就直接开机,如果是0,就进入LPM3

使用IO口外部中断,作为开机按键

开机:按下按键后,进入中断,修改power_state = 1,退出到LPM0

关机:按下按键后,power_state = 0;手动看门狗复位。

目前的问题:短时间运行没有问题,运行超过1个月,关机前运行一切正常,关机后无法正常开机,手动复位(rst引脚接地)也无法运行,外部rtc震荡正常,必须给单片机断电再上电,才能恢复运行。

void main(void)
{
  uint16_t i;
  WDT_A_hold(WDT_A_BASE);
  GpioConfig();
  Kp2InterruptConfig();
  CsConfig();
  RtcConfig();
  __enable_interrupt();
  while (power_state == 0)
  {
    LED_RED_OFF;
    __bis_SR_register(LPM3_bits);
    __no_operation(); // BREAKPOINT HERE to verify the
    while (IS_KP2_LOW)
    {
      LED_RED_ON;
      if (rtc_sec - kp2_time > 1)
      {
        power_state = 1;
        break;
      }
    }
  }
  LED_GREEN_ON;
  LED_RED_ON;
  LED_YELLOW_ON;
  
  while(1)
  {
  }
}
void Kp2InterruptConfig(void)
{
  GPIO_selectInterruptEdge(
      KP2_PORT,
      KP2_PIN,
      GPIO_HIGH_TO_LOW_TRANSITION);
  GPIO_clearInterrupt(
      KP2_PORT,
      KP2_PIN);
  GPIO_enableInterrupt(
      KP2_PORT,
      KP2_PIN);
}

void CsConfig(void)
{
    GPIO_setAsPeripheralModuleFunctionInputPin(
        GPIO_PORT_PJ,
        GPIO_PIN4 + GPIO_PIN5,
        GPIO_PRIMARY_MODULE_FUNCTION
    );

    //Set DCO frequency to 8 MHz
    CS_setDCOFreq(CS_DCORSEL_0,CS_DCOFSEL_6);
    //Set external clock frequency to 32.768 KHz
    CS_setExternalClockSource(32768,0);
    //Set ACLK=LFXT
    CS_initClockSignal(CS_ACLK,CS_LFXTCLK_SELECT,CS_CLOCK_DIVIDER_1);
    //Set SMCLK = DCO with frequency divider of 1
    CS_initClockSignal(CS_SMCLK,CS_DCOCLK_SELECT,CS_CLOCK_DIVIDER_1);
    //Set MCLK = DCO with frequency divider of 1
    CS_initClockSignal(CS_MCLK,CS_DCOCLK_SELECT,CS_CLOCK_DIVIDER_1);
    //Start XT1 with no time out
    CS_turnOnLFXT(CS_LFXT_DRIVE_0);
}

void RtcConfig(void)
{
    GPIO_setAsPeripheralModuleFunctionInputPin(
        GPIO_PORT_PJ,
        GPIO_PIN4 | GPIO_PIN5,
        GPIO_PRIMARY_MODULE_FUNCTION);

    CS_turnOnLFXT(
        CS_LFXT_DRIVE_3);

    RTC_C_clearInterrupt(RTC_C_BASE,
                         RTC_C_CLOCK_READ_READY_INTERRUPT);

    RTC_C_enableInterrupt(RTC_C_BASE,
                          RTC_C_CLOCK_READ_READY_INTERRUPT);

    RTC_C_startClock(RTC_C_BASE);
}

//开机中断
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector = PORT2_VECTOR
__interrupt
#elif defined(__GNUC__)
__attribute__((interrupt(PORT2_VECTOR)))
#endif
    void
    Port2Vector(void)
{
  kp2_time = rtc_sec;
  if (lcd_on == 0)
    lcd_on = 1;
  LED_RED_ON;

  GPIO_clearInterrupt(
      KP2_PORT,
      KP2_PIN);
  __bic_SR_register_on_exit(LPM0_bits);
}

//关机
case KEY_LEFT_LONG:
		power_state = 0;
		__delay_cycles(8000000 * 2);
		WDTCTL = 0xDEAD;
		break;

  • 非偶发现象,10台机器,运行45天,9台关机后无法开机

  • 您复位设备的代码 (WDCTL = 0xDEAD;) 只是一个片段,而不是任何函数的一部分。

    您的低功率设置不一致。您设置了 LPM3 (SCG1+SCG0+CPUOFF) ,但在 ISR 中您清除了 LPM0(CPUOFF),这不太好。我以以下几种方法处理这个问题。首先是在头文件中定义一些用于设置和清除低功耗模式的低功耗模式宏,然后在整个项目中使用它们,这便于更改和保持一致。

    另一种是使用 LPM4_EXIT,因为这会清除所有 LPM 位,因此设置哪种模式没有影响。