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.

[参考译文] TMS570LC4357:两个边沿(上升沿和下降沿)端口中断

Guru**** 2587365 points
Other Parts Discussed in Thread: TMS570LC4357, HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1573238/tms570lc4357-both-edges-rising-and-falling-edge-port-interrupt

器件型号:TMS570LC4357
主题中讨论的其他器件: HALCOGEN

工具/软件:

你(们)好

我希望在端口 B[3]的上升沿和下降沿发生中断。  下面是我的代码。 请帮助我检查是否正确。

gioREG->INTDET =(Uint32)((Uint32) 1U << 0U)/*位 0 */
|(Uint32)((Uint32) 1U << 1U)/*位 1 */
|(Uint32)((Uint32) 1U << 2U)/*位 2 */
|(Uint32)((Uint32) 1U << 3U)/*位 3 */
|(Uint32)((Uint32) 0U << 4U)/*位 4 */
|(Uint32)((Uint32) 0U << 5U)/*位 5 */
|(Uint32)((Uint32) 0U << 6U)/*位 6 */
|(Uint32)((Uint32) 0U << 7U)/*位 7 */
|(Uint32)((Uint32) 1U << 8U)/*位 8 */
|(Uint32)((Uint32) 1U << 9U)/*位 9 */
|(Uint32)((Uint32) 1U << 10U)/*位 10 */
|(Uint32)((Uint32) 1U << 11U)/*位 11 *///端口 B[3]已启用中断
|(Uint32)((Uint32) 0U << 12U)/*位 12 */
|(Uint32)((Uint32) 0U << 13U)/*位 13 */
|(Uint32)((Uint32) 0U << 14U)/*位 14 */
|(Uint32)((Uint32) 0U << 15U);//*位 15 */

/**-中断极性*/
gioREG->POL =(Uint32)((Uint32) 1U << 0U)/*位 0 */
|(Uint32)((Uint32) 1U << 1U)/*位 1 */
|(Uint32)((Uint32) 1U << 2U)/*位 2 */
|(Uint32)((Uint32) 1U << 3U)/*位 3 */
|(Uint32)((Uint32) 0U << 4U)/*位 4 */
|(Uint32)((Uint32) 0U << 5U)/*位 5 */
|(Uint32)((Uint32) 1U << 6U)/*位 6 */
|(Uint32)((Uint32) 0U << 7U)/*位 7 */
|(Uint32)((Uint32) 1U << 8U)/*位 8 */
|(Uint32)((Uint32) 1U << 9U)/*位 9 */
|(Uint32)((Uint32) 1U << 10U)/*位 10 */
|(Uint32)((Uint32) 1U << 11U)/*位 11 */端口 B[3]设置 1 表示双边沿中断
|(Uint32)((Uint32) 0U << 12U)/*位 12 */
|(Uint32)((Uint32) 0U << 13U)/*位 13 */
|(Uint32)((Uint32) 0U << 14U)/*位 14 */
|(Uint32)((Uint32) 1U << 15U);/*位 15 */

/**-中断级别*/
gioREG->LVLSET =(Uint32)((Uint32) 1U << 0U)/*位 0 */
|(Uint32)((Uint32) 1U << 1U)/*位 1 */
|(Uint32)((Uint32) 1U << 2U)/*位 2 */
|(Uint32)((Uint32) 1U << 3U)/*位 3 */
|(Uint32)((Uint32) 0U << 4U)/*位 4 */
|(Uint32)((Uint32) 0U << 5U)/*位 5 */
|(Uint32)((Uint32) 1U << 6U)/*位 6 */
|(Uint32)((Uint32) 0U << 7U)/*位 7 */
|(Uint32)((Uint32) 1U << 8U)/*位 8 */
|(Uint32)((Uint32) 1U << 9U)/*位 9 */
|(Uint32)((Uint32) 1U << 10U)/*位 10 */
|(Uint32)((Uint32) 1U << 11U)/*位 11 *///端口 B[3]
|(Uint32)((Uint32) 0U << 12U)/*位 12 */
|(Uint32)((Uint32) 0U << 13U)/*位 13 */
|(Uint32)((Uint32) 0U << 14U)/*位 14 */
|(Uint32)((Uint32) 1U << 15U);/*位 15 */

