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:运行一两个月后看门狗无法复位芯片

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1198687/msp430fr6972-the-watchdog-cannot-reset-the-chip-after-running-for-a-month-or-two

器件型号:MSP430FR6972

大家好、

芯片:MSP430FR6972
自己的电路板
编程 器和编程软件版本:Xiwei 离线编程器
非官方惯例
使用的开发环境和版本:CCS11.1.0
计算机操作系统:Windows 11


MCU 直接连接到3.6V 电池、开关方法如下:

我在 Fram 中创建开关变量 POWER_STATE、MCU 将在变量 开始运行后判断其值。 如果 值为1、则会直接打开。 如果 该值为0、则将进入 LPM3。

我使用 IO 端口的外部中断作为加电按钮。

上电:按下按钮后、它将进入中断、修改 POWER_STACH = 1、并退出到 LPM0。

关断:按下按钮后、POWER_STUARY = 0; 我通过看门狗手动复位芯片。

当前的问题:一开始没有问题,但一个问题在持续了一个多月之后才出现。 在关闭之前、一切都正常运行。 关闭后、无法正常打开、手动复位(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个器件、其中9个器件在运行45天后关闭后无法打开。

此致、

凯瑟琳

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

    复位器件的代码(WDCTL = 0xDEAD;)只是一个片段、不属于任何函数。

    您的低功耗设置不一致。 您设置了 LPM3 (SCG1+SCG0+CPUOFF)、但在 ISR 中、您清除了 LPM0。 (CPUOFF)这是坏的。 我通过几种方式来处理这一问题。 第一个是定义一些低功耗模式宏、用于在头文件中设置和清除低功耗模式。 然后在整个项目中使用它们。 这使得更改变得容易、并且保持一致。

    另一个是使用 LPM4_EXIT、因为这会清除所有 LPM 位、因此无论设置哪种模式都无关紧要。