【LPC800 系列】 串口波特率配置

本文将介绍 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 时钟源,该时钟可通过分数来进行分频调整频率,提供了更大的可操作性,而不是固定的时钟源。

 

 

 

参考资料:

  1. 《LPC80x User Manual》

用户手册包含了外设配置方法,由 NXP 官网提供下载,链接如下:

https://www.nxp.com.cn/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/lpc800-cortex-m0-plus-/low-cost-microcontrollers-mcus-based-on-arm-cortex-m0-plus-core:LPC80X?fpsp=1&tab=Documentation_Tab

  1. LPC804 官方 SDK 包

SDK 包里包含了许多例程,由 NXP 官网提供下载,链接如下:

https://mcuxpresso.nxp.com/en/select

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论