ARM7 串口波特率的设置

时间:2022-01-09 23:32:18

 UARTn除数锁存是波特率发生器的一部分,它保存了用于产生波特率时钟的APB时钟(PCLK)分频值,波特率时钟必须是目标波特率的16倍。UnDLL和UnDLM寄存器一起构成一个16位除数。其中,UnDLL包含的是除数的低8位,UnDLM包含的是除数的高8位。0x0000被看作是0x0001,因为除数是不允许为0的。在访问UARTn除数锁存寄存器时,除数锁存访问位(DLAB)必须为1。

 UARTn小数分频器寄存器(UnFDR)控制产生波特率的时钟预分频器,并且用户可以通过自己的判断对它进行读写操作。

在实际使用中,UARTn波特率公式可采用下列式子表示,在这个式 子中,确定了无小数波特率发生器时产生的那部分UART波特率,以及增加的修正因子:ARM7 串口波特率的设置

根据这个表达式,小数波特率发生器部分也可以描述成进行MULVAL/(MULVAL+DIVADDVAL)系数的预分频。

 其中,PCLK指外设时钟,UnDL的值由UnDLM和UnDLL寄存器确定(UnDL=256×UnDLM + UnDLL),DIVADDVAL和MULVAL为UARTn小数波特率发生器特定的参数。MULVAL和DIVADDVAL的值应遵循以下条件: 1.0<MULVAL≤15 2.0≤DIVADDVAL≤15 如果UnFDR寄存器值不符合这两个要求,那么小数分频器的输出将不能确定。如果DIVADDVAL为0,那么将禁能小数分频器并且时钟不会被分频。

 参考代码如下:

#define MULVAL 5

#define DIVADDVAL 2

#if 0

    Fdiv = ( Fpclk/ 16 *MULVAL /(DIVADDVAL+MULVAL)  ) / baudrate ; /*baud rate */
U1FDR = DIVADDVAL | (MULVAL << 4) | (U0FDR & 0xffffff00) ;
#endif

Fdiv = ( Fpclk/ 16) / baudrate ; /*baud rate */    

//两种方法都可以,前者是使用了小数分频器,后者没有使用。

ps:前者使用和后者未使用使用,得到的Fdiv是不同的,为什么都正确。如有大神看到,还请留言解惑,万分感谢。