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.

[参考译文] CCS/TMS320F28377S:检测 GPIO 从1到0的转换

Guru**** 2463330 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/622344/ccs-tms320f28377s-detect-the-transition-from-1-to-0-of-a-gpio

器件型号:TMS320F28377S

工具/软件:Code Composer Studio

您好!

您好!

我实现了一个小代码、目的是检测 GPIO 何时从1变为0。
在我的情况下、由于 GPIO 从1转至0以及从0转至1时触发了我的中断例程、因此出现了问题。

我的代码:

void Digital_Input_Config (void)

EALLOW;
PieVectTable.XINT1_INT =&XINT1_ISR;
EDIS;

PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
PieCtrlRegs.PIEIER1.bit.INTx4 = 1;
IER |= M_INT1;//启用 CPU INT1

EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO11=0;
GpioCtrlRegs.GPADIR.bit.GPIO11 = 0;
GpioCtrlRegs.GPAQSEL1.bit.GPIO11=0;
EDIS;

EALLOW;
InputXbarRegs.INPUT4SELECT = 11;
EDIS;

XintRegs.XINT1CR.bit.polarity = 0;
XintRegs.XINT1CR.bit.ENABLE = 1;

中断空 XINT1_ISR (空)

PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;

有人可以帮帮我吗?

您好!
Carlos Martins

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

    尊敬的 Carlos:

    您的代码看起来是以有效的方式设置的。  请注意、可能我也不会看到它。

    两个注释:

    1. 我建议在完全配置 GPIO 和 XINT1后设置和启用 PIE。  这可能不是导致您看到的结果、但是一种好的做法-因此在完全配置之前不会创建无效中断。
    2. 是否确定输入信号没有噪声?  在这种情况下、GPIO 鉴定可能会有所帮助。

    您如何评估每次转换时都会发生中断?


    谢谢、
    Brett

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

    您好!

    我按照您的建议启用和配置中断。 即使如此,问题仍然存在。 为了向您展示发生了什么、我做了一个小实验。 在本实验中、当 GPIO11为1时、串行通信发送值1、当 GPIO11为0时、会触发中断并发送值0。 我将随附本实验的代码、文件"serial_communication.docx"和串行通信、仍然是 GPIO11信号的时间图。
    根据我的结果:
    -当 GPIO11=3.3V 时、发送值1;
    -当 GPIO11进行从3.3V 到0V 的转换时、值0被发送;
    -当 GPIO11=0V 时、值0被发送;
    -当 GPIO11进行从0V 到3.3V 的转换时、值0被发送;

    这不是我打算的。 我打算仅检测从3.3V 到0V (从1到0)的转换时间。

    我的代码:

    中断空 XINT1_ISR (空);

    void main (void)

    InitSysCtrl();
    InitGpio();

    Dint;
    InitPieCtrl();

    IER = 0x0000;
    IFR = 0x0000;

    InitPieVectTable();

    CONFIG_Serial (200000000,115200);

    EINT;//启用全局中断 INTM
    ERTM;//启用全局实时中断 DBGM

    EALLOW;
    GpioCtrlRegs.GPAMUX1.bit.GPIO11 = 0;// GPIO
    GpioCtrlRegs.GPADIR.bit.GPIO11 = 0;//输入
    GpioCtrlRegs.GPAQSEL1.bit.GPIO11 = 0;// XINT1同步到 SYSCLKOUT
    EDIS;

    EALLOW;
    InputXbarRegs.INPUT4SELECT = 11;//将 XINT1源设置为 GPIO 引脚
    EDIS;

    XintRegs.XINT1CR.BIT.POLARITY = 0;// 0 -下降沿中断| 1 -上升沿中断
    XintRegs.XINT1CR.bit.ENABLE = 1;//启用 XINT1

    EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
    PieVectTable.XINT1_INT =&XINT1_ISR;
    EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的

    PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//启用 PIE 块
    PieCtrlRegs.PIEIER1.bit.INTx4 = 1;//启用 PIE 组1 INT4
    IER |= M_INT1;//启用 CPU INT1

    while (1)

    SignalInput1();

    中断空 XINT1_ISR (空)

    SignalInput0();
    PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;

    您好!
    Carlos Martinse2e.ti.com/.../serial_5F00_communication.docx

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

    尊敬的 Carlos:

    您的实验对我来说并不实际-您所显示的代码似乎与您所写出的结果不匹配。  截屏和文档附件也不能帮助我更好地理解内容。  可能是我不理解您最近的帖子的原因。

    例如、我担心您会影响 ISR 和 main while 循环中的 SignalInput。  我认为这可能掩盖了潜在的问题。  同样、与简单 GPIO 相比、使用串行通信会增加复杂性。

    ===

    我建议创建一 个极其简单的调试设置。  找到一个未使用的 GPIO、您可以使用示波器进行探测并将其配置为 GPIO 输出。  同时探测此 GPIO 引脚和 GPIO11。

    然后、我将使用类似 GPxTOGGLE 的内容在 XINT 中断中更改该 GPIO 的状态。  仅在此中断中触碰此 GPIO 输出。

    如果完成、我认为这应该最终告诉您 XINT 中断发生了什么。


    谢谢、
    Brett

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

    您好 Brett、

    遵循您的建议并实施更简单的代码。
    在该代码中、我将 GPIO2作为在10Hz 频率下从1切换到0的数字输出。 我将 GPIO2连接到 GPIO11。 我将 GPIO11配置为数字输入、并启用了在从1转换为0时触发的中断。 每当触发中断时、我都会切换 GPIO78。

    也就是说、无论 GPIO2信号的频率是10Hz、GPIO78信号的频率都必须是5Hz。

    我发现我最初在微控制器上运行的代码中出现错误。 在初始化 EINT 和 ERTM 之前、我在 GPIO11及其中断中进行了配置。

    纠正错误后、我得到了正确的结果。

    附加了我的测试的最终代码和 GPIO2 = GPIO11 ="逻辑0"和 GPIO78 ="逻辑1"信号的时序图。

    谢谢 Brett

    代码:

    中断空 XINT1_ISR (空);

    void main (void)

    InitSysCtrl();
    InitGpio();

    Dint;
    InitPieCtrl();

    IER = 0x0000;
    IFR = 0x0000;

    InitPieVectTable();

    EALLOW;
    GpioCtrlRegs.GPCMUX1.bit.GPIO78 = 0;
    GpioCtrlRegs.GPCDIR.bit.GPIO78 = 1;//输出
    GpioDataRegs.GPCCLEAR.bit.GPIO78 = 1;//

    GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO2 = 1;//输出
    GpioDataRegs.GPASET.bit.GPIO2 = 1;//
    EDIS;

    EINT;//启用全局中断 INTM
    ERTM;//启用全局实时中断 DBGM

    EALLOW;
    GpioCtrlRegs.GPAMUX1.bit.GPIO11 = 0;// GPIO
    GpioCtrlRegs.GPADIR.bit.GPIO11 = 0;//输入
    GpioCtrlRegs.GPAQSEL1.bit.GPIO11 = 0;// XINT1同步到 SYSCLKOUT
    EDIS;

    EALLOW;
    InputXbarRegs.INPUT4SELECT = 11;//将 XINT1源设置为 GPIO 引脚
    EDIS;

    XintRegs.XINT1CR.BIT.POLARITY = 0;// 0 -下降沿中断| 1 -上升沿中断
    XintRegs.XINT1CR.bit.ENABLE = 1;//启用 XINT1

    EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
    PieVectTable.XINT1_INT =&XINT1_ISR;
    EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的

    PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//启用 PIE 块
    PieCtrlRegs.PIEIER1.bit.INTx4 = 1;//启用 PIE 组1 INT4
    IER |= M_INT1;//启用 CPU INT1

    while (1)

    GpioDataRegs.GPACLEAR.bit.GPIO2 = 1;
    DELAY_US (1000*50);//50ms
    GpioDataRegs.GPASET.bit.GPIO2 = 1;
    DELAY_US (1000*50);//50ms

    中断空 XINT1_ISR (空)

    GpioDataRegs.GPCTOGGLE.bit.GPIO78=1;
    PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;


    时间图