器件型号: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;
}