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.

[参考译文] TM4C123GH6PM:GPIO 引脚中断例程问题

Guru**** 2473270 points
Other Parts Discussed in Thread: EK-TM4C123GXL, TM4C123GH6PM

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/683607/tm4c123gh6pm-gpio-pin-interrupt-routine-issue

器件型号:TM4C123GH6PM
Thread 中讨论的其他器件:EK-TM4C123GXL

我正在编写一个简单的代码、其工作方式如下:

按 SW1

当 SW1被释放时、一个下降沿被检测到并且与引脚 PF4相对应的 ISR 被执行并且一个 LED 被打开。

类似地、它在按下 SW2时发生。

我无法正确配置中断。

在用户指南中、有针对外设特定中断和 NVIC 中断的 API、如何知道要使用哪一个?

请就这一问题向我提供指导。

我正在发布我的代码以供参考。

#include
#include
#include
#include
#include
#include


#define GPIOCR (*(unsigned long *) 0x40025524)
#define GPIOLOCK (*(unsigned long *) 0x40025520)


void GPIO_Interrupt_Init (void);
void SW1isr (void);
void SW2isr (void);

int main (空)

   GPIO_Interrupt_Init();

   返回0;

void GPIO_Interrupt_Init()

   void (* SW1_int)(void);
   void (* SW2_int)(void);

   SW1_int =&SW1isr;
   SW2_int =&SW2isr;


   SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);


    GPIOLOCK      = 0x4C4F434B;
    GPIOCR        =0xFF;

    GPIOIntRegisterPin (GPIO_PORTF_BASE、GPIO_PIN_4、SW1_INT);
      GPIOIntRegisterPin (GPIO_PORTF_BASE、GPIO_PIN_0、SW2_INT);


   GPIOPinTypeGPIOInput (GPIO_PORTF_BASE、(GPIO_PIN_0 | GPIO_PIN_4));
   GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、(GPIO_PIN_2 | GPIO_PIN_3));
  GPIOIntTypeSet (GPIO_PORTF_BASE、(GPIO_PIN_0 | GPIO_PIN_4)、GPIO_FALLING_EDGE);

  GPIOIntEnable (GPIO_PORTF_BASE、GPIO_PIN_0|GPIO_PIN_4);
  

void SW1isr()


   GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_2、~(uint8_t) GPIOPinRead (GPIO_PORTF_BASE、GPIO_PIN_2));
   GPIOIntClear (GPIO_PORTF_BASE、GPIO_INT_PIN_4);

void SW2isr()

   GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_3、~(uint8_t) GPIOPinRead (GPIO_PORTF_BASE、GPIO_PIN_3));
   GPIOIntClear (GPIO_PORTF_BASE、GPIO_INT_PIN_0);

 

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

    我想你已经接近了。 每个 GPIO 端口只有一个中断向量。 在中断例程中、您需要确定哪个引脚导致了中断。 此外,您需要调用 IntMasterEnable()。 下面是 EK-TM4C123GXL Launchpad 的工作示例。

    #include 
    #include 
    #include "inc/hw_types.h"
    #include "include/hw_ints.h"
    #include "inc/hw_memmap.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/gpio.h"
    #include "driverlib/interrupt.h"
    
    //*********
    //
    //定义引脚到 LED 颜色映射。
    ////
    *****************
    #define RED_LED GPIO_PIN_1
    #define blue_LED GPIO_PIN_2
    #define GREEN_LED GPIO_PIN_3
    
    void GPIOFisr (void);
    
    uint32_t ledColor;
    
    //*********
    //
    ////主"C"语言入口点。 使用 TivaWare 切换 LED。
    ////
    *****************
    int
    main (void)
    {
    //
    //将系统时钟设置为以晶体基准从 PLL 以50MHz 运行
    //
    SysCtlClockSet (SYSCTL_SYSDIV_4|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHz|
    SYSCTL_OSC_MAIN);
    
    //
    //启用并等待端口准备好访问
    //
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
    while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOF))
    {
    }
    
    //
    //为 LED 操作配置 GPIO 端口。
    //
    GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、RED_LED|blue_LED|GREEN_LED);
    
    //注册交换机的中断服务例程
    GPIOIntRegister (GPIO_PORTF_BASE、GPIOFisr);
    
    //将 GIOF 引脚0和4 (开关输入)配置为中断
    //必须先解锁 GIOF 引脚0
    HWREG (GPIO_PORTF_BASE + 0x520u)= 0x4C4F434BU;
    HWREG (GPIO_PORTF_BASE + 0x524u)= 0xFFu;
    GPIOPinTypeGPIOInput (GPIO_PORTF_BASE、(GPIO_PIN_0 | GPIO_PIN_4));
    GPIOPadConfigSet (GPIO_PORTF_BASE、(GPIO_PIN_0 | GPIO_PIN_4)、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD_WPU);
    GPIOIntTypeSet (GPIO_PORTF_BASE、(GPIO_PIN_0 | GPIO_PIN_4)、GPIO_FALLING_EDGE);
    IntEnable (INT_GPIOF);
    GPIOIntEnable (GPIO_PORTF_BASE、GPIO_PIN_0|GPIO_PIN_4);
    
    IntMasterEnable();
    
    ledColor = red_LED;
    
    //
    //永久循环
    //
    while (1)
    {
    //
    //打开 LED
    //
    GPIOPinWrite (GPIO_PORTF_BASE、RED_LED|blue_LED|GREEN_LED、ledColor);
    
    //
    //延迟一位
    //
    SysCtlDelay (2000000);
    
    //
    //关闭 LED
    //
    GPIOPinWrite (GPIO_PORTF_BASE、RED_LED|BLUE_LED|GREEN _LED、0U);
    
    //
    //延迟一位
    //
    SysCtlDelay (2000000);
    }
    }
    
    void GPIOFisr()
    {
    uint32_t intStatus;
    
    intStatus = GPIOIntStatus (GPIO_PORTF_BASE、1U);
    
    if (intStatus = GPIO_PIN_0)
    {
    ledColor = blue_LED;
    }
    否则、如果(intStatus = GPIO_PIN_4)
    {
    ledColor = green_LED;
    }
    GPIOIntClear (GPIO_PORTF_BASE、intStatus);
    }
    
    

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

    e2e.ti.com/.../launchpad.pdfYes、我的代码在我使用 API GPIOIntRegister 后工作。

    我不明白、它应该也可以与特定于引脚的 ISR 的 API 一起使用、即 GPIOIntRegisterPin。

    与同一代码相关的另一件事是:

    文件,即用户指南, 上载的第20页上提供了 sw1和 sw2的图,该图是否表明我只需要连接 SW1的上拉寄存器而不是 SW2的上拉寄存器,因为这两个开关的功能相同?

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

    TM4C123GH6PM 不会为每个 GPIO 引脚提供单独的中断。 可用中断向量列表请见数据表第104页的表2-9。

    是的、与 EK-TM4C123GXL launchpad 上一样、在 PF0上启用内部上拉电阻器并非绝对必要、该信号通过连接到 WAKE 信号连接到1M 欧姆的上拉电阻器。 但1M 欧姆电阻器非常弱。