请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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()函 数。我的代码中是否有任何错误,如果有,请纠正我的错误并为我提供解决方案。