You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UART0中断接收无响应问题求助(附初始化及中断处理代码)

UART0输入字符无法触发中断的排查与修复

问题现象

配置UART0中断功能后,在UART窗口输入任意字符,程序无法进入中断处理函数,已确认初始化代码中寄存器写入正确。

初始化代码问题及修复

  1. 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(); // 开启全局中断,必须添加!
}
  1. 缺少全局中断使能
    仅启用UART0外设中断不够,必须调用IntMasterEnable()开启全局中断控制器总开关,否则所有中断都无法响应。

中断处理函数问题及修复

  1. 中断服务函数名称错误
    对于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中断标志,避免持续触发
    }
}
  1. 冗余操作与逻辑错误
  • 删除RX中断处理开头错误的TX中断标志清除操作;
  • 修正TRUUE拼写错误为TRUE;
  • 补充空格字符case分支的break,避免执行default分支;
  • TX中断处理中添加中断标志清除操作,防止中断持续触发。

额外排查点

  • 确认启动文件中UART0的中断向量已正确指向UART0_IRQHandler;
  • 检查串口工具波特率、数据位等参数与UART0配置一致(当前为115200、8N1);
  • 若使用FIFO模式,确认UART_LCRH中FIFO触发阈值符合预期(默认1个字符触发中断)。

内容的提问来源于stack exchange,提问作者Ibrahim Yasser

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 03:47:11