LPC1225 UART发送正常但接收异常(帧错误/数据错误)问题咨询
LPC1225 UART接收异常排查方案
已知配置与理论时钟计算
- 主控:LPC1225FBD48/321
- 外部晶振:16MHz
- PLL配置:
MSEL=6,PSEL=2 - UART0配置:
CLKDIV=250,DL=1,DIVADDVAL=1,MULVAL=4
理论时钟推导:PLL输出主时钟mainclk=96MHz;UART外设时钟PCLK=96MHz/250=384kHz;目标波特率=384kHz/(1611.25)=19200
故障表现汇总
- LPC侧UART发送功能正常
- 19200波特率下接收单字符会触发2字节接收中断,偶发帧错误
- 切换其他波特率问题复现;2400等低波特率下接收字节数正常,但接收数据和发送值不匹配,仍偶发帧错误
- 芯片进入片上ROM bootloader、通过Flash Magic烧录时UART收发完全正常
排查优先级与对应解决方法
这个问题在LPC12系列开发中非常常见,核心原因都是用户代码的时钟配置逻辑和ROM bootloader的配置逻辑有差异,导致UART接收侧实际工作时钟和理论计算值偏差过大,按以下优先级排查即可:
- 检查UART相关寄存器的配置顺序
LPC12xx的UART外设时钟和分频寄存器有配置锁存逻辑,必须严格按顺序操作:先配置PLL等待锁定→配置核心时钟分频→打开UART外设时钟门控→写入UARTCLKDIV分频值→等待至少3个外设时钟周期→置位UART的DLAB位→写入DLL/DLM整数分频值→写入FDR寄存器的DIVADDVAL和MULVAL值→清零DLAB位。
绝大多数人踩的坑是先配置UART的波特率相关寄存器,再开UART外设时钟/写UARTCLKDIV值,这时候之前写入的波特率寄存器值不会被硬件正确加载,实际波特率和计算值偏差可达20%以上。额外说明下为什么发送看起来正常:UART发送逻辑完全按本地时钟输出时序,只要时钟偏差没到完全离谱的程度,对端设备靠采样容错一般能正确接收;但接收逻辑是靠本地时钟采样外部输入电平,只要时钟偏差超过2%就会出现采样点错位,触发多字节中断、数据错误、帧错误,和描述的现象完全吻合。
排查手段很简单:所有时钟配置完成后,直接回读UARTCLKDIV、DLL、DLM、FDR四个寄存器的实际值,和写入的预期值对比,90%的情况回读值和写入值不一致。 - 检查PLL锁定等待逻辑
写完PLL配置寄存器后,必须轮询等待PLL状态寄存器的LOCK位置1,确认PLL输出稳定后,再把主时钟源切换到PLL输出。如果跳过这个等待步骤,PLL锁定前的几百微秒内时钟频率会持续漂移,直接导致UART分频值计算基准错误。ROM bootloader是严格按这个流程操作的,所以不会出现该问题。 - 检查UART分数分频寄存器的配置要求
NXP官方对LPC12xx的UART分数波特率发生器有强制约束:如果使用分数分频,MULVAL必须大于DIVADDVAL,且两个值都不能为0;如果不使用分数分频,必须把DIVADDVAL设为0、MULVAL设为1。当前19200波特率下的参数是符合要求的,但要注意配置FDR寄存器前必须保证DLAB位为1,否则FDR寄存器的写入操作会被硬件忽略,实际工作在无分数分频模式,波特率会比预期高25%,刚好匹配现有故障特征。 - 低优先级检查项:RX引脚配置
确认UART RX引脚被配置为上拉输入模式,如果配置为浮空输入,可能因为线路干扰导致起始位采样误判触发帧错误,但该问题不会导致bootloader下功能完全正常,放在最后排查即可。
内容的提问来源于stack exchange,提问作者Jerry Xia
相关产品推荐
相关产品推荐

