您当前的位置: 首页 >  嵌入式

正点原子

暂无认证

  • 1浏览

    0关注

    382博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【正点原子Linux连载】第二十一章 UART串口通信实验-摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

正点原子 发布时间:2021-08-23 11:42:00 ,浏览量:1

1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-300792-1-1.html 3)对正点原子Linux感兴趣的同学可以加群讨论:935446741 4)关注正点原子公众号,获取最新资料更新 在这里插入图片描述

第二十一章 UART串口通信实验

不管是单片机开发还是嵌入式Linux开发,串口都是最常用到的外设。可以通过串口将开发板与电脑相连,然后在电脑上通过串口调试助手来调试程序。还有很多的模块,比如蓝牙、GPS、GPRS等都使用的串口来与主控进行通信的,在嵌入式Linux中一般使用串口作为控制台,所以掌握串口是必备的技能。本章我们就来学习如何驱动I.MX6U上的串口,并使用串口和电脑进行通信。

21.1 I.MX6U串口简介 21.1.1 UART简介 1、UART通信格式 串口全称叫做串行接口,通常也叫做COM接口,串行接口指的是数据一个一个的顺序传输,通信线路简单。使用两条线即可实现双向通信,一条用于发送,一条用于接收。串口通信距离远,但是速度相对会低,串口是一种很常用的工业接口。I.MX6U自带的UART外设就是串口的一种,UART全称是Universal Asynchronous Receiver/Trasmitter,也就是异步串行收发器。既然有异步串行收发器,那肯定也有同步串行收发器,学过STM32的同学应该知道,STM32除了有UART外,还有另外一个叫做USART的东西。USART的全称是Universal Synchronous/Asynchronous Receiver/Transmitter,也就是同步/异步串行收发器。相比UART多了一个同步的功能,在硬件上体现出来的就是多了一条时钟线。一般USART是可以作为UART使用的,也就是不使用其同步的功能。 UART作为串口的一种,其工作原理也是将数据一位一位的进行传输,发送和接收各用一条线,因此通过UART接口与外界相连最少只需要三条线:TXD(发送)、RXD(接收)和GND(地线)。图21.1.1.1就是UART的通信格式: 在这里插入图片描述

图21.1.1.1 UART通信格式 图21.1.1.1中各位的含义如下: 空闲位:数据线在空闲状态的时候为逻辑“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。一般图21.1.1.2中的接口就是TTL电平: 在这里插入图片描述 在这里插入图片描述

图21.1.1.2 TTL电平接口 图21.1.1.2中的模块就是USB转TTL模块,TTL接口部分有VCC、GND、RXD、TXD、RTS和CTS。RTS和CTS基本用不到,使用的时候通过杜邦线和其他模块的TTL接口相连即可。 RS-232电平需要DB9接口,I.MX6U-ALPHA开发板上的COM3(UART3)口就是RS-232接口的,如图21.1.1.3所示: 在这里插入图片描述

图21.1.1.3 I.MX6U-ALPHA开发板RS-232接口 由于现在的电脑都没有DB9接口了,取而代之的是USB接口,所以就催生出了很多USB转串口TTL芯片,比如CH340、PL2303等。通过这些芯片就可以实现串口TTL转USB。I.MX6U-ALPHA开发板就使用CH340芯片来完成UART1和电脑之间的连接,只需要一条USB线即可,如图21.1.1.4所示。 在这里插入图片描述

图21.1.1.4 I.MX6U-ALPHA开发板USB转TTL接口 21.1.2 I.MX6U UART简介 上一小节介绍了UART接口,本小节来具体看一下I.MX6U的UART接口,I.MX6U一共有8个UART,其主要特性如下: ①、兼容TIA/EIA-232F标准,速度最高可到5Mbit/S。 ②、支持串行IR接口,兼容IrDA,最高可到115.2Kbit/s。 ③、支持9位或者多节点模式(RS-485)。 ④、1或2位停止位。 ⑤、可编程的奇偶校验(奇校验和偶校验)。 ⑥、自动波特率检测(最高支持115.2Kbit/S)。 I.MX6U的UART功能很多,但是我们本章就只用到其最基本的串口功能,关于UART其它功能的介绍请参考《I.MX6ULL参考手册》第3561页的“Chapter 55 Universal Asynchronous Receiver/Transmitter(UART)”章节。 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的时钟分频值,可设置063,分别对应164分频,一般设置为1分频,因此最终进入UART的时钟为80MHz。 接下来看一下UART几个重要的寄存器,第一个就是UART的控制寄存器1,即UARTx_UCR1(x=1~8),此寄存器的结构如图21.1.2.1所示: 在这里插入图片描述

