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.

[参考译文] TMS320F28062:退出嵌套中断的奇怪行为

Guru**** 2537600 points
Other Parts Discussed in Thread: TMS320F28062

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/720213/tms320f28062-strange-behaviour-exiting-nested-interrupt

器件型号:TMS320F28062

尊敬的:

我将在我的项目中使用带定时器0 (INT1.7)和定时器1 (INT13)的嵌套中断。

计时器0是一个1ms 计时器、用于处理我的主状态机。 在此中断中、我启用中断、以便能够处理其他通信中断。

中断空 CPU_INT_TIMER_T0 (空)
{
//重新启用此中断以接收更多计时器中断
IER |=PIE_INT1;
//确认中断组以接收该组的更多中断
PieCtrlRegs.PIEACK.All=PI_INT1;
asm (" nop");
//允许重新输入
EINT;
//框架通用计时器中断
State_Machine ();
Dint;
}

定时器1用于在更改 RS485驱动器中的 GPIO 引脚之前增加延迟。 (设置硬件方向引脚)

中断空 CPU_INT_INT13 (空)
{
//根据需要调用应用程序计时器服务例程
RS485_InterruptRoutine();
//清除任何挂起的中断
IFR&=~PI_INT13;
}

我所面临的问题是、在某些情况下(并非总是)、当在定时器1的中断中执行时、GPIO 被正确设置、但当退出定时器0中断时、GPIO 被设置回先前的状态。

1) 1)进入 Timer 0中断

2) 2)开始执行 State_Machine()代码

3) 3)进入定时器1中断

4)执行 RS485_InterruptRoutine ()

5) 5)退出计时器1中断、GPIO 发生变化

6)完成 State_Machine ()代码

7) 7)退出计时器0中断

8)此处、GPIO 会改回先前的状态

有人知道什么原因会导致这种情况? 我想这取决于中断计时 器1何时执行中断0的退出是否出错?

提前感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    通常无需在 ISR 内操作 IER 和 IFR。 在继续之前、请尝试以下操作:

    在 T0 ISR 中、替换此行...
    IER |=PIE_INT1;
    使用...
    CpuTimer0Regs.TCR.bit.TIF = 1;


    在 T1 ISR 中、替换此行...
    IFR&=~PI_INT13;
    使用...
    CpuTimer1Regs.TCR.bit.TIF = 1;

    请告诉我、这是否会产生影响。

    此致、

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

    感谢您的回答。

    我进行了您提议的更改、但这并没有什么不同。

    此致、

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

    BART、

    感谢您做出这一改变。

    代码片段中没有任何内容可以提供有关发生这种情况的线索。  RS485_InterruptRoutine() 改变了哪些 GPIO 引脚,这些引脚是否在代码中的其他位置进行操作?

    退出 T0 ISR 时、如何验证更改?  您是否单步执行代码?  是否启用了实时模式?

    此致、

    Richard

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

    Richard、

    使用的 GPIO 是 GPIO21。 这是 RS485驱动器的方向引脚、仅在驱动器软件中使用宏进行更改。

    #define HAL_RS485A_DIR 0x00200000 // RS485-A 方向控制
    #define HAL_RS485A_TX GpioDataRegs.GPACLEAR.All=HAL_RS485A_DIR // RS485-A 方向控制 TX
    #define HAL_RS485A_RX GpioDataRegs.GPASET.All=HAL_RS485A_DIR // RS485-A 方向控制 RX 

    多年来、我们在其他 TMS320F28xx 器件上一直使用这种嵌套中断概念和 RS485驱动程序软件、没有任何问题。 现在只有 TMS320F28062有这个问题。

    添加了用于跟踪中断序列(在开始和结束时)的代码。 此信息与 GPIO 数据一起存储在数组中。

    一旦 RS485通信发生错误、中断点就会停止处理器。 此时将保存并分析数组的数据。

    从该信息中可以清楚地看出、在 T1内、GPIO 仍然正常、但回到 T1例程后、GPIO 引脚会设置回先前的状态。

    以下是信息示例:

    µs 时间戳(μ s) 上一个 µs 之间的时间(μ s) 说明 GPIO 数据
    3160509413 543. CPU 中断定时器0进入 0xF7D2
    3160509346 67 CPU 中断定时器1进入 0xF7D2
    3160509336 10. 更改 GPIO21 0xF7F2
    3160509334 2. CPU 中断定时器1退出 0xF7F2
    3160509332 2. CPU 中断定时器0退出 0xF7D2

    此外、当使用示波器监控 GPIO 引脚时、2µs μ s 的变化也会出现。

    此致、

    BART

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

    感谢您提供更多信息。 除非代码中有任何操作、否则引脚不应更改。 如果您尚未这样做、则可以通过尽可能多地剥离代码来创建最小项目、从而提供信息。 例如、这可能表明背景循环中的某个东西是否影响结果。

    我想让一些同事为他们提供意见、但在我这样做之前、您能否在您的上一篇帖子中澄清几个问题?

    "...但回到 T1例程后、GPIO 引脚会设置回先前的状态。"
    您最初说在退出 T0时该引脚处于错误状态。 哪一项是正确的?

    "...GPIO 引脚上也有2µs 的变化。"
    2us 意味着什么? 引脚在2us 后是否恢复到正确的状态?

    谢谢。

    此致、

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

    原来是错的,我的借口。 它就像上一个帖子中的示例。 退出定时器1时、GPIO 会改回另一个值。

    μ 2µs 是设置 GPIO 和退出定时器1 ISR 之间的时间。 因此、在2µs μ s 后、GPIO 从所需的值更改为定时器1 ISR 之前的前一个值。

    我将尝试将程序仿真为简化的程序、但由于计时器1的中断是通过 RS485接收数据触发的、因此我不确定是否可以对问题进行仿真。 我会给它一个机会。

    谢谢。

    此致、

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

    您能否向我发送用于设置和清除 I/O 引脚的宏命令?

    此致、

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

    抱歉、您在之前的一篇文章中有这些宏、我错过了它们。 您是否在使用 GDPAT 寄存器操作 State_Machine()中的这些 GPIO 或任何其他 GPIO?

    此致、

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

    您是指 GPADAT 寄存器吗? 否这些仅用于读取信息、不用于设置任何 GPIO。
    对于 GPIO 的置位和清零、始终使用 GPASET 和 GPACLEAR 寄存器。

    此致、

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

    BART、

    好的、谢谢。  我问 GPDAT、因为症状感觉非常像非原子 GPIO 指令被中断、然后在程序返回时完成。

    我认为唯一的方法是尽量减少代码、直到您消除问题、然后查找更改。  必须有其他一些与这些 I/O 接触的东西。  请记住、GPIO 寄存器按组进行组织。  在此器件上、GPIO21位于端口 A 上、除了原子集/清零/切换寄存器外、它还被 GPAMUX2和 GPADAT 触发。

    请告诉我您找到的内容。

    此致、

    Richard  

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

    发现问题。

    问题就像您建议的那样、中断发生在 GPADAT 寄存器的操作过程中。
    在程序中、GPIO19的更改方式为:
    HAL_DO_RESET=HAL.IO.Do.App&0x0001;
    其中 HAL_do_reset 为:
    #define HAL_DO 复位 GpioDataRegs.GPADAT.bit.GPIO19

    当我们分析编译器的汇编代码时、很明显、该寄存器被复制到 ACC 以进行位操作。
    在这些汇编指令期间、当 Timer1的中断出现时、GPIO 在返回中断后会像以前一样被置位。

    感谢您的帮助!

    此致、

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

    BART、

    好消息。  感谢您的介绍。

    此致、

    Richard