云计算百科
云计算领域专业知识百科平台

ARM---IMX6ULL的串口UART介绍:相关寄存器说明、波特率的计算、初始化方法与示例代码等

目录

一. 串口相关知识回顾

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);
}

赞(0)
未经允许不得转载:网硕互联帮助中心 » ARM---IMX6ULL的串口UART介绍:相关寄存器说明、波特率的计算、初始化方法与示例代码等
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!