/**-启用中断*/
gioREG->ENASET =(UINT32)(UINT32) 1U << 0U)/*位 0 */
|(Uint32)((Uint32) 1U << 1U)/*位 1 */
|(Uint32)((Uint32) 1U << 2U)/*位 2 */
|(Uint32)((Uint32) 1U << 3U)/*位 3 */
|(Uint32)((Uint32) 0U << 4U)/*位 4 */
|(Uint32)((Uint32) 0U << 5U)/*位 5 */
|(Uint32)((Uint32) 0U << 6U)/*位 6 */
|(Uint32)((Uint32) 0U << 7U)/*位 7 */
|(Uint32)((Uint32) 1U << 8U)/*位 8 */
|(Uint32)((Uint32) 1U << 9U)/*位 9 */
|(Uint32)((Uint32) 1U << 10U)/*位 10 */
|(Uint32)((Uint32) 1U << 11U)/*位 11 *///端口 B[3]
|(Uint32)((Uint32) 0U << 12U)/*位 12 */
|(Uint32)((Uint32) 0U << 13U)/*位 13 */
|(Uint32)((Uint32) 0U << 14U)/*位 14 */
|(Uint32)((Uint32) 0U << 15U);//*位 15 */

Ahove in HL_Gio.c

以下是应用代码:

void HWP_vMstOverSpdIntHandle (void)

  uint8_t u8Cnt=0U;
  hwp_bMstOverSpdInt=true;
  IIF ((gioREG->POL & BIT11)!= 0U)//如果上升沿、设置定时器端口 B[3]
  {
    hwp_u32MstOverSpdIntTimer=u32GetSysTimer_ms ();//有效高电平输入
    HWP_u8MstOverSpdIntPol=1U;//上升沿中断
    HWP_u16MstOverSpdState=1U;
  }
  否则 f ((gioREG->POL & BIT11)== 0u)//如果下降沿、则计数脉冲  
  {

    HWP_u8MstOverSpdIntPol=2U;//下降沿中断
    hwp_u32MstOverSpdIntCurrentTime=u32GetSysTimer_ms();
    HWP_u16MstOvrSpdIntCntr++;//有效脉冲
 }
}

void gioNotification(gioPORT_t *端口、Uint32 位)

  if ((gioPORTB == port)&&(位== 3U))//硬件主器件超速端口
  {
    hwp_vMstOverSpdIntHandle();

  }

}

我问的原因是、如果我使用  gioREG->POL 检测下降沿、则不会进入下降沿例程。 因此、我必须使用端口级别读数进行检查。 检测中断引脚的两个边沿的理想方法是什么

