目录
一. 串口相关知识回顾
1.1 通信方式
1.2 数据传输方式
1.3 串口传输顺序
1.4 串口通信时序
1.5 串口波特率
1.6 串口通信参数
1.7 常见串口电平种类
二. IMX6ULL 串口简介
2.1 IMX6ULL 串口特性
2.2 串口时钟源的选择
2.3 寄存器
2.3.1 UARTx_ UCR1 串口控制寄存器1
2.3.2 UARTx_UCR2 串口控制寄存器2
2.3.3 UARTx_UCR3 串口控制寄存器3
2.3.4 UARTx_USR2 串口状态寄存器2
2.3.5 UARTx_UFCR 寄存器
2.3.6 UARTx_UBIR 和 UARTx_UBMR寄存器
1、串口波特率的计算
三. IMX6ULL 串口示例代码
3.1 串口初始化流程与代码
3.2 串口发送示例代码
3.3 串口接收示例代码
一. 串口相关知识回顾
1.1 通信方式
单工 半双工 全双工
串口是全双工
1.2 数据传输方式
串行 并行
1.3 串口传输顺序
LSB:低位先行原则,串口是LSB原则
MSB:高位先行原则
1.4 串口通信时序

在空闲时,TXD数据线是高电平,当发送方发送数据时先发送一个低电平作为起始位,然后按照低位先行原则发送8位数据,之后可以选择性的发送一位校验位,可以是奇校验,偶校验,也可以无校验,最后发送一个停止位,停止位是高电平,用于表示数据传输的间隔,停止位可以是1位、1.5位、2位
1.5 串口波特率
波特率:每秒传输的bit数
常见波特率:2400,4800,9600,115200
1.6 串口通信参数
9600 8 N 1
解释:波特率+数据位+校验位+停止位
另:O(odd)表示奇校验,E(even)表示偶校验
1.7 常见串口电平种类
TTL:高电平1:1.8v,3.3v,5v 低电平0:0v 芯片CH340进行USB与TTL电平的转换
TTL通信距离通常被限制在10~20米之间
RS232(负逻辑):高电平1:-3 ~ -15V之间 低电平0:3 ~ 15V之间
收发主机间有三根线,分别是收、发和地,因此RS232是全双工的
理论上RS232能够传输20~30米
RS485(差分信号):高电平1:2 ~ 6V之间 低电平0:-2 ~ -6V之间
是半双工传输
RS485的传输距离可达1200米,适用于大范围的数据传输需求
差分信号提高了抗干扰能力
二. IMX6ULL 串口简介
UART 全称是 Universal Asynchronous Receiver/Trasmitter—异步串行收发器
串口全称叫做串行接口,通常也叫做 COM 接口,串行接口指的是数据一个一个的顺序传 输,通信线路简单。使用两条线即可实现双向通信,一条用于发送,一条用于接收。串口通信距离远,但是速度相对会低,串口是一种很常用的工业接口。I.MX6ULL 自带的 UART 外设就是串口的一种,UART 全称是 Universal Asynchronous Receiver/Trasmitter,也就是异步串行收发器。既然有异步串行收发器,那肯定也有同步串行收发器,就是USART,USART 的全称是 Universal Synchron ous/Asynchronous Receiver/Transmitter,也就是同步/异步串行收发器。相比 UART 多了一个同步的功能,在硬件上体现出来的就是多了一条时钟线。
IMX6ULL 的串口原理图如下:
UART1_RXD 连接到了soc的 UART1_RX UART1_TXD 连接到了soc的 UART1_TX


2.1 IMX6ULL 串口特性
1、支持高速RS232,最高5Mbit/s 2、支持红外线接口(IrDA),可达115.2Kbit/s 3、支持 9 位或者多节点模式(RS-485),单主多从的通信RS485 Master Slaver Modbus应用层协议,有一个地址码,可以区分从机, RS485物理层协议 自动检测从机地址—通过寄存器配置地址 4、7/8位的数据RS232, 9位数据RS485—-有校验位 5、1/2位的停止位 6、可编程校验位:偶,奇,无校验parity 7、支持硬件流控 ,除了TXD,RXD引脚,还有RTS_B与CTS_B两个控制引脚 RTS_B:request to send_B(低电平有效):请求发送控制引脚 CTS_B:clear to send:清除发送控制引脚 8、RS485可以通过CTS_B引脚控制—半双工 低:接收 高:发送 9、FIFO:支持缓冲区 TX_FIFO:大小可以设置 32字节 RX_FIFO:
10、IMX6ULL有七个串口 UART1 – UART7
2.2 串口时钟源的选择
UART 的时钟源是由寄存器 CCM_CSCDR1 的 UART_CLK_SEL(bit6)位来选择的,当为 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
寄存器CCM_CSCDR1如图所示
可以看到这个寄存器默认就是选择pll3_80m,并且是一分频,故无需配置


| UART_CLK_SEL(bit6) |
UART 时钟复用器选择器 0:选择pll3_80m 1:选择osc_clk |
| UART_CLK_PODF(bit5:0) |
UART时钟分频选择 000000:1分频 111111:2^6 + 1 = 65分频 |

2.3 寄存器
2.3.1 UARTx_ UCR1 串口控制寄存器1
| ADBR(bit14) |
自动波特率检测使能位 为 0 的时候关闭自动波特率检测 为 1 的时候使 能自动波特率检测 |
| UARTEN(bit0) |
UART 使能位 为 0 的时候关闭 UART 为 1 的时候使能 UART |

