串口全称叫做串行接口,通常也叫做 COM 接口,串行接口指的是数据一个一个的顺序传输,通信线路简单。使用两条线即可实现双向通信,一条用于发送,一条用于接收。串口通信距离远,但是速度相对会低,串口是一种很常用的工业接口。 I.MX6U 自带的 UART 外设就是串口的一种,UART 全称是 Universal Asynchronous Receiver/Trasmitter,也就是异步串行收发器。USART 的全 称 是 UniversalSynchronous/Asynchronous Receiver/Transmitter,也就是同步/异步串行收发器。 相比 UART 多了一个同步的功能,在硬件上体现出来的就是多了一条时钟线。 一般 USART 是可以作为 UART使用的,也就是不使用其同步的功能
1.UART 通信格式UART 作为串口的一种,其工作原理也是将数据一位一位的进行传输,发送和接收各用一条线,因此通过 UART 接口与外界相连最少只需要三条线: TXD(发送)、 RXD(接收)和 GND(地线) UART 的通信格式:
空闲位:数据线在空闲状态的时候为逻辑“1”状态,也就是高电平,表示数据线空闲,没有数据传输
起始位:当要传输数据的时候先传输一个逻辑“0”,也就是将数据线拉低,表示开始数据传输
数据位: 要传输的数据,数据位数可选择 5~8 位,一般都是按照字节传输数据的,一个字节 8 位,因此数据位通常是 8 位的。低位在前,先传输,高位最后传输
奇偶校验位: 这是对数据中“1”的位数进行奇偶校验用的,可以不使用奇偶校验功能
停止位:数据传输完成标志位,停止位的位数可以选择 1 位、 1.5 位或 2 位高电平,一般都 选择 1 位停止位
波特率:UART 数据传输的速率,每秒传输的数据位数,一般选择 9600、19200、 115200
2.UART电平标准UART 接口电平有 TTL 和 RS-232,一般开发板上都有 TXD 和 RXD 引脚,这些引脚低电平表示逻辑 0,高电平表示逻辑 1,这个就是 TTL 电平;RS-232 采用差分线, -3~-15V 表示逻辑 1, +3~+15V 表示逻辑 0
TTL 接口部分有 VCC、 GND、 RXD、 TXD、RTS 和 CTS。 RTS 和 CTS 基本用不到,使用的时候通过杜邦线和其他模块的 TTL 接口相连即可
RS-232 电平需要 DB9 接口, I.MX6U-ALPHA 开发板上的 COM3(UART3)口就是 RS-232 接 口的
现在基本上都是USB转串口 TTL 芯片,比如 CH340、PL2303 等。通过这些芯片就可以实现串口 TTL 转 USB。I.MX6UALPHA开发板就使用CH340 芯片来完成UART1 和电脑之间的连接,只需要一条USB 线即可
3.常用寄存器UARTx_UCR1控制寄存器
ADBR(bit14):自动波特率检测使能位,为 0 的时候关闭自动波特率检测,为 1 的时候使 能自动波特率检测UARTEN(bit0): UART 使能位,为 0 的时候关闭 UART,为 1 的时候使能 UART
UARTx_UCR2控制寄存器
IRTS(bit14):为 0 的时使用 RTS 引脚功能,为 1 的时忽略 RTS 引脚,一般忽略 PREN(bit8):奇偶校验使能位,为 0 的时关闭奇偶校验,为 1 的时使能奇偶校验 PROE(bit7):奇偶校验模式选择位,为 0 的话就使用偶校验,为 1 的话就使能奇校验 STOP(bit6):停止位数量,为 0,1 位停止位,为 1 ,2 位停止位 WS(bit5):数据位长度,为 0 的时选择 7 位数据位,为 1 的时选择 8 位数据位,8位 TXEN(bit2):发送使能位,为 1 的时候打开 UART的发送功能 RXEN(bit1):接收使能位,为 1 的时候打开 UART的接收功能 SRST(bit0):软件复位,为 0 的是时软件复位 UART,为 1 的时候表示复位完成。复位 完成以后此位会自动置 1,表示复位完成。此位只能写 0,写 1 会被忽略掉
注:寄存器 UARTx_UCR3 中的位 RXDMUXSEL(bit2),这个位应该始终为 1
UARTx_USR2状态寄存器
TXDC(bit3):发送完成标志位,为 1 的时表明发送缓冲(TxFIFO)和移位寄存器为空,也 就是发送完成,向 TxFIFO 写入数据此位就会自动清零 RDR(bit0):数据接收标志位,为 1 的时表明至少接收到一个数据,从寄存器UARTx_URXD 读取数据接收到的数据以后此位会自动清零
串口时钟配置
UART 的时钟源是由寄存器 CCM_CSCDR1 的 UART_CLK_SEL(bit)位来选择的,当为 0 的 时候 UART 的时钟源为 pll3_80m(80MHz),如果为 1 的时候 UART 的时钟源为 osc_clk(24M),一般选择 pll3_80m 作为 UART 的时钟源。寄存器 CCM_CSCDR1 的 UART_CLK_PODF(bit5:0) 位是 UART 的时钟分频值,可设置 0~63,分别对应 1~64 分频,一般设置为 1 分频,因此最终进入 UART 的时钟为 80MHz
UART波特率的设置:由寄 存 器 UARTx_UFCR 、 UARTx_UBIR 和 UARTx_UBMR决定
UARTx_UFCR 中要用到的是位 RFDIV(bit9:7),用来设置时钟分频
Ref Freq:经过分频以后进入 UART 的最终时钟频率。UBMR:寄存器 UARTx_UBMR 中的值。 UBIR:寄存器 UARTx_UBIR 中的值
设置 UART 波特率为 115200,可以设置 RFDIV 为5(0b101),也就是 1 分频,因此 RefFreq=80MHz。设置 UBIR=71, UBMR=3124,可以得到115200,官方也提供了相应的函数
寄存器 UARTx_URXD 和 UARTx_UTXD,这两个寄存器分别为 UART 的接收和发送数据寄存器,这两个寄存器的低八位为接收到的和要发送的数据。读取寄存器UARTx_URXD 即可获取到接收到的数据,如果要通过 UART 发送数据,直接将数据写入到寄存器 UARTx_UTXD 即可
二、串口编写串口1原理图
1.设置 UART1 的时钟源
设置 UART 的时钟源为 pll3_80m,设置寄存器 CCM_CSCDR1 的 UART_CLK_SEL 位为 0 即可
2.初始化UART1初始化 UART1 所使用 IO,设置 UART1 的寄存器 UART1_UCR1~UART1_UCR3,设置内 容包括波特率,奇偶校验、停止位、数据位
void uart_io_init(void)
{
/* 1、初始化IO复用
* UART1_RXD -> UART1_TX_DATA
* UART1_TXD -> UART1_RX_DATA
*/
IOMUXC_SetPinMux(IOMUXC_UART1_TX_DATA_UART1_TX,0); /* 复用为UART1_TX */
IOMUXC_SetPinMux(IOMUXC_UART1_RX_DATA_UART1_RX,0); /* 复用为UART1_RX */
/* 2、配置UART1_TX_DATA、UART1_RX_DATA的IO属性
*bit 16:0 HYS关闭
*bit [15:14]: 00 默认100K下拉
*bit [13]: 0 keeper功能
*bit [12]: 1 pull/keeper使能
*bit [11]: 0 关闭开路输出
*bit [7:6]: 10 速度100Mhz
*bit [5:3]: 110 驱动能力R0/6
*bit [0]: 0 低转换率
*/
IOMUXC_SetPinConfig(IOMUXC_UART1_TX_DATA_UART1_TX,0x10B0);
IOMUXC_SetPinConfig(IOMUXC_UART1_RX_DATA_UART1_RX,0x10B0);
}
void uart_init(void)
{
/* 1、初始化串口IO */
uart_io_init();
/* 2、初始化UART1 */
uart_disable(UART1); /* 先关闭UART1 */
uart_softreset(UART1); /* 软件复位UART1 */
UART1->UCR1 = 0; /* 先清除UCR1寄存器 */
/*
* 设置UART的UCR1寄存器,关闭自动波特率
* bit14: 0 关闭自动波特率检测,我们自己设置波特率
*/
UART1->UCR1 &= ~(1
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?