通过上面的介绍可以看出,自动波特率下,并没有使用小数波特率,那么在12MHz外部晶振下,将产生很大的误差,甚至有可能,自动设别的波特率根本不能应用。那么应该怎样解决这个问题呢?
在前面的帖子《NXP ARM微处理器实现波特率的计算方法》中我们介绍了小数波特率的应用,那么我们能否把自动波特与小数波特率发生器结合以来呢?
当然答案是肯定的。下面我们就分别讲解这两种方法的结合使用01./********************************************************************************************************
02.* FunctionName : UART_AutoBaud()
03.* Description : 自动波特率
04.* EntryParameter : num - 串口(0~3), mode - 模式(0-模式0, 1-模式1, 2-关闭自动波特)
05.* ReturnValue : 返回自动识别的波特率
06.********************************************************************************************************/
07.u32 UART_AutoBaud(u8 num, u8 mode)
08.{
09.u8 i, k, dlm, dll;
10.u32 tmpBaud, tAbs, min;
11.u32 uartClock = SystemCoreClock / 4; // 外设时钟与内核时钟的比例
12.u32 baud[] = {300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 43000, 57600, 115200};
13.
14.if (mode >= 2)
15.{
16.LPC_UART[num]->ACR = (0x00 << ACR_START); // 关闭自动波特率
17.return 0;
18.}
19.else
20.{
21.LPC_UART[num]->ACR = (0x01 << ACR_START) | (mode << ACR_MODE); // 启动自动波特率
22.while (LPC_UART[num]->ACR & (0x01 << ACR_START) != 0)
23.{
24.; // 等等自动波特率完成
25.}
26.
27.UART_Dlab(num, ENABLE);
28.dlm = LPC_UART[num]->DLM; // 读波特率高8位
29.dll = LPC_UART[num]->DLL; // 读波特率低8位
30.tmpBaud = uartClock / (16 * (256*dlm + dll)); // 计算波特率
31.UART_Dlab(num, DISABLE);
32.
33.k = 0;
34.min = baud[10];
35.for (i=0; i
36.{
37.tAbs = abs(baud-tmpBaud); // 选择误差最小的设置
38.if (min > tAbs)
39.{
40.k = i;
41.min = tAbs;
42.}
43.}
44.
45.return (baud[k]); // 返回设置
46.}
47.}
|