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.

[参考译文] MSP430FR2475:GPIO ISR 持续执行、MCU 因看门狗触发而复位

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1445738/msp430fr2475-the-gpio-isr-executes-continuosly-and-mcu-resets-due-to-watchdog-trigger

器件型号:MSP430FR2475

工具与软件:

您好!
下面是我的 GPIO 中断代码片段。 计时器中断用于获取代码中的时间节拍。 当收到中断时、会检测到中断、代码有时会正常工作、但在大多数情况下、ISR 函数保持运行、而 while 循环无法执行、这会触发看门狗并将 MCU 复位。 您能建议以下代码的相关问题吗? 计时器 ISR 每1ms 执行一次。
void GPIO_init (void)
   P1DIR &=~BIT2;
    P1REN |=位2;
   P1DIR |=位3;
   P1OUT |=位3;

   //在 P1.2上启用中断
    P1IE |= BIT2;//启用 P1.2上的中断
   P1IES |= BIT2;//高电平到低电平转换时中断(下降沿)
   P1IFG 并且=~BIT2;//清除 P1.1的任何挂起的中断标志
}
void initTimer (void)
   // TIMER0的配置
    TA0CCR0 = 32;//持续 ms
    TA0CTL = TASSEL_1 | MC_1 | TACLR | TAIE;// ACLK、计数模式、清除 TAR、启用中断
   //__bis_SR_register (GIE);//随着中断进入 LPM0
}
void main (void)
     stop_watchdog ();//停止看门狗计时器

    SYSCFG2 |= USCIB0RMP;/*要更改默认的 I2C0引脚、需要执行此操作*/
    SYSCFG3 |= USCIB1RMP;/*要更改默认的 I2C1引脚、需要执行此操作*/

     initClock4.12.4C() 16MHz;
     initTimer();
     system_up = timer_tick;// system_up (用于计算坞站接通时间)

     start_watchdog ();
     InitGPIO ();//Init GPIO
     ___ bis_SR_register (GIE);
     while (1)
     {
        if (FAULT_TYPE == 3){
           printf ("故障类型:%d\r\n"、fault_type);
           FAULT_TYPE = 0;
        }
       if (FAULT_TYPE == 2){
          printf ("故障类型 :%d\r\n"、fault_type);
          FAULT_TYPE = 0;
       }
       if (fault_type =1){
          printf ("故障类型 :%d\r\n"、fault_type);
          FAULT_TYPE = 0;
       }
       if (FAULT_TYPE > 3){
          FAULT_TYPE = 0;
        }
     }
}

//端口1中断服务例程
#if defined (__TI_Compiler_version__)|| defined (__IAR_SYSTEMS_ICC__)
#pragma VECTOR=Port1_VECTOR
_interrupt void Port_1 (void)
#elif defined (_GNUC__)
void __attribute__((INTERRUPT (PORT1_VECT.
或))端口1 (空)
#else
错误编译器不受支持!
#endif
   中频(P1IFG 和 MCU_GPIO_1_PIN)
   {

      P1IFG 且=~MCU_GPIO_1_PIN;
      FAULT_TYPE++;
       printf ("isr %d\r\n"、fault_type);
   }

}

// Timer0_A3中断矢量(TAIV)处理程序
#if defined (__TI_Compiler_version__)|| defined (__IAR_SYSTEMS_ICC__)
#pragma VECTOR=TIMER0_A1_VECTOR
__interrupt void TIMER0_A1_ISR (void)
#elif defined (_GNUC__)
void __attribute__(((interrupt (TIMER0_A1_VECTOR)) TIMER0_A1_ISR (void)
#else
错误编译器不受支持!
#endif
   开关(__EVEN_IN_RANGE (TA0IV、TA0IV_TAIFG))
   {
      案例 TA0IV_TAIFG://溢出
          TIMER_TICK++;
          TA0CCR0 = 32;//表示毫秒
          休息;
      案例 TA0IV_NONE://无中断
          休息;
      案例 TA0IV_TACCR1://未使用 CCR1
          休息;
      案例 TA0IV_TACCR2://未使用 CCR2
          休息;
      默认值:
          休息;
    }
}
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    持续端口 ISR 执行的最可能原因是无法复位 P1IFG 寄存器中的位。 从代码中、我可以看到正在使用哪个位的混淆。 所以我想知道为什么你没有通过读取 P1IV 寄存器来查找源。 执行读操作将复位最高挂起标志。

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

    抱歉、我没能更改 ISR 中的 GPIO 引脚。 下面是定义的 GPIO、

    #define MCU_GPIO_1_OUT P1OUT     
    #define MCU_GPIO_1_DIR     P1DIR
    #define MCU_GPIO_1_IN       P1IN
    #define MCU_GPIO_1_REN P1REN     
    #define MCU_GPIO_1_PIN      位2

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

    读取 P1IV 寄存器在调试输出中提供0值

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

    1) 1)您如何判断 GPIO ISR 是否连续运行?

    2) 2)我看不出您在何处输入看门狗。 我想这看起来像是循环中对 start_watchdog 的另一调用。

    3) 3)如何/何时读取 P1IV? 我建议使用"Registers"视图、而不是"Expressions"或"Memory"视图。

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

    在闭合 while 环路的大括号之前、我将对看门狗进行馈送。 由于一些限制、我未在该论坛中提供完整的代码。  

    其他活动(如温度读取等)也在 while 循环内部进行、但我在查询中未提及。 循环停止执行时内部的调试日志和 GPIO ISR 内部的日志继续执行、这表明 ISR 继续执行、而循环停止工作。  

    下面的显示了 while 循环支架结束前的看门狗重新加载。

    下面的显示了使用 P1IV 寄存器的 GPIO ISR 例程。

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

    重新启动问题已解决。 我从导致问题的 ISR 中删除了调试日志

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

    我很高兴您启动了该工具。  

    在读取相关 P1IFG 位之前已清零、因此 P1IV = 0。