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.

[参考译文] RTOS/BEAGLEBK:GPIO 中断问题

Guru**** 2595805 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/647982/rtos-beaglebk-gpio-interrupt-issue

器件型号:BEAGLEBK

工具/软件:TI-RTOS

你(们)好  

我正在尝试将 GPIO1[12]引脚用作具有下降沿检测功能的中断引脚

只要产生中断、就必须转到 ISR、LED 引脚23必须闪烁一次。

所有其他时间只需读取 GPIO1[15]引脚并显示该值。

现在问题是我的代码将继续显示 pin15值,当我为 pin12提供高到低的值时,会生成中断,但不会进入 ISR。

只需关闭显示屏、一段时间后电路板就会复位

有人能帮我解决什么问题吗??

我的代码在这里

 

/*标准包括。 */
#include 
#include 

#include "am335.h"
#include "serial.h"
#include "GPIO_v2.h"
#include "SoC_AM335x.h"
#include "interrupt.h"
#include "evmAM335x.h"
/*********
** 内部宏定义
/

#define GPIO_DATA_PORT (SoC_GPIO_1_regs)
#define GPIO_CLK_PIN_NUMBER (12)
#define GPIO_DATA_PIN_NUMBER (15)
#define GPIO_LED_PIN_NUMBER (23)
/*************
** 外部功能声明
/


/*************
** 内部功能定义
//*

**用于生成延迟的函数。
*/
静态空延迟(volatile unsigned int count)
{
while (count--);
}
//每次在 CLK 引脚
静态空 gpio1Isr (void)
{上遇到下降沿时使 LED 闪烁一次的函数
//printf ("Hello1\n");
serial_puts (UART0_BASE、"内部 ISR\n");
/*清除 clk 中断*/
HWREG (SOC_GPIO_1_regs + 0x2C)= 1 << 12;
HWREG (SOC_GPIO_1_regs + 0x30)= 1 << 12;
//printf ("Hello2\n");
/*将 GPIO 引脚上的逻辑高电平驱动。 *
GPIOPinWrite (GPIO_DATA_PORT、
GPIO_LED_PIN_NUMBER、
GPIO_PIN_HIGH);

延迟(0x3FFFF);

/*驱动 GPIO 引脚上的逻辑低电平。 *
GPIOPinWrite (GPIO_DATA_PORT、
GPIO_LED_PIN_NUMBER、
GPIO_PIN_LOW);
延迟(0x3FFFF);
//再次启用下降沿 IRQ
HWREG (GPIO_DATA_PORT + 0x34)= 1 << 12;
HWREG (GPIO_DATA_PORT + 0x38)= 1 << 12;
HWREG (GPIO_DATA_PORT + 0x44)= 1 << 12;

}
静态空 ConfigDataPort (void)
{
serial_puts (UART0_BASE、"内部配置......... \n");
//为 GPIO1实例启用功能时钟。 *
GPIO1ModuleClkConfig();

/*选择要使用的 GPIO1引脚。 *
GPIO1PinMuxSetup (15);
GPIO1PinMuxSetup (23);
GPIO1PinMuxSetup (12);

/*启用 GPIO 模块。 *
GPIOModuleEnable (GPIO_DATA_PORT);
/*复位 GPIO 模块。 *
GPIOModuleReset (GPIO_DATA_PORT);

/*将 GPIO 数据设置为输入引脚。 *
GPIODirModeSet (GPIO_DATA_PORT、
12、
GPIO_DIR_INPUT);
/*将 GPIO 时钟设置为输入引脚。 *
GPIODirModeSet (GPIO_DATA_PORT、
15、
GPIO_DIR_INPUT);
/*将 GPIO LED 设置为输出引脚。 *
GPIODirModeSet (GPIO_DATA_PORT、
GPIO_LED_PIN_NUMBER、
GPIO_DIR_OUTPUT);

//******** 检查 LED 针脚的启用情况*********
/*将 GPIO 引脚上的逻辑高电平驱动。 *
GPIOPinWrite (GPIO_DATA_PORT、
GPIO_LED_PIN_NUMBER、
GPIO_PIN_HIGH);

延迟(0x3FFFF);

/*驱动 GPIO 引脚上的逻辑低电平。 /*
GPIOPinWrite (GPIO_DATA_PORT、
GPIO_LED_PIN_NUMBER、
GPIO_PIN_LOW);
延迟(0x3FFFF);
*/
//******* 现在在 CLK 引脚上启用中断*********************


/*初始化 ARM 中断控制器*/
IntAINTCInit();

IntMasterIRQEnable();

/* GPIO 中断*/
IntSystemEnable (SYS_INT_GPIOINT1A);
IntPrioritySet (SYS_INT_GPIOINT1A、0、AINTC_HOSTINT_route_IRQ);
内部寄存器(SYS_INT_GPIOINT1A、gpio1Isr);
IntSystemEnable (SYS_INT_GPIOINT1B);
IntPrioritySet (SYS_INT_GPIOINT1B、0、AINTC_HOSTINT_route_IRQ);
内部寄存器(SYS_INT_GPIOINT1B、gpio1Isr);

/*设置 GPIO_CLK_PIN_NUMBER 以在输入的下降沿升高 IRQ */
GPIOIntTypeSet (GPIO_DATA_PORT、
12、
GPIO_INT_TYPE_FRAGE_EDGE);

HWREG (GPIO_DATA_PORT + 0x34)= 1 << 12;
HWREG (GPIO_DATA_PORT + 0x38)= 1 << 12;
HWREG (GPIO_DATA_PORT + 0x44)= 1 << 12;

}




//
*启动所有其他任务,然后启动调度程序。
*/
int main( void ){

unsigned int msDelay;
unsigned int read_value=0;

//配置 GPIO0实例的功能时钟。 //

//初始化串行
init_serial (UART0_BASE);
serial_puts (UART0_BASE、"启动 BeagleBone\n");
ConfigDataPort();

while (1)
{
Read_Value=GPIOPinRead (GPIO_DATA_PORT、15);
if (read_value>0) serial_puts (UART0_BASE、"value>0\n");
否则、如果(read_value=0) serial_puts (UART0_BASE、"value=0\n");
否则 serial_puts (UART0_BASE、"value<0\n");
msDelay=0x1FFFFFF;
while (msDelay--){;}


}
返回0;
}

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

    我得到的输出是
    启动 BeagleBone
    内部配置.........
    值>0
    值>0
    值>0
    值>0
    值>0

    一旦我向引脚12提供高电平至低电平信号、显示的值将停止、2到3分钟后电路板将复位
    我不知道为什么它不在 ISR 内部????

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RTOS 团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢您的回复。请尽快回复我,我几乎被震惊了,无法继续。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Vinaya、

    如果您移除 serial_put 并在 CCS 中放置观察表达式以查看值、该操作是否有效?
    如果您在 ISR 内部放置一个断点、那么当您执行高-低引脚12时、它是否会达到该断点?

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

    你(们)好
    我现在不使用 CCS 进行调试。通过查看串行打印、我检查了它是否进入 ISR。当引脚12上出现高电平-低电平时、在串行窗口中看不到 ISR 内的打印。LED 引脚也不会变为高电平和低电平。我是否要做 必须使用 ccs.can 对其进行调试、您可以提供任何链接以 CCS 开头。

    您说的是、由于 ISR 中的 serial_puts 执行停止??

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我得到了解决方案,因为在调用任何函数之前进入 ISR 后,我们需要首先清除中断状态标志。在清除 clk 中断后,我需要调用 serial_puts。 现在工作正常。