随着应用的需要,自动波特率已经不是什葱缕娴母拍盍恕T谝郧耙迪肿远ㄌ芈剩话愣蓟嵊酶龆ㄊ逼骼醇扑闶莩ざ龋佣袢〔ㄌ芈省T贜XP芯片的串口中直接添加了一个定时器,自动实现波特率的计算,只需要正确设置好寄存器就可以了,非常简单实用,下面我们就讲讲实现的方式以及注意事项。
下面我们以LPC1700系列芯片为例进行详细介绍说明:
lpc1700的四个UART都有UARTn Auto-baud控制寄存器寄存器,这个寄存器用于对自动波特率的设置,用户可以自由地读写。具体描述如下:
1.自动波特率(Auto-baud)
UARTn auto-baud功能可用于测量基于“AT”协议(Hayes命令)的输入波特率。如果auto-baud功能被使能,那么auto-baud功能部件将测量接收数据流中的1位所消耗的时间,并根据这个结果来设置除数锁存寄存器UnDLM和UnDLL。
Auto-baud功能是通过置位UnACR起始位来启动的,并通过清零UnACR起始位来停止。Auto-baud一旦结束,起始位就将自动清零,并且对该起始位进行读取将会返回auto-baud的状态(挂起/完成)。
可通过设置UnACR模式位来使用两种auto-baud测量模式。在模式0下,波特率是通过对UARTn RX管脚上两个连续的下降沿进行测量(起始位的下降沿和第一位的下降沿)来得到的。而在模式1下,波特率则是通过测量UARTn RX管脚上的下降沿和后续的上升沿之间的时间(起始位的长度)来得到的。
如果出现超时(速率测量计数器溢出),UnACR AutoRestart位可用于自动重启波特率测量。如果该位被置位,速率测量将会在UARTn RX管脚的下一个下降沿重新启动。
Auto-baud功能会产生两种中断:
UnIIR ABTOInt中断(UnIER ABToIntEn置位且自动波特率测量寄存器溢出);
UnIIR ABEOInt中断(UnIER ABEOIntEn置位且auto-baud已经成功完成)。
Auto-baud中断必须通过置位相应的UnACR ABTOIntClr位和ABEOIntEn位来清零。在auto-baud期间,小数波特率发生器通常被禁用(即DIVADDVAL = 0)。但是,如果波特率发生器被启动(即DIVADDVAL > 0),那么它将影响UARTn Rx管脚波特率的测量,但UnFDR寄存器的值在速率测量后不会被修改。此外,当使用auto-baud时,任何对UnDLM和UnDLL寄存器的写操作都必须在写UnACR寄存器之前完成。UARTn支持的最小和最大波特率受PCLK、数据的位数、停止位以及校验位的影响。
通过公式我们不难算出,外部晶振12MHz,CUP内核频率100MHz,外设频率为25MHz时,最小波特率为95,最大为142045。完全满足我们的所有需要。。。
2.Auto-baud模式
提示词:如果您需要查看本帖隐藏内容,请
登录或者
注册