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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/604653/ccs-tm4c123gh6pm-problem-in-the-gpio-interrupt

器件型号:TM4C123GH6PM

工具/软件:Code Composer Studio

您好!

再次感谢社区全体人民的支持。 我在 GPIO 中断中遇到问题。 我使用的是陀螺仪传感器、我使用 I2C 进行配置、因为当发生水印中断时、我尝试启用 GPIO 中断以读取原始传感器数据、然后我读取传感器值。 我在这里附加了用于中断的代码

#include 
#include 
#include 
#include 
#include 
#include "inc/hw_i2c.h"
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/gpio.h"
#include "driverlib/utilvert.h"







#include "driverlib_intr.h"








;#driverdive.t_trunt #include "drivert_it_trun.h #include "driverlib_it_trategr.h #include "#def"#drior.tr.tr.tr.tr.tr.trat_ine_state"#include "#include "#def_un.tru.tru.ide"#"#"#def"#def_ine_ine_intru.tr.tr.tru.int_it_tru.int_tr.tru.h;#def"#include "#"#def"#def"#def_tru.int_it_tru.tru.int_it_tr.int_it_tru.int


//gyroscope X、Y、Z
};

static unsigned char fifolevel = 0;

static unsigned char data = 0;

static unsigned int flags = 0;

void
InitConsole (void)
{
//
//启用用于 UART0引脚的 GPIO 端口 A。
// TODO:将其更改为您正在使用的 GPIO 端口。
//
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);

//
//为端口 A0和 A1上的 UART0功能配置引脚复用。
//如果您的器件不支持引脚复用、则无需执行此步骤。
// TODO:更改此选项以选择您正在使用的端口/引脚。
//
GPIOPinConfigure (GPIO_PA0_U0RX);
GPIOPinConfigure (GPIO_PA1_U0TX);

//
//启用 UART0以便我们可以配置时钟。
//
SysCtlPeripheralEnable (SYSCTL_Periph_UART0);

//
//使用内部16MHz 振荡器作为 UART 时钟源。
//
UARTClockSourceSet (UART0_BASE、UART_CLOCK_PIOSC);

//
//为这些引脚选择替代(UART)功能。
// TODO:更改此选项以选择您正在使用的端口/引脚。
//
GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);

//
//初始化控制台 I/O 的 UART
//
UARTStdioConfig (0、115200、16000000);
}


void i2cController2Intialise (void)
{

#if defined (target_is_TM4C129_RA0)|| \
已定义(TARGET_IS_TM4C129_RA1)|| \
已定义(TARGET_IS_TM4C129_RA2)
ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
SYSCTL_OSC_MAIN |
SYSCTL_USE_OSC)、25000000);
#else
SysCtlClockSet (SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | //系统时钟= 50MHz
SYSCTL_XTAL_25MHz);
/*SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
SYSCTL_XTAL_16MHz);*/
#endif

//使用 I2C2外设之前必须启用。

//
SysCtlPeripheralEnable (SYSCTL_Periph_I2C2);

//
//对于此示例,I2C2与 PortB[3:2]一起使用。 实际端口和
//使用的引脚可能与您的器件不同、请参阅的数据表
//更多信息。 GPIO 端口 B 需要启用、因此这些引脚可以
//使用。
// TODO:将其更改为您正在使用的 GPIO 端口。
//
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);

//
//为端口 B2和 B3上的 I2C2功能配置引脚复用。
//如果您的器件不支持引脚复用、则无需执行此步骤。
// TODO:更改此选项以选择您正在使用的端口/引脚。
//
GPIOPinConfigure (GPIO_PE4_I2C2SCL);
GPIOPinConfigure (GPIO_PE5_I2C2SDA);

//
//为这些引脚选择 I2C 功能。 此函数也会
//为 I2C 操作配置 GPIO 引脚,将其设置为
//开漏操作,弱上拉。 请参阅数据表
//查看每个引脚分配了哪些功能。
// TODO:更改此选项以选择您正在使用的端口/引脚。
//
GPIOPinTypeI2CSCL (GPIO_Porte _BASE、GPIO_PIN_4);
GPIOPinTypeI2C (GPIO_Porte _BASE、GPIO_PIN_5);

//
//启用并初始化 I2C2主机模块。 使用的系统时钟
// I2C2模块。 最后一个参数设置 I2C 数据传输速率。
//如果为 false,则数据速率设置为100kbps,如果为 true,则数据速率将设置为
//设置为400kbps。 在本示例中、我们将使用100kbps 的数据速率。
//
#if defined (target_IS_TM4C129_RA0)|| \
已定义(TARGET_IS_TM4C129_RA1)|| \
已定义(TARGET_IS_TM4C129_RA2)
I2CMasterInitExpClk (I2C2_base、ui32SysClock、false);
#else
I2CMasterInitExpClk (I2C2_base、SysCtlClockGet ()、true); //系统时钟- 50MHz,TPR - 0x06
#endif

}

void gyroInterrupt (void)
{
L3G4200D_Register_Write (SLAVE_ADDRESS_L3G4200D、L3G4200D_FIFO_CTRL_REG、0x4A); //FIFO 控制寄存器:流模式和 WTM-10

L3G4200D_Register_Read (SLAVE_ADDRESS_L3G4200D、L3G4200D_FIFO_SRC_REG、FIFO 电平); //FIFO 状态寄存

器 UARTprintf ("中断发生\n");

if (0x80 & FIFO)
{
flags = 1;
}




int main (void)
{
unsigned char DeviceID = 0;

short int i = 0;

ROM_FPULazyStackingEnable();

i2cController2Intialise ();Initrom_PinTypePort_GPIOPort_Output/GPIOPort_Output_GPIOPort_Output_Output_GPIOPort_Output_Output_Output_Output_Output_GPIOPort_



GPIO_PIN_2);

ROM_GPIOIntTypeSet (GPIO_Porte _BASE、GPIO_PIN_2、GPIO_Bot_Edges);

ROM_IntEnable (INT_GPIOE);

ROM_IntMasterEnable();

L3G4200D_Register_read (slave_address_L3G4200D、L3G4200D_Wher_am_i、&DeviceID);

UARTprintf ("DeviceID:0x%x\n"、DeviceID);

L3G4200D_Register_Write (SLAVE_ADDRESS_L3G4200D、L3G4200D_CTRL_REG1、0x3F); //控制寄存器1 100Hz 和正常,所有轴都启用

L3G4200D_Register_Write (SLAVE_ADDRESS_L3G4200D、L3G4200D_CTRL_REG3、0x07); //控制寄存器3:WTM、空、溢出启用

L3G4200D_Register_Write (SLAVE_ADDRESS_L3G4200D、L3G4200D_CTRL_REG4、0x80); //BDU 1和250dps

L3G4200D_Register_Write (SLAVE_ADDRESS_L3G4200D、L3G4200D_CTRL_REG5、0x5F); ///FIFO 被启用且 HPEN-1、INT-11、OUT-11

//L3G4200D_Register_Write (SLAVE_ADDRESS_L3G4200D、L3G4200D_FIFO_CTRL_REG、0x4A); //FIFO 控制寄存器:流模式和 WTM-10

while (1)
{

//UARTprintf ("FIFOlevel:0x%x\n"、FIFO 电平);
#if 1
if (1 = flags)//检查水印中断
{
data = FIFO 电

平& 0x1F;UARTprintf ("FIFOlevel:0x%x\x

= 0);i 数据= FIFO (0);i = FIFO 数据= FIFO;i = FIFO 数据 I = I + 1)
{
READ_L3G4200D_RawData (&Sensor_Value.Gyro_x_raw、&Sensor_Value.Gyro_y_y_raw、&Sensor_value.Gyro_z_raw);

UARTprintf ("%d、%d、%d\n"、Sensor_value.Gyro_y_x_raw、&Sensor_Rent_Rent_Rent_Rent_RAW


)、UARTg_D_R18_R18_R18_R18_D_R18_R18_R18_R18_R18_R18_R18_R18_D L3G4200D_FIFO_CTRL_REG、0x0A);// FIFO 更改为旁路模式

标志= 0;
}
#endif
}



没有发生中断,导致它不运行  gyroInterrupt()函 数。我的代码中是否有任何错误,如果有,请纠正我的错误并为我提供解决方案。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1) 1)请编辑您的消息:删除未格式化的代码、然后使用再次粘贴 按钮! 很难读取这样的宽松代码!
    2) 2)我在任何地方都看不到任何"输入"配置。 当输入引脚改变电平时、会发生 GPIO 中断。
    布鲁诺