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/TM4C123GH6PM:GPIO 中断

Guru**** 2463330 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/655990/ccs-tm4c123gh6pm-gpio-interrupt

器件型号:TM4C123GH6PM

工具/软件:Code Composer Studio

你(们)好
我将使用2个开关(PF0和 PF4)作为 GPIO 中断。 按下 SW1时、打开红色;按下 SW2时、打开蓝色。

以下是我的代码:

#include 
#include 
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "inc/hw_ints.h"
#include "unlock_pf_pf0/unlock_sbsbsb.h"(



sbvoid -/sw2)-/sw2、sbid-/-/uid-/uid-/-/-void_sw2、sbid-/-/-/uid-/-/-void -/-/-id_sw-/-/-/-/uid_sw-/-/uid-/-/-/-/-/-void -/-/-/-/-/-/-/-/-/-/-/-void /-/


void SW1_ISR (void)
{
GPIOIntClear (GPIO_PORTF_BASE、GPIO_INT_PIN_4);//清除 PF4上的标志中断
SW1_Flag=1;//设置标志以指示 SW1已按下
}
void SW2_ISR (void)
{
GPIOIntClear (GPIO_PORTF_BASE、GPIO_INT_PIN_0);//清除 PF0上的标志中断
SW2_Flag=1;//设置标志以指示 SW2已按下
}

//--------------------------------------

int main (void)
{
SysCtlClockSet (SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHz|SYSCTL_OSC_MAIN);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_1_GPIO_PIN_2|GPIO_PIN_3);
GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1| GPIO_PIN_2| GPIO_PIN_3、0);
UnlockPF0 (GPIO_PORTF_BASE、GPIO_PIN_0);
GPIOPinTypeGPIOInput (GPIO_PORTF_BASE、GPIO_PIN_0|GPIO_PIN_4);
GPIOPadConfigSet (GPIO_PORTF_BASE、GPIO_PIN_0|GPIO_PIN_4、GPIO_Strength _8mA、GPIO_PIN_TYPE_STD_WPU);
GPIOIntTypeSet (GPIO_PORTF_BASE、GPIO_PIN_0|GPIO_PIN_4、GPIO_FALLING_EDGE);

GPIOIntRegister (GPIO_PORTF_BASE、&SW2_ISR);//针对 PF0上的中断进行寄存器
GPIOIntEnable (GPIO_PORTF_BASE、GPIO_INT_PIN_0);

GPIOIntRegister (GPIO_PORTF_BASE、SW1_ISR);
GPIOIntEnable (GPIO_PORTF_BASE、GPIO_INT_PIN_4);//针对 PF4的中断寄存器

IntEnable (INT_GPIOF);
IntMasterEnable();
while (1)
{
GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1_GPIO_PIN_2、0);
if (SW1_Flag)//如果按下 SW1、清除 Flag、将 LED 变为红色。
{
SW1_Flag=0;
GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1、0x02);
SysCtlDelay (4000000);
}
if (SW2_Flag)//如果按下 SW2、清除 Flag、打开 LED 蓝色。
{
SW2_Flag=0;
GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_2、0x04);
SysCtlDelay (4000000);
}
}



它不起作用、但当我注释掉 GPIOIntRegister 两行(GPIO_PORTF_BASE、SW1_ISR)中的一行时、它起作用。

请帮帮我。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉、我在您之前的 e2e.ti.com/.../2409391帖子中误导了您
    函数 GPIOIntRegisterPin()只适用于端口 P 和 Q,而这些端口不在该器件上。

    正如 Ralph 建议的那样,您应该只为端口 F 注册一个中断例程,并且在该中断例程中调用 GPIOIntStatus()以查看哪个引脚导致了中断。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉、Bob、在您依赖我之前的帖子之前、我已经发布过此帖子。 我理解您在前面所说的内容。
    谢谢你。