2.3.2 UARTx_UCR2 串口控制寄存器2
| IRTS(bit14) |
Ignore RTS Pin 0 :使用 RTS 引脚功能 1 :忽略 RTS 引脚 |
| PREN(bit8) |
Parity Enable 奇偶校验使能位 0:关闭奇偶校验 1:使能奇偶校验 |
| PROE(bit7) |
奇偶校验模式选择位,开启奇偶校验以后此位: 0: 使用偶校验 1 :使用奇校验 |
| STPB(bit6) |
停止位数量 0 :1 位停止位 1 :2 位停止位 |
| WS(bit5) |
数据位长度 0 :选择 7 位数据位 1 :选择 8 位数据位 |
| TXEN(bit2) |
发送使能位 0:关闭UART的发送功能 1:打开UART的发送功能 |
| RXEN(bit1) |
接收使能位 0:关闭UART的接收功能 1:打开UART的接收功能 |
| SRST(bit0) |
软件复位 0:软件复位UART,软件复位状态将在 4 个模块时钟周期后保持激活状态,故初始化串口时,最好先复位串口:UART1->UCR2 &= ~(1 << 0); 1:表示复位完成。复位完成以后此位会自动置1,表示复位完成。 此位只能写0,写1会被忽略掉 |

2.3.3 UARTx_UCR3 串口控制寄存器3
| RXDMUXSEL(bit2) | RXD 多路复用输入已选中。为串行和红外输入信号选择正确的输入引脚。 注意:在该芯片中,UART 采用多路复用模式,因此此位应始终设置为“1” |

2.3.4 UARTx_USR2 串口状态寄存器2
| TXDC(bit3) |
发送完成标志位 为 1 的时候表明发送缓冲(TxFIFO)和移位寄存器为空,也就是发送完成, 向 TxFIFO 写入数据此位就会自动清零 为 0 表示发送未完成 在使用串口进行发送数据时,可以进行判断 :while( (UART1->USR2 & (1 << 3)) == 0 ); |
| RDR(bit0) |
数据接收标志位 为 1 的时候表明至少接收到一个数据 从寄存器 UARTx_U RXD 读取数据接收到的数据以后此位会自动清零 在使用串口接收数据时,可以进行判断: while( (UART1->USR2 & (1 << 0)) == 0 ); |

2.3.5 UARTx_UFCR 寄存器
UART FIFO Control Register
| RFDIV(9:7) |
用来设置参考时钟分频 设置如下表:
|

2.3.6 UARTx_UBIR 和 UARTx_UBMR寄存器
示例配置代码:
/设置一分频,串口时钟为80MHz
//UART1->UFCR |= (5 << 7);
UART1->UFCR = (5 << 7);
/设置波特率
UART1->UBIR = 999;
UART1->UBMR = 43402;
注意:UFCR 其他位有 FIFO 配置,使用 |= 会保留原有不确定值,裸机上电寄存器是随机值,最好使用 = 直接赋值
UBIR:

UBMR:

1、串口波特率的计算
计算公式:


这里 RefFreq 为 80 MHz
若波特率为 115200 则可得:UBMR + 1/UBIR + 1 = 43.403(约等于)
令UBIR + 1 = 1000,即UBIR = 999
则UBMR + 1 = 43403,即UBMR = 43402
三. IMX6ULL 串口示例代码
3.1 串口初始化流程与代码
基本流程:配置引脚复用功能—>配置引脚电气属性—>配置串口相关属性:复位,校验位,数据位,停止位,使能,分频,波特率等等
//初始化串口
void uart_init(void)
{
//1、配置引脚复用
IOMUXC_SetPinMux(IOMUXC_UART1_TX_DATA_UART1_TX, 0);
IOMUXC_SetPinMux(IOMUXC_UART1_RX_DATA_UART1_RX, 0);
//2、配置引脚电气属性
IOMUXC_SetPinConfig(IOMUXC_UART1_TX_DATA_UART1_TX, 0x10B0);
IOMUXC_SetPinConfig(IOMUXC_UART1_RX_DATA_UART1_RX, 0x10B0);
//3、先失能UART
UART1->UCR1 &= ~(1 << 0);
//4、先复位
UART1->UCR2 &= ~(1 << 0);
//5、忽略RTS流控引脚
UART1->UCR2 |= (1 << 14);
//6、无校验位
UART1->UCR2 &= ~(1 << 8);
//7、一位停止位
UART1->UCR2 &= ~(1 << 6);
//8、八位数据位
UART1->UCR2 |= (1 << 5);
//9、发送使能,接收使能
UART1->UCR2 |= ((1 << 2) | (1 << 1));
//10、使用交叉模式
UART1->UCR3 |= (1 << 2);
//11、设置一分频,串口时钟为80MHz
//UART1->UFCR |= (5 << 7);
UART1->UFCR = (5 << 7);
//12、设置波特率
UART1->UBIR = 999;
UART1->UBMR = 43402;
//13、使能串口
UART1->UCR1 |= (1 << 0);
}
3.2 串口发送示例代码
//串口发送字符函数
void putc(unsigned char ch)
{
//上一次未发送完成则等待
while( (UART1->USR2 & (1 << 3)) == 0 );
//发送数据
UART1->UTXD = ch;
}
//串口发送字符串
void puts(const char *p)
{
while(*p)
{
putc(*p++);
}
}
3.3 串口接收示例代码
//串口接收字符
unsigned char getc()
{
while( (UART1->USR2 & (1 << 0)) == 0 );
return (UART1->URXD & 0xFF);
}
网硕互联帮助中心








评论前必须登录!
注册