UART0中断接收无响应问题求助(附初始化及中断处理代码)
UART0输入字符无法触发中断的排查与修复
问题现象
配置UART0中断功能后,在UART窗口输入任意字符,程序无法进入中断处理函数,已确认初始化代码中寄存器写入正确。
初始化代码问题及修复
- GPIO配置顺序错误
当前代码先启用UART0,再配置GPIO复用功能,会导致UART无法正确关联到PA0/PA1引脚。正确流程应先完成GPIO配置,再启用UART0。修改后代码:
void UART_Init(void){ uint8_t ss; // 使能UART0和GPIOA时钟 SET_BIT_PERIPH_BAND(SYSCTRL->RCGCUART,SYSCTL_RCGC1_UART0); SET_BIT_PERIPH_BAND(SYSCTRL->RCGCGPIO,SYSCTL_RCGC2_GPIOA); ss =0; // 延时等待时钟稳定 ss =0; // 先配置GPIO GPIOA->GPIOAFSEL |= 0x03; // 启用PA0/PA1复用功能 GPIOA->GPIODEN |= 0x03; // 启用PA0/PA1数字IO GPIOA->GPIOPCTL= (GPIOA->GPIOPCTL&0xFFFFFF00)+0x00000011; // 配置为UART0引脚 GPIOA->GPIOAMSEL &= ~0x03; // 禁用PA0/PA1模拟功能 // 配置UART0 CLEAR_BIT_PERIPH_BAND(UART0->CTL,UART_CTL_UARTEN); // 禁用UART CLEAR_BIT_PERIPH_BAND(UART0->ICR,UART_ICR_RXIC); // 清除RX中断标志 UART0->IBRD = 43; UART0->FBRD = 26; UART0->LCRH = (UART_LCRH_WLEN_8|UART_LCRH_FEN); SET_BIT_PERIPH_BAND(UART0->CTL ,UART_CTL_RXE); SET_BIT_PERIPH_BAND(UART0->CTL ,UART_CTL_TXE); SET_BIT_PERIPH_BAND(UART0->CTL ,UART_CTL_UARTEN); // 最后启用UART // 配置中断 SET_BIT_PERIPH_BAND(UART0->IM,UART_IM_RXIM); SET_BIT_PERIPH_BAND(UART0->IM,UART_IM_TXIM); IntCtrl_EnableIRQ(UART0_IRQn); IntMasterEnable(); // 开启全局中断,必须添加! }
- 缺少全局中断使能
仅启用UART0外设中断不够,必须调用IntMasterEnable()开启全局中断控制器总开关,否则所有中断都无法响应。
中断处理函数问题及修复
- 中断服务函数名称错误
对于TI TM4C系列单片机,UART0的中断服务函数名称应为UART0_IRQHandler,而非UART0_Handler。名称不匹配会导致中断向量表无法正确映射,无法进入中断。修正后代码:
void UART0_IRQHandler(void) { if (UART0->MIS & UART_MIS_RXMIS) { receivedChar = (uint8_t)UART0->DR; // 先读取数据寄存器 switch(receivedChar) { case 'a': moveLeft_Flag = TRUE; // 修正拼写错误:TRUUE → TRUE break; case 'd': moveRight_Flag = TRUE; break; case ' ': fireBullet_Flag = TRUE; break; // 补充遗漏的break default: break; } SET_BIT_PERIPH_BAND(UART0->ICR,UART_ICR_RXIC); // 清除RX中断标志 } if (UART0->MIS & UART_MIS_TXMIS) { UART0->DR = receivedChar; SET_BIT_PERIPH_BAND(UART0->ICR,UART_ICR_TXIC); // 清除TX中断标志,避免持续触发 } }
- 冗余操作与逻辑错误
- 删除RX中断处理开头错误的TX中断标志清除操作;
- 修正
TRUUE拼写错误为TRUE; - 补充空格字符case分支的
break,避免执行default分支; - TX中断处理中添加中断标志清除操作,防止中断持续触发。
额外排查点
- 确认启动文件中UART0的中断向量已正确指向
UART0_IRQHandler; - 检查串口工具波特率、数据位等参数与UART0配置一致(当前为115200、8N1);
- 若使用FIFO模式,确认
UART_LCRH中FIFO触发阈值符合预期(默认1个字符触发中断)。
内容的提问来源于stack exchange,提问作者Ibrahim Yasser
相关产品推荐
相关产品推荐