图21.1.2.1 寄存器UARTx_UCR1结构 寄存器UARTx_UCR1我们用到的重要位如下: ADBR(bit14):自动波特率检测使能位,为0的时候关闭自动波特率检测,为1的时候使能自动波特率检测。 UARTEN(bit0):UART使能位,为0的时候关闭UART,为1的时候使能UART。 接下来看一下UART的控制寄存器2,即:UARTx_UCR2,此寄存器结构如图21.1.2.2所示: 在这里插入图片描述

图21.1.2.2 寄存器UARTx_UCR2结构 寄存器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位数据位。 TXEN(bit2):发送使能位,为0的时候关闭UART的发送功能,为1的时候打开UART的发送功能。 RXEN(bit1):接收使能位,为0的时候关闭UART的接收功能,为1的时候打开UART的接收功能。 SRST(bit0):软件复位,为0的是时候软件复位UART,为1的时候表示复位完成。复位完成以后此位会自动置1,表示复位完成。此位只能写0,写1会被忽略掉。 接下来看一下UARTx_UCR3寄存器,此寄存器结构如图21.1.2.3所示: 在这里插入图片描述

图21.1.2.3 UARTx_UCR3寄存器结构体 本章实验就用到了寄存器UARTx_UCR3中的位RXDMUXSEL(bit2),这个位应该始终为1,这个在《I.MX6ULL参考手册》第3624页有说明。 接下来看一下寄存器UARTx_USR2,这个是UART的状态寄存器2,此寄存器结构如图21.1.2.4所示: 在这里插入图片描述

图21.1.2.4 寄存器UARTx_USR2结构 寄存器UARTx_USR2用到的重要位如下: TXDC(bit3):发送完成标志位,为1的时候表明发送缓冲(TxFIFO)和移位寄存器为空,也就是发送完成,向TxFIFO写入数据此位就会自动清零。 RDR(bit0):数据接收标志位,为1的时候表明至少接收到一个数据,从寄存器UARTx_URXD读取数据接收到的数据以后此位会自动清零。 接下来看一下寄存器UARTx_UFCR、UARTx_UBIR和UARTx_UBMR,寄存器UARTx_UFCR中我们要用到的是位RFDIV(bit9:7),用来设置参考时钟分频,设置如表21.1.2.1所示: RFDIV(bit9:7) 分频值 000 6分频 001 5分频 010 4分频 011 3分频 100 2分频 101 1分频 110 7分频 111 保留 表21.1.2.1 RFDIV分频表 通过这三个寄存器可以设置UART的波特率,波特率的计算公式如下:

Ref Freq:经过分频以后进入UART的最终时钟频率。
UBMR:寄存器UARTx_UBMR中的值。
UBIR:寄存器UARTx_UBIR中的值。
通过UARTx_UFCR的RFDIV位、UARTx_UBMR和UARTx_UBIR这三者的配合即可得到我们想要的波特率。比如现在要设置UART波特率为115200,那么可以设置RFDIV为5(0b101),也就是1分频,因此Ref Freq=80MHz。设置UBIR=71,UBMR=3124,根据上面的公式可以得到:

