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.

[参考译文] EK-TM4C123GXL:如何在 C 系列 Launchpad (TM4C123G)上使用 SW1 (GPIO 引脚 PF4)的中断。

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/730705/ek-tm4c123gxl-how-to-use-the-interrupt-for-sw1-gpio-pin-pf4-on-the-tive-c-series-launchpad-tm4c123g

器件型号:EK-TM4C123GXL

我正在尝试编写一个程序、在 SW1被按下时、该程序将使电路板上的蓝色 LED 闪烁。 我尝试使用中断来处理状态变化、并遵循 了这里发布的示例代码。

以下是我的代码:

#include 
#include 
#include 
#include "inc/hw_memmap.h"
#include "driverlib/interrupt.h"
#include "driverlib/gpio.h"
#include "driverlib/sysctl.h"


void onButtonDown (void);
void onButtonUp (void);

/**
*在按下 SW1时调用
*/ButtonDown
(void)
if (GPIOIntStatus (GPIO_PORTF_BASE、false)& GPIO_PIN_4){
// PF4是中断原因
GPIOIntRegister (GPIO_PORTF_BASE、onButtonUp);//为端口 F 注册处理程序函数
GPIOIntTypeSet (GPIO_PORTF_BASE、GPIO_PIN_4、GPIO_RISE_EDGE); //为上升沿触发配置 PF4
GPIOIntClear (GPIO_PORTF_BASE、GPIO_PIN_4);//清除中断标志

while (1){
GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_2、GPIO_PIN_2);
SysCtlDelay (20000000);
GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_2、0);
}
}
}/**


*在 SW1释放时调用
*/
void onButtonUp (void){
if (GPIOIntStatus (GPIO_PORTF_BASE、false)& GPIO_PIN_4){
// PF4是中断原因
GPIOIntRegister (GPIO_PORTF_BASE、onButtonDown);//为端口 F 注册处理程序函数
GPIOIntTypeSet (GPIO_PORTF_BASE、GPIO_PIN_4、GPIO_FALLING_EDGE); //为下降沿触发配置 PF4
GPIOIntClear (GPIO_PORTF_BASE、GPIO_PIN_4);//清除中断标志

GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_2、0);
}
}


/**
* main.c
*/
int main (void)
{
SysCtlClockSet (SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_OSC_INT | SYSCTL_XTAL_16MHz);

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOF))
{
}


//输出引脚 F2设置(LED)
GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_2);


//输入引脚 F4设置(SW1)
GPIOPinTypeGPIOInput (GPIO_PORTF_BASE、GPIO_PIN_4);
GPIOPadConfigSet (GPIO_PORTF_BASE、GPIO_PIN_4、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD_WPU);

GPIOIntDisable (GPIO_PORTF_BASE、GPIO_PIN_4);
GPIOIntClear (GPIO_PORTF_BASE、GPIO_PIN_4);

GPIOIntRegister (GPIO_PORTF_BASE、onButtonDown);
GPIOIntTypeSet (GPIO_PORTF_BASE、GPIO_PIN_4、GPIO_FALLING_EDGE);//为下降沿触发配置 PF4
GPIOIntEnable (GPIO_PORTF_BASE、GPIO_PIN_4);

while (1);
}

我有两个问题。

第一个是当 SW1被保持在低电平时、蓝色 LED 应该闪烁和熄灭、但 LED 只保持亮起。

第二个问题是,在 SW1被释放后永远不会触发中断 onButtonUp(),并且程序一直停留在 onButtonDown()中的 while 循环中。

如果有任何关于我所做的错误的帮助或提示、我们将不胜感激。

详细信息:

Code Composer 版本:8.1.0.00011

TivaWare 版本2.1.4.178

编译器:TI v18.1.3


对该帖子中出现的任何错误表示歉意。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    出现第一个问题的原因是、在 onButtonDown 例程的 while 循环中、您打开 LED、延迟、关闭 LED、然后立即再次打开 LED。 它确实是"闪烁"、但它在太短的时间内关闭、您的眼睛看不到它。 关闭 LED 后、尝试向 SysCtlDelay 添加另一个调用。

    第二个问题更为根本。 默认情况下、当您处于中断例程中时、其他中断将被禁用。 (此器件确实支持嵌套中断、但这是一个更高级的主题。) 在这种情况下,您永远不会将中断例程留在 ButtonDown ()中,因此无法为更多的中断提供服务。 通常、您的中断例程应该非常短。 在这种情况下,我建议您定义一个静态易失性 bool 变量,该变量在函数 onButtonDown ()中设置为"true",在函数 onButtonUp()中设置为"false"。 此外,在 onButtonUp()中,关闭 LED。 然后、在主例程中(当前为空 while 循环)、如果变量为"true"、则切换 LED。

    要使操作完全由中断驱动、请使用计时器中断来切换 LED。 在函数 onButtonDown ()中启用计时器中断。 在函数 onButtonUp()中,关闭 LED 并禁用计时器中断。