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
相关产品推荐
相关产品推荐