= 最后来看一下寄存器UARTx_URXD和UARTx_UTXD,这两个寄存器分别为UART的接收和发送数据寄存器,这两个寄存器的低八位为接收到的和要发送的数据。读取寄存器UARTx_URXD即可获取到接收到的数据,如果要通过UART发送数据,直接将数据写入到寄存器UARTx_UTXD即可。 关于UART的寄存器就介绍到这里,关于这些寄存器详细的描述,请参考《I.MX6ULL参考手册》第3608页的55.15小节。本章我们使用I.MX6U的UART1来完成开发板与电脑串口调试助手之间串口通信, UART1的配置步骤如下: 1、设置UART1的时钟源 设置UART的时钟源为pll3_80m,设置寄存器CCM_CSCDR1的UART_CLK_SEL位为0即可。 2、初始化UART1 初始化UART1所使用IO,设置UART1的寄存器UART1_UCR1~UART1_UCR3,设置内容包括波特率,奇偶校验、停止位、数据位等等。 4、使能UART1 UART1初始化完成以后就可以使能UART1了,设置寄存器UART1_UCR1的位UARTEN为1。 5、编写UART1数据收发函数 编写两个函数用于UART1的数据收发操作。 21.2 硬件原理分析 本试验用到的资源如下: ①、一个LED灯:LED0。 ②、串口1。 I.MX6U-ALPHA开发板串口1硬件原理图如图21.2.1所示: 在这里插入图片描述

图21.2.1 I.MX6U-ALPHA开发板串口1原理图 在做实验之前需要用USB串口线将串口1和电脑连接起来,并且还需要设置JP5跳线帽,将串口1的RXD、TXD两个引脚分别与P116、P117连接一起,如图21.2.2所示: 在这里插入图片描述

图21.2.2 串口1硬件连接设置图 硬件连接设置好以后就可以开始软件编写了,本章实验我们初始化好UART1,然后等待SecureCRT给开发板发送一个字节的数据,开发板接收到SecureCRT发送过来的数据以后在同通过串口1发送给SecureCRT。 21.3 实验程序编写 本实验对应的例程路径为:开发板光盘-> 1、裸机例程-> 13_uart。 本章实验在上一章例程的基础上完成,更改工程名字为“uart”,然后在bsp文件夹下创建名为“uart”的文件夹,然后在bsp/uart中新建bsp_uart.c和bsp_uart.h这两个文件。在bsp_uart.h中输入如下内容:

示例代码21.3.1 bsp_uart.h文件代码
1  #ifndef _BSP_UART_H
2  #define _BSP_UART_H
3  #include "imx6ul.h"
4  /***************************************************************
5  Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
6  文件名    : bsp_uart.h
7  作者      : 左忠凯
8  版本      : V1.0
9  描述      : 串口驱动文件头文件。
10 其他      : 无
11 论坛      : www.openedv.com
12 日志      : 初版V1.0 2019/1/15 左忠凯创建
13 ***************************************************************/
14 
15 /* 函数声明 */
16 void uart_init(void);
17 void uart_io_init(void);
18 void uart_disable(UART_Type *base);
19 void uart_enable(UART_Type *base);
20 void uart_softreset(UART_Type *base);
21 void uart_setbaudrate(UART_Type *base, 
unsigned int baudrate, 
unsigned int srcclock_hz);
22 void putc(unsigned char c);
23 void puts(char *str);
24 unsigned char getc(void);
25 void raise(int sig_nr);
26 
27 #endif
文件bsp_uart.h内容很简单,就是一些函数声明。继续在文件bsp_uart.c中输入如下所示内容:
示例代码21.3.2 bsp_uart.c文件代码
/***************************************************************
Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
文件名   : bsp_uart.c
作者     : 左忠凯
版本     : V1.0
描述     : 串口驱动文件。
其他     : 无
论坛     : www.openedv.com
日志     : 初版V1.0 2019/1/15 左忠凯创建
***************************************************************/
1   #include "bsp_uart.h"
2   
3   /*
4    * @description 	: 初始化串口1,波特率为115200
5    * @param       	: 无
6    * @return      	: 无
7    */
8   void uart_init(void)
9   {
10      /* 1、初始化串口IO 	*/
11      uart_io_init();
12  
13      /* 2、初始化UART1	*/
14      uart_disable(UART1);    		/* 先关闭UART1       	*/
15      uart_softreset(UART1);  		/* 软件复位UART1   		*/
16  
17      UART1->UCR1 = 0;        		/* 先清除UCR1寄存器 	*/
18      UART1->UCR1 &= ~(1            
关注
打赏
1665308814
查看更多评论
0.0499s