正点原子Mini Linux—UART串口简单介绍

一、I.MUX6ULL串口UART

1、串口原理

UART,也就是异步串行收发器,使用UART与外界相连最少只要三条线:TXD(发送)、RXD(接收)和GND(地线)。UART串口的接口电平有TTL和RS-232两种,在正电原子的这款Mini Linux开发板上有CH340芯片,可以实现USB和串口TTL信号之间的转换,这里用到的是UART1,因此在电脑和开发板之间的串口UART通信只需要一条USB线即可。
下图是UART通信格式:
在这里插入图片描述
数据线一开始空闲状态的时候为高电平,要传输数据时先将数据线拉低,表示开始传输数据,后面即为要传输的数据(可以通过设置选择数据位数),数据发送完成后,如果使能了奇偶校验,就进行校验,如果关闭则跳过。最后就是停止位(位数可以选择)。

2、I.MUX6U的UART时钟源设置

根据I.MUX6U参考手册中的时钟树图,可以看出UART的时钟源可以通过设置CCM_CSCDR1中的UART_CLK_SEL位来选择是PLL3进行6分频(80MHz)或者是OSC时钟(24MHz)。之后还可以设置该寄存器的UART_CLK_PODF进行1~64分频,产生最终的UART时钟源。
在这里插入图片描述

3、I.MUX6U的UART波特率设置

I.MUX6U串口波特率的设置原理基于三个寄存器,分别是UART_UFCR、UART_UBIR和UART_UBMR寄存器。其中UART_UFCR寄存器用到其bit[9:7],可以在UART时钟源的基础上再进行分频。然后再根据公式设置UART_UBIR和UART_UBMR的bit[15:0]。下面为波特率设置的具体公式:
在这里插入图片描述
例程中给出了两种波特率设置的方式:
①、根据公式手动配置三个寄存器的值,达到理想的波特率(每次转换不同的波特率需要重新计算配置三个寄存器值的)。
②、使用波特率配置函数void uart_setbaudrate(UART_Type *base, unsigned int baudrate, unsigned int srcclock_hz);(可以直接将想要的波特率写入函数,函数将自动配置)。

4、其他UART的寄存器的主要功能介绍

①、UART_URXD寄存器
  bit[7:0]保存着串口收到的数据。
②、UART_UTXD寄存器
  bit[7:0]保存着串口要发送的数据。
③、UART_UCR1寄存器
  bit0用来使能和禁止UART,bit14为自动控制波特率使能位(仅进行介绍,并没有使用)。
④、UART_UCR2寄存器
  bit0为软件复位位,为0时复位UART。
  bit1,bit2分别是使能UART的接收和发送。
  bit5设置数据为长度(0表示7位数据位,1表示8位数据位)。
  bit6设置停止位(0表示1位停止位,1表示2位停止位)。
  bit7设置奇偶校验(0表示偶校验,1表示奇校验)。
  bit8时奇偶校验位的使能位,为1时使能,0时关闭。
⑤、UART_UCR3寄存器
  bit2必须为1(手册中NOTE写到必须一直置1)。
⑥、UART_USR2寄存器
  bit0为1的时候表示有数据可以读取。
  bit3为1的时候表示数据发送完成。

UART还有许多其他的寄存器,本例程没有使用到,可以自行查阅。

二、部分例程代码

下面时总的UART初始化的代码。

/* UART1初始化总函数 */
void uart_init(void)
{
    uart_io_init();		/* 初始化UART1的所有IO,包括IO的复用和电气属性设置 */
    uart_disable(UART1);	/* 关闭UART1,通过置零UART1_UCR1寄存器bit0 */
    uart_softreset(UART1);	/* 软复位UART1,通过置零UART1_UCR2寄存器bit0 */
    /* 配置UART1的数据位、奇偶校验、停止位等等 */
    UART1->UCR2 = 0;		/* 先清零UCR2寄存器的值 */
    UART1->UCR2 |= (1 << 1) | (1 << 2) | (1 << 5) | (1 << 14);
    UART1->UCR3 |= (1 << 2);}	/* UCR3寄存器的bit2必须置1 */
    /* 手动配置波特率 */
#if 0
    /* 设置波特率为115200 */
    UART1->UFCR &= ~(7 << 7);       /* 对RFDIV进行清零 */
    UART1->UFCR |= (5 << 7);        /* 1分频,uart_clk = 80MHz */
    UART1->UBIR = 71;
    UART1->UBMR = 3124;
#endif
    /* 只用函数配置波特率 */
    uart_setbaudrate(UART1, 115200, 80000000);
    
    uart_enable(UART1);		/* 开启UART1,通过置1UART1_UCR1寄存器bit0 */

猜你喜欢

转载自blog.csdn.net/Jayccccc/article/details/106395697