请发表评论。 谢谢你

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

    尊敬的 LayEng:

    否、不能为硬件中的同一 G/O 引脚同时直接配置上升沿和下降沿中断。 GIO 模块一次每个引脚仅支持一种边沿类型(上升沿或下降沿)。

    在 TMS570LC4357 技术参考手册 (SPNU563) 的 GIO 模块部分下、每个 GIO 引脚的中断生成由以下寄存器控制:

    GIOPOL(中断极性寄存器)

    • 1 μ s 上升沿→中断

    • 0→下降沿产生中断

    此外、在 HALCoGen 中、您可以看到我们一次只能选择一个边沿:

    这似乎是一种限制。

    我想在这里我们可以做两种替代方法:

    1.将 N2HET 模块引脚用作 GIO:

    我们还可以在 GIO 模式下配置 N2HET 引脚、正如您在此处看到的、它也支持两个边沿上的中断:

    请参阅以下主题、我在这里详细提到了相同的过程:

    (+) RM57L843:N2HET PIN 配置为 GIO PIN 作为输入使能中断 — 基于 Arm 的微控制器论坛 — 基于 Arm 的微控制器 — TI E2E 支持论坛

    2.另一种方法是,在此 GIO 模块中,只能执行以下 软件权变措施 来检测这两个中断

    • 在复位电路板后、在选择极性之前、首先读取相应引脚的 GIO 状态。
    • 如果该引脚的 GIO 状态为低电平、则选择相应引脚的上升沿中断、否则如果引脚为高电平、则选择相应引脚的下降沿中断。
    • 和中断处理程序、您将再次将极性更改为相反的状态。 我的意思是、如果您收到下降沿中断、那么下次您应该选择上升沿的极性、反之亦然。

    --
    此致、
    Jagadish。

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

    您好 Jagadish

    感谢您的答复。 由于这个寄存器、我做了以下操作:

    请发表评论。 同时、我将按照您的指示进行操作。 谢谢你

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

    尊敬的 LayEng:

    您说的是对的、我错过了这个寄存器。

    如果我们将 GIOINTDET 设置为 1、则应在上升沿和下降沿触发中断。 但是、如果我们将该位设置为 0、那么只有 GIOPOL 才会产生影响、并确切决定需要触发哪个边沿中断。

    对于您的应用、请根据您的引脚将该位保持为 1、如果您遇到任何问题、我将为您创建一个应用并与您分享。

    --
    此致、
    Jagadish。

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

    您好 Jagadish

    谢谢你的答复,我忘了如何设置  GIOINTDET 为 0. 您能告诉我如何通过 halcogen 实现、还是我直接在 hl_gio.c 中对其进行编程?  

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

    您好 Jagadish

    我还想演示如何将代码更改为在上升沿具有第一个中断、然后在下降沿发生中断。 请评论我的代码是否正确。

        /** - interrupt detect */
        gioREG->INTDET = (uint32)((uint32)1U << 0U) /* Bit 0 */
        | (uint32)((uint32)1U << 1U) /* Bit 1 */
        | (uint32)((uint32)1U << 2U) /* Bit 2 */
        | (uint32)((uint32)1U << 3U) /* Bit 3 */
        | (uint32)((uint32)0U << 4U) /* Bit 4 */
        | (uint32)((uint32)0U << 5U) /* Bit 5 */
        | (uint32)((uint32)1U << 6U) /* Bit 6 */
        | (uint32)((uint32)0U << 7U) /* Bit 7 */
        | (uint32)((uint32)1U << 8U) /* Bit 8 */
        | (uint32)((uint32)1U << 9U) /* Bit 9 */
        | (uint32)((uint32)1U << 10U) /* Bit 10 */
        | (uint32)((uint32)1U << 11U) /* Bit 11 */ port B[3] setting 0 means only rising OR falling edge interrupt
        | (uint32)((uint32)0U << 12U) /* Bit 12 */
        | (uint32)((uint32)0U << 13U) /* Bit 13 */
        | (uint32)((uint32)0U << 14U) /* Bit 14 */
        | (uint32)((uint32)1U << 15U); /* Bit 15 */
        
    void HWP_vMstOverSpdIntHandle(void)
    {
        uint8_t u8Cnt=0U;
        HWP_bMstOverSpdInt=true;
        if(gioGetBit(gioPORTB,3) == 1U)//if rising edge, set timer port B[3]
        {
            HWP_u32MstOverSpdIntTimer=u32GetSysTimer_ms(); //valid high input
            HWP_u8MstOverSpdIntPol=1U; //rising edge interrupt
           HWP_u16MstOverSpdState=1U;
           gioREG->POL &=~BIT11; //set falling edge
           
       }
       else //if falling edge, count pulse 
       {
    
           HWP_u8MstOverSpdIntPol=2U; //falling edge interrupt
           HWP_u32MstOverSpdIntCurrentTime=u32GetSysTimer_ms();
           HWP_u16MstOvrSpdIntCntr++;//valid pulse
           gioREG->POL |=BIT11; //set rising edge interrupt
     }
    }

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

    关键是设置  gioREG->POL 以使其在上升沿或下降沿中断

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

    尊敬的 LayEng:

    您的代码对我来说似乎没问题、但是我也在这里创建了另一个工程。这里我使用了 B0 和 B1 引脚来触发中断 、这里我不会改变处理程序的极性、它可以直接处理上升沿和下降沿中断。

    e2e.ti.com/.../GIO_5F00_Raising_5F00_And_5F00_Falling_5F00_Edge_5F00_Interrupts_5F00_LC4357.zip

    我测试了两个引脚、工作正常、没有任何问题。

    --
    此致、
    Jagadish。

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

    亲爱的 Jagadish

    我做了类似的事情,我设置 gioREG->INTDET 位=1。 我使用 gioGetBit(也在读取 DIN 寄存器) 来检查电平。 我不知道,所以我问你。 现在、我正在使用代码、其中  gioREG->INTDET 位= 0。 它也会起作用。  

    感谢您的帮助。 将稍后尝试 gioREG->INTDET 位=1。

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

    亲爱的 Jagadish

    我上面的问题之一是 通过 halcogen 将 gioREG->INTDET 设置为 1 或 0。 您能告诉我如何操作吗? 谢谢。

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

    尊敬的 LayEng:

    我上面的问题之一是 通过 halcogen 将 gioREG->INTDET 设置为 1 或 0。 您能告诉我如何操作吗? 谢谢。

    无法从 HALCoGen 控制 INTDET 标志。

     gioInit 中存在的寄存器只能从 HALCoGen 中进行配置。

    这意味着在中断点、我们只能从 HALCoGen 控制极性、电平和启用。

    因此、INTDET 控制应该像我共享的示例代码那样手动添加我们的代码。

    --
    此致、
    Jagadish。