本文将介绍 LPC804的串口波特率。
相信大家在使用 SDK 例程的时候,都会用到 PRINTF 通过串口打印相关信息,但是在使用 LPC800 系列的时候,都会发现例程使用的波特率都是 9600 ,而不是经常使用的另一个 115200 ,当直接在例程中将波特率改为 115200 时,如下图:
此时编译烧录都不会报错,但是你会发现在复位之后程序并没有像预期一样跑到 while(1),进调试发现会跑到这里:
作如下修改:
编译下载复位后就可以看到串口助手有信息出来了:
这是什么原因呢?首先我们得先了解 波特率是如何计算的。如下图所示:
下面介绍一下公式里的参数:
FCL : 时钟源频率,即配置给 USART 的时钟
OSRVAL : 过采样值,即以下寄存器中配置的值,一般设为 16,
BRGVAL : 波特率生成器,即分频值,在以下寄存器中设置:
以 baud_rate = 115200,FCLK = 15000000 ,OSRVAL = 0XF,来计算,可以得出 BRGVAL = 7
此时以 FCLK = 15000000 ,OSRVAL = 0xF,BRGVAL = 7 算出的实际波特率为 117,187 ,误差 = (117187- 115200 )= 1987
降低 OSRVAL ,为 12 ,此时计算出 BRVAL = 9 ,以这个算出的实际波特率为 115384 ,误差 = (115384 – 115200)= 184
此时的误差已经很小了。
再回到 SDK 例程中,进调试看其计算出来的结果,在 USART_SetBaudRate()函数中,计算 BRGVAL 和 OSRVAL 的值,计算误差,得出最优解
以下部分还具有最小误差检测,如果误差超过了之后就会出现开头那种情况了:
从计算过程中我们可以得知其将最优解存放在变量 best_osrval,best_brgval,与之对应的误差存放在 best_diff,但是检测误差的时候却用了 diff 这个变量,该变量是最后
一次计算的误差值,并不是最小误差值,所以将其改为 best_diff 就可以了。
那么问题又来了,如果有时候最小误差都超过了改怎么办呢?别急, LPC804 计算方式里面还有第一点;
可选择 FRG0 作为 USART 时钟源,该时钟可通过分数来进行分频调整频率,提供了更大的可操作性,而不是固定的时钟源。
参考资料:
- 《LPC80x User Manual》
用户手册包含了外设配置方法,由 NXP 官网提供下载,链接如下:
- LPC804 官方 SDK 包
SDK 包里包含了许多例程,由 NXP 官网提供下载,链接如下:
https://mcuxpresso.nxp.com/en/select
评论