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.

[参考译文] TMS320F28379D:启用中断后立即触发、而不设置任何标志

Guru**** 2524550 points
Other Parts Discussed in Thread: TMS320F28377D

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/800531/tms320f28379d-interrupt-fires-as-soon-as-it-is-enabled-without-any-flags-being-set

器件型号:TMS320F28379D
主题中讨论的其他器件:TMS320F28377D

我的客户遇到计时器2中断问题、在该中断启用后、即使没有设置 TIF 标志或计时器已达到零(倒计时模式)、也会立即调用服务例程。

您对防止此问题的建议是什么?  

谢谢!

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

    如您所知、TIMER2直接连接到内核中断线路 INT14上的 CPU、而不会通过 PIE。 通常、该计时器供 TI/RTOS 使用。 您的客户是否使用了 TI/RTOS? 或者、您的客户是否将定时器2用于其他用途、例如内部频率测量? 请注意、IFR 和 IER 是内核寄存器、而不是存储器映射。 它们通过掩码操作("|="和"&=")进行配置-有关详细信息、请参阅 F28379D 技术讲座中的模块4:

    processors.wiki.ti.com/.../C2000_Multi-Day_Workshop

    检查以确保您的客户没有意外设置 IFR 而不是 IER。 您也可以尝试使用 CCS 来观察 IFR 是否被设置。

    但愿这对您有所帮助。 如果您的问题得到了解答、请单击绿色的"验证答案"按钮。 谢谢。

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

    你好、Ken -

    我将 TIMER2用于 FreeRTOS 节拍。

    我使用以下命令来设置 IER 位:

    IER |= M_INT14;

    之后、我将计时器配置为1ms 中断、如下所示:

    ConfigCpuTimer (&CpuTimer2、SYSCLK_MHz、1000000 / configTICK 比率_Hz);

    CpuTimer2Regs.TCR.ALL = 0x4000;

    几条指令之后、我全局启用具有以下行的中断、并立即从 TIMER2获取中断:

    _asm (" CLRC INTM");

    TIM 寄存器仅对~3000进行倒计数、TIF 位不置位。

    这似乎在我对 DSP 进行下电上电后100%的时间内发生、但如果我使用 CCS 进行"软"复位、则不一致。

    感谢您的帮助!

    ——Chris

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

    当 TIMER2寄存器的读数为3000时、您能转储所有内容吗? 这将很有帮助。

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

    肯-

    以下是触发中断时的 Timer2寄存器值。  看起来我最初是不正确的... TIM 仅减少了~300个计数、而不是~3000。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    为了清楚起见、我还应该添加一个包含 TMS320F28377D 的 F2837x controlCARD R1.1
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为最好尝试并确认中断确实被执行了-也就是说、如果 CPU 进入到工作状态、它可能会在偶然的情况下结束。 如果您单步执行 CPU 定时器 ISR、PC 是否会返回到代码中的合理位置?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Lori -

    是的、它返回到紧随"CLRC INTM"之后的指令
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Chris:

    SYSCLK 的频率是多少? 您是否将 PLL 配置为200MHz 并将其用作 SYSCLK? 此外、TMR2CLKCTL 寄存器的配置是什么、您能否提供该配置的快照?

    谢谢、

    Nirav

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

    你好 Nirav-

    我认为 SYSCLK 应该为200MHz 并使用 PLL。  我认为这是通过调用 main()中前面的 InitSysCtrl()来完成的。  抱歉...我不太熟悉时钟配置代码。  TMR2CLKCTRL 看起来是0:

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

    所有配置看起来都很好。 根据读取的值、似乎不应该发生中断、因为 Timer2仍在递减计数。

    您能否在代码中添加以下3行、在启用中断之前全局禁用中断? 如下所示:

    _asm (" SETC INTM");//禁用全局中断

    //禁用 CPU 中断并清除所有 CPU 中断标志:
    IER = 0x0000;
    IFR = 0x0000;

    IER |= M_INT14;

    之后、我将计时器配置为1ms 中断、如下所示:

    ConfigCpuTimer (&CpuTimer2、SYSCLK_MHz、1000000 / configTICK 比率_Hz);

    CpuTimer2Regs.TCR.ALL = 0x4000;

    几条指令之后、我全局启用具有以下行的中断、并立即从 TIMER2获取中断:

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

    这很有效! 进一步挖掘后、我需要添加的唯一行是:

    IFR &=~M_INT14;

    不确定该位是如何设置的、也不知道为什么设置的、但无论如何、现在应该介绍一下。

    感谢大家在这个问题上的帮助!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Chris Graunke"]这似乎是在我对 DSP 进行下电上电后100%的时间发生的,但如果我使用 CCS 进行"软"复位,则会出现不一致的情况。

    Chris、

    我将更详细地介绍这一点。  CPU 定时器是一个自由运行的计数器、它将在器件复位时运行。  在使用 ConfigCpuTimer 配置它之前、首先停止计时器并重新加载周期、以便所有处于已知状态的内容。  在 CpuTimers 示例- InitCpuTimer()中有这样的示例代码。   

    //
    // InitCpuTimers -此函数将所有三个 CPU 计时器初始化为已知
    // 状态。
    //
    空 InitCpuTimers (空) 

    此致、

    Lori  

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

    如有任何疑问、请告知我们。 此外、如果您对所提供的支持满意、请单击绿色的"验证答案"按钮。 这也会关闭线程。 再次感谢你。

    - Ken