NXP MCU 技术论坛
直播中

高桂清

8年用户 1081经验值
私信 关注
[问答]

使用mpc5675k器件,调试时经常莫名其妙地触发中断,怎么解决?

我正在使用mpc5675k器件、我在调试时经常莫名其妙地触发中断。
我知道,因为我没有配置相应的中断,所以程序经常会遇到 Defaultinterrupt 函数。
让我困惑的是,我知道我没有配置它,但我不知道中断源是什么。这通常会花费我很多时间。有什么方法可以快速知道中断是什么?

/**
* This is the default interrupt service routine for non-implemented
* exceptions and interrupts.
*/
void DefaultInterrupt(void)
{

    while(1)
    {
        /* Freeze, the non-implemented exceptions and interrupts fires?
         * TODO: It is users responsiblity to consider and implement proper actions on what to do
         *       to response which non-implemneted/unexpected interrupts.
         */
         if(STD_ON == RGM_AlternateModeOccured())
         {
             break;
         }
    }
}

回帖(1)

h1654155216.9102

2025-3-31 18:08:43

针对MPC5675K调试时频繁触发未配置中断的问题,以下是分步解决方案:




1. 定位中断源


步骤:




  • 在DefaultInterrupt中设置断点

    使用调试器(如Lauterbach或CodeWarrior)在DefaultInterrupt函数入口处设置断点,触发时暂停执行。




  • 读取中断控制器寄存器

    MPC5675K的INTC(中断控制器)提供以下关键寄存器:



    • IACKR (Interrupt Acknowledge Register):读取此寄存器可获取当前中断的向量号

    • PIRn (Pending Interrupt Registers):记录所有挂起的中断请求。


    示例代码(在DefaultInterrupt中获取中断号):


    void DefaultInterrupt(void) {
      uint32_t vector = INTC.IACKR;  // 读取当前中断向量号
      while(1) {
          // 在此处记录vector值或触发断点
      }
    }



  • 查阅向量号对应外设

    根据参考手册的中断向量表,将向量号转换为具体外设(如eTimer、CAN、ADC等)。






2. 检查外设状态


步骤:




  • 查看外设中断标志寄存器

    确认具体外设的中断标志位是否被置1(如TFLG表示定时器中断标志,ADC_ISR表示ADC中断状态)。




  • 检查中断使能寄存器

    确认外设的中断使能位(如TCR[TCIE]使能定时器中断)是否被意外开启。






3. 初始化时显式禁用中断


步骤:




  • 关闭所有外设中断

    在初始化代码中,显式禁用所有未使用外设的中断使能位,并清除残留标志:


    void DisableAllInterrupts(void) {
      // 示例:关闭eTimer中断
      ETPU.CR[0].TCR.B.TCIE = 0;  // 关闭通道中断
      ETPU.CR[0].TFLG.B.TC = 1;   // 清除标志位

      // 关闭ADC中断
      ADC.CR.B.IEN = 0;
      ADC.ISR.R = 0xFFFFFFFF;     // 清除所有ADC标志

      // 其他外设类似操作...
    }



  • 配置INTC全局屏蔽

    设置INTC的CPR(Current Priority Register)为最低优先级,临时屏蔽所有中断:


    INTC.CPR.B.PRI = 0xFF;  // 屏蔽所有优先级低于0xFF的中断





4. 检查硬件干扰


步骤:




  • 检查GPIO配置

    确认未使用的GPIO引脚配置为输出或关闭输入中断:


    SIU.PCR[pin].B.PA = 0;     // 关闭上拉/下拉
    SIU.PCR[pin].B.IBE = 0;    // 关闭输入缓冲(可选)



  • 检查电源和信号线

    使用示波器监测可能受干扰的引脚(如复位、时钟、中断输入引脚)。






5. 使用调试工具自动化分析


步骤:




  • 启用调试器中断跟踪

    在Lauterbach调试器中,使用命令记录中断事件:


    Break.Set DefaultInterrupt /Program /Action=STOP
    Data.LOG INTERRUPT ON  // 记录中断触发信息



  • 编写调试脚本

    在进入DefaultInterrupt时自动打印关键寄存器值:


    Break.Set DefaultInterrupt /Program /Cmd="Print INTC.IACKR; Print SIU.ISR"





6. 验证中断向量表配置


步骤:



  • 确认向量表正确性

    检查链接脚本(.ld文件)中中断向量表是否对齐,且未配置的中断指向DefaultInterrupt




总结


通过以上步骤,你可以快速定位到未配置中断的来源。关键操作包括:



  1. 使用INTC.IACKR获取中断向量号。

  2. 初始化时关闭所有外设中断。

  3. 结合调试器和硬件检查排除干扰。


若仍无法解决,建议在初始化阶段逐步启用外设,通过二分法隔离问题模块。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分