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.

[参考译文] TMS320F28069:PIEACK 在某些情况下似乎被自动清除。

Guru**** 2587345 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/871301/tms320f28069-pieack-seems-cleared-automatically-in-some-cases

器件型号:TMS320F28069

您好、香榭丽舍

根据 TRM、PIEACK MSUT 由 SW 清零。
然而、当0被写入 PIEIERx 寄存器时、PIEACK 似乎被自动清零。
它是 TI 规范中的正确行为。

这是 ADCINt1 ISR 的示例代码、如下所示:

中断空内在函数 Hndr_adcint1 (void)

       易失       性 SDT_UINT16     U16_PIEIER =(SDT_UINT16) PieCtrlRegs.PIEIER1.all;

     IER |= M_INT1;

       IER    &= MINT1;

       PieCtrlRegs.PIEIER1.ALL &=(SDT_UINT16) MG11;   //注:MG11=0x0000。  之后将清除 PIEACK。 *

       SDC_ASM_NOP;

       EINT;

       intrAdc_ConvEnd ();

       PieCtrlRegs.PIEACX.ALL = 0x0001;

       Dint;

       PieCtrlRegs.PIEIER1.ALL = U16_PIEIER;

       

此外、当 PIEIERx 寄存器禁用组中断时、PIEACK 也会被清除。

您能否检查条件是否符合预期。
感谢您的友好支持。
此致、
Hitoshi

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

    Hitoshi、

    当进入 ISR 时、内核 IFR 被自动清零-更多详细信息、请参阅《TMS320C28x CPU 和指令集参考指南》(spru430)第58页的第3.4节。  此外、当进入 ISR 时、INTM 被置位以防止嵌套中断、并且在退出 ISR 时、INTM 被自动清零。

    另一方面、通过 写入 PIEACKx 寄存器、PIEIFR 在软件中被手动清零。  (即、PIEACKx 指令用于清除 ISR 中的 PIEIFR)。  处理中断的典型用户在其代码中执行以下操作(以 ADC 为例):

    1) 1)启用全局中断

       asm (" CLRC INTM");   //启用全局中断-或在 main()函数中使用 EINT 完成

    2) 2)启用外设和内核 中断

       PieCtrlRegs.PIEIER1.bit.INTx1 = 1;   //在 PIE 组1中启用 ADCINT1
       IER |= 0x0001;        //在 IER 中启用 INT1以启用 PIE 组

    3) 3)在 ISR 中确认中断并清除 PIEIFR

       PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;  //必须确认 PIE 组

    如需更多信息、请参阅 F28069技术讲座中的模块4和实验5、网址为:

    https://training.ti.com/c2000-f2806x-microcontroller-workshop?context=1137791-1137782

    请注意、在实验课程中、我们在 ISR 的开头而不是末尾确认中断  这样、我们就可以在运行 ISR 时捕获另一个挂起的中断。

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

    - Ken

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

    您好 Ken、

    感谢您的参与。
    我是否可以澄清我的具体问题、如下所示?

    1) 1)当0写入 PIEIERx 寄存器时、PIEACK 似乎自动清零。
      正确吗?

    2) 2) 当 PIEIERx 寄存器禁用组中断时、PIEACK 也会被清除。   
      这也是正确的吗?

    非常感谢您提供简单的答案。
    此致、
    Hitoshi

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

    Hitoshi、

    在 TRM 中、我们找不到在写入 PIEIERx 寄存器时清除任何对 PIEACKx 的引用。  与 PIEIFR、PIEIER 和 PIEACK 相关的中断过程如下:

    1.不论 PIEIERx 的状态如何,PIEIFRx 都会被置位。 在 CPU 接收中断后、PIEIFRx 被硬件自动清零。 由于 PIEIFRx 的软件清除会导致竞争条件、因此需要进行冻结。

    2. PIEACKx 只能手动清除。  我们 不知道会自动清除的任何实例。 这就是为什么在中断流程中、我们告诉客户不要忘记手动清除 PIEACKx、否则不会为该组执行进一步的中断。

    3.清除 PIEIERx 会禁用该中断线。 这也是手动的、为客户提供启用或禁用该中断线路的选项。

    有关更多详细信息、请参阅 F2806x TRM 第167页的第1.7.1.1节和第168页的图1-94。

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

    - Ken

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

    您好 Ken、

    非常感谢您的友好解释。
    我想在网上分享这些信息。

    请关闭该主题。
    再次感谢你。
    此致、
    Hitoshi

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

    Hitoshi、

    我使用车间代码运行了进一步的测试、 并观察到这些结果。  如果"inside the ISR"、则具有以下内容:

    //PieCtrlRegs.PIEACK.all = PIEACK_Group1;//必须确认 PIE 组< >

    PieCtrlRegs.PIEIER1.bit.INTx1 = 0x0;//这只清除 PIEIER1位而不清除 PIEACK

    PieCtrlRegs.PIEIER1.ALL = 0x0000;//这会清除 PIEACK

    但是、您需要再次设置 PIEIERx 以接收后续中断。  正如我之前的帖子中所述、PIEIER 通常不是在 ISR 中管理的、而是在初始化代码中管理的。

    - Ken

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

    Hitoshi、

    对我之前的帖子进行了微小更新-您可以在 ISR 中修改 PIEIERx、但必须仅针对该组(即组 x 中断中的 PIEIERx)完成、并且必须在 PIEACK 挂起中断时完成。  这就是我们在嵌套中断方案中所做的操作、 该方案看起来像您开始使用的代码 snip。

    - Ken

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

    您好 Ken、

    非常感谢您对 PIEACK 条件进行的良好实验。
    您的测试似乎也重复了症状。
    会将其提交给客户并与他们确认。

    再次感谢您娴熟的调查。
    此致、
    Hitoshi