通过上面的介绍可以看出,自动波特率下,并没有使用小数波特率,那么在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.}
|