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

LPC2148开发板UART0中断无法进入处理函数问题求助

LPC2148 UART0 中断未触发排查与修复

核心问题:VIC向量控制寄存器配置错误

你的代码中VICVectCntl0 = 0x00000026;配置存在关键错误。LPC2148的VIC向量控制寄存器(VICVectCntl0~15)第7位必须置1,才能启用该向量通道关联的中断服务程序。UART0的中断源编号为6,因此正确配置应为:

VICVectCntl0 = 0x86;  // 0x80(启用向量通道) | 6(UART0中断源编号)

其他排查与验证步骤

1. 确认波特率匹配性

你的系统时钟配置为CCLK=60MHz、VPBDIV=1,因此PCLK=60MHz。代入波特率公式计算:
波特率 = PCLK / (16 * (DLM*256 + DLL))
当前DLM=1、DLL=0x87(135),计算得波特率≈9590bps,与9600bps接近,需确保串口工具波特率与代码设置完全一致,否则会导致接收失败。

2. 验证中断使能宏定义

确保IER_RBR和IER_THRE的宏定义正确:

#define IER_RBR  0x01  // 接收缓冲区就绪中断使能
#define IER_THRE 0x02  // 发送保持寄存器空中断使能

若宏定义错误,U0IER = IER_RBR | IER_THRE;无法正确开启中断。

3. 快速验证中断触发状态

可在中断服务函数开头添加LED翻转逻辑,快速确认是否进入中断:

void __attribute__ ((interrupt("IRQ"))) RS232_ISR(void) {
    led_toggleState();  // 临时添加,观察LED闪烁频率变化
    // ... 原有代码
}

若LED闪烁频率改变,说明中断已触发,再排查回显逻辑问题。

4. 排查FIFO配置影响

U0FCR = 0x07已启用FIFO并清空收发缓冲区,若问题仍存在,可尝试暂时关闭FIFO(U0FCR=0x00),测试中断是否触发,排除FIFO相关异常。

修复后的关键代码片段

修改rs232_init中的VIC配置部分:

void rs232_init() {
    PINSEL0 = 0x05; // Enable UART0 pins
    U0LCR = 0x83; // 8-bit data, 1 stop bit, no parity
    U0DLL = 0x87; // Set baud rate to 9600 bps
    U0DLM = 0x01;
    U0LCR = 0x03; // Enable UART0
    U0IER = IER_RBR |  IER_THRE; // Enable THRE and RBR interrupt

    U0FCR = 0x07;

    VICVectAddr0 = (unsigned long)RS232_ISR;
    VICVectCntl0 = 0x86;  // 修正:启用向量通道 + UART0中断号6
    VICIntEnable = 0x00000040;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 12:32:09