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/LAUNCHXL-F28379D:外部中断实现(XINT1)

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

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/958403/ccs-launchxl-f28379d-external-interrupt-implementation-xint1

器件型号:LAUNCHXL-F28379D
主题中讨论的其他器件:C2000WARE

工具/软件:Code Composer Studio

您好!

我目前正在进行一个小项目、以获得一些经验:
想法是使用一个按钮、当按下该按钮时、该按钮会将 LED 切换一次。

我将 GPIO7用于按钮(输入、带上拉电阻、按下时被拉至 GND)、将 GPIO1用于 LED (HIGH -> ON)。
我尝试使用 XINT1来检测负边沿、并使用中断例程来切换 GPIO 引脚。

首先、执行标准(InitSysCtrl、InitGpio、DINT、InitPieCtrl、InitPieVectTable、 EnableInterrupts)

我 的 X-Bar/Interrupt-setup 方法是:

void Interrupt_setup (void)
{
EALLOW;
PieCtrlRegs.PIEIER1.bit.INTx14 = 1;//XINT1使能


XintRegs.XINT1CR.bit.ENABLE = 0x1;//启用
XintRegs.XINT1CR.bit.polarity = 0x2;//下降边沿


InputXbarRegs.INPUT4SELECT = 0x7; /GPIO7
EDIS;
} 

在"DefaultISR.c"中、我添加了:

中断空 XINT1_ISR (空)
{

GpioDataRegs.GPATOGGLE.bit.GPIO1=1;

} 

寄存器被置位(Debug->Registers)、但中断似乎没有被执行。
我是否错过了需要配置的寄存器、或者我的方法 是否完全错误?
如果需要更多信息、我很乐意提供!

提前感谢!

戴维·K.

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

    尊敬的 David:

    感谢您的提问! 看起来您已经接近、但您需要在中断结束时清除 ACK 组。

    但是、我想我们实际上有一个完美的软件示例供您试用、它实际上(几乎)正是您尝试的!

    C2000Ware 中的 GPIO_ex3_interrupt.c (在 C2000Ware_version#t\driverlib\f2837xd\examples\cpu1\gpio\gpio_ex3_interrupt.c 下)在一个 GPIO 上设置 XINT、并根据该设置切换另一个 GPIO 的输出。 如果您将第二个 GPIO 连接到 LED (并根据您的应用配置上拉/下拉)、您将获得所需的一切! 如果您想从头开始熟悉位字段、该示例仍提供配置和设置中断和 GPIO 所需的所有步骤。

    请告诉我建议和示例是否有助于解决您看到的问题!

    此致、

    Vince

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

    您好、Vince、

    感谢您的回复!

    我找到了您提到的示例、但在这个阶段我没有使用 driverlib 的项目、所以我对这种代码不是很熟悉。
    但我尝试在中断结束时添加"PieCtrlRegs.PIEACk.bit.ACK1=1;"行。 不幸的是、它没有解决问题。

    也许这是我的问题的根源:我注意到、如果我插入断点并单步执行设置、XINT1CR 的寄存器会被置位(至少在寄存器控制窗口中)。 但是、如果我在没有断点的情况下重新加载程序、它们就不会。 我必须按下"SUSPEND (暂停)"、然后更新它们。
    我注意到 GPADIR-Reg. 如果我按下一个按钮。 它仅在我暂停代码时更改寄存器的值。
    (启用了继续刷新)

    但返回到我的中断:
    也许对我的整个代码进行概述将有助于:

    main.c

    #include "F28x_Project.h"
    #include "F2837xD_DEVICE.h"
    
    //define
    
    
    //functions
    void GPIO_setup (void);
    void Interrupt_setup (void);
    
    //Main
    void main (void)
    {
    //系统
    InitSysCtrl();
    InitGpio();
    Dint;
    InitPieCtrl();
    
    IER = 0x0000;
    IFR = 0x0000;
    
    InitPieVectTable();
    EINT;//启用全局中断 INTM
    ERTM;//启用全局实时中断 DBGM
    
    EnableInterrupts();
    
    //设置
    GPIO_setup();
    interrupt_setup();
    
    //循环
    for (;;)
    {
    
    }
    
    
    } 

    PieCtrl.c

    void EnableInterrupts()
    {
    
    PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
    
    PieCtrlRegs.PIEACX.ALL = 0xFFFF;
    
    EINT;
    } 

    函数.c

    //includes
    #include "F28x_Project.h"
    #include "F2837xD_DEVICE.h"
    
    //define
    
    //函数
    void GPIO_setup (void)
    {
    EALLOW;
    
    //GPIO41 (引脚39) LED2指示灯(如果为1)
    GpioCtrlRegs.GPAPUD.bit.GPIO1=1; //禁用 GPIO1上的上拉
    GpioDataRegs.GPACLEAR.bit.GPIO1=1;//加载输出0
    GpioCtrlRegs.GPAGMUX1.bit.GPIO1 = 0;// GPIO1 = GPIO1
    GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0;// GPIO1 = GPIO1
    GpioCtrlRegs.GPADIR.bit.GPIO1=1; // GPIO1 =输出
    
    
    //GPIO7 (引脚79) BUTTON1 = 0 (如果按下)
    GpioCtrlRegs.GPAPUD.bit.GPIO7=0; //启用 GPIO7上的上拉
    GpioDataRegs.GPACLEAR.bit.GPIO7=1;//加载输出0
    GpioCtrlRegs.GPAGMUX1.bit.GPIO7 = 0;// GPIO7 = GPIO7
    GpioCtrlRegs.GPAMUX1.bit.GPIO7=0;// GPIO7=GPIO7
    GpioCtrlRegs.GPADIR.bit.GPIO7=0; // GPIO7 =输入
    GpioCtrlRegs.GPAQSEL1.bit.GPIO7 = 0b11;//异步
    
    EDIS;
    }
    
    void Interrupt_setup (void)
    {
    EALLOW;
    PieCtrlRegs.PIEIER1.bit.INTx14 = 1;//XINT1使能
    
    
    InputXbarRegs.INPUT4SELECT = 0x7; /GPIO7
    
    XintRegs.XINT1CR.bit.ENABLE = 0x1;//启用
    XintRegs.XINT1CR.bit.polarity = 0b10;//下降边沿
    
    EDIS;
    } 

    DefaultISR.c

    中断空 XINT1_ISR (空)
    {
    EALLOW;
    GpioDataRegs.GPATOGGLE.bit.GPIO1=1;
    PieCtrlRegs.PIEACk.bit.ACK1=1;
    EDIS;
    } 

    我希望这篇文章不会太长。

    感谢你的帮助!

    David

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

    尊敬的 David:

    在 e2e 论坛上、我们不支持直接代码调试、但我可以建议如下:必须将中断函数分配给 PIE vect 表。

    尽管您到目前为止还没有使用 C2000Ware 和 driverlib、但 GPIO_ex3_interrupt.c 在调试中仍然是一个非常有用的工具、因为您可以打开每个高级函数以查看位级别发生的情况 (右键单击一个函数名称、然后单击"Open Declaration"以查看该函数正在执行的操作)。 这有助于确定在初始化阶段到底完成了什么。

    此致、

    Vince