正点原子linux串口驱动,正点原子Mini Linux—UART串口简单介绍

UART串口

一、I.MUX6ULL串口UART

1、串口原理

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

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

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

二、部分例程代码

一、I.MUX6ULL串口UART

1、串口原理

UART,也就是异步串行收发器,使用UART与外界相连最少只要三条线:TXD(发送)、RXD(接收)和GND(地线)。UART串口的接口电平有TTL和RS-232两种,在正电原子的这款Mini Linux开发板上有CH340芯片,可以实现USB和串口TTL信号之间的转换,这里用到的是UART1,因此在电脑和开发板之间的串口UART通信只需要一条USB线即可。

下图是UART通信格式:

fde16ee876abedf10c636e22690d96e2.png

数据线一开始空闲状态的时候为高电平,要传输数据时先将数据线拉低,表示开始传输数据,后面即为要传输的数据(可以通过设置选择数据位数),数据发送完成后,如果使能了奇偶校验,就进行校验,如果关闭则跳过。最后就是停止位(位数可以选择)。

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

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

261f512e31a766cf65cb174e594cbddf.png44cc43bcd63231667c3328b12629a090.png

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]。下面为波特率设置的具体公式:

f47d5515d160443ea9cc4f15c8808244.png

例程中给出了两种波特率设置的方式:

①、根据公式手动配置三个寄存器的值,达到理想的波特率(每次转换不同的波特率需要重新计算配置三个寄存器值的)。

②、使用波特率配置函数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 */

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值