Linux串口驱动

《I.MX6ULL 参考手册》第 3561 页的"Chapter 55 Universal Asynchronous

Receiver/Transmitter(UART)

I.MX6ULL串口原理

1.1UART与USART

UART是异步通信,USART是异步/同步通信,比UART多了一条时钟线

USART 的全称是 Universal Synchronous/Asynchronous Receiver/Transmitter

通信格式如下:

1.2电平标准

常见电平标准有TTL (逻辑电平0和1)、RS-232(差分信号,-3~-15 表示逻辑1,+3~+15表示逻辑1)

I.MX6ULL串口

一共有8个串口

硬件原理

三种操作模式

2.1时钟源

由时钟配置寄存器 CCM_CSCDR1 ( CCM Serial Clock Divider Register)的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。

2.2UART重要寄存器

使能

UART 的UART Control Register 1 ,即UARTx_UCR1(x=1~8)

需要关注的地方:

1.自动波特率检测使能位:

2.使能位:

UARTx_UCR2寄存器(奇偶校验、停止位等设置)
UARTx_UCR3 寄存器

本章实验就用到了寄存器 UARTx_UCR3 中的位 RXDMUXSEL (bit2),这个位应该始终为 1,

寄存器 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),用来设置参考时钟分频

发送数据和接收数据

最后来看一下寄存器UARTx_URXD 和 UARTx_UTXD ,这两个寄存器分别为 UART 的接

收 和发送数据寄存器。

3.串口实验

3.1裸机步骤如下

  • 设置 UART1 的时钟源
  • 初始化 UART1
  • 使能 UART1
  • 编写 UART1 数据收发函数
  1. 板子硬件原理

3.2Linux下的串口实验

使用串口3,硬件接口如下:

RS232电平转换

RS485电平转换

RS232驱动编写

UART驱动NXP已经写好了,我们需要做的是向设备树中添加UART3对应的节点

所以

3.2.1修改设备树,添加UART3节点IO

通过寄存器IOMUXC_SW_PAD_CTL_PAD_UART3_TX_DATA 、IOMUXC_SW_PAD_CTL_PAD_UART3_RX_DATA 设置UART3的Rx、Tx引脚的电气属性为0x1b0b1

for example:

注意引脚不能被其它设备节点使用

复制代码
pinctrl_uart3: uart3grp {
fsl,pins = <
    //这里前面的宏定义是设置IO复用,后面的数字是设置电气属性,也就是config_reg寄存器的值
    MX6UL_PAD_UART3_TX_DATA__UART3_DCE_TX 0X1b0b1 
    MX6UL_PAD_UART3_RX_DATA__UART3_DCE_RX 0X1b0b1
>;
};

pinctrl子系统 IO配置复习

其中,宏定义定义在/arch/arm/boot/dts/imx6ul-pinfunc.h文件中

#define MX6UL_PAD_UART3_CTS_B__UART3_DCE_CTS 0x00AC 0x0338 0x0000 0x0 0x0

#define MX6UL_PAD_UART3_CTS_B__UART3_DTE_RTS 0x00AC 0x0338 0x0630 0x0 0x0

宏定义部分表示将UART3_CTS_B 这个IO 复用为 UART3_DCE_CTS ,后面五个值的含义如下:

<mux_reg conf_reg input_reg mux_mode input_val>

  • mux_reg:复用寄存器偏移地址
  • conf_reg:寄存器偏移地址
  • input_reg:寄存器偏移地址
  • mux_mode : mux_reg寄存器的值
  • input_val :input_val值
  1. 添加uart3节点

此处删除uart3,因为它占用了uart3的IO

完成以后重新编译设备树 并使用新的设备树启动 Linux,如果设备树修改成功的话,系统

启动以后就会生成一个名为"/dev/ttymxc2"的设备文件,ttymxc2 就是 UART3 对应的设备文

件,应用程序可以通过访问 ttymxc2 来实现对 UART3 的操作。

复制代码
 &uart3 {
 pinctrl-names = "default";
 pinctrl-0 = <&pinctrl_uart3>;
 status = "okay";
 };
3.2.2向开发板中移植minicom串口开发工具
  • 2.1移植依赖库ncurses

在Ubuntu中 在自己路径下eg:/home/dongdong/linux/IMX6ULL 目录下创建了一个名为"tool"的目录来存放所有的移植文件,解压文件

复制代码
tar -vxzf ncurses-6.0.tar.gz

解压完成以后就会生成一个名为"ncurses-6.0"的文件夹,此文件夹就是 ncurese 的源码文件夹

在 tool 目录下新建名为"ncurses"目录,用于保存 ncurses 编译结果,一切准备就绪以后

就可以编译 ncureses 库了。进入到 ncureses 源码目录下,也就是刚刚解压出来的 ncurses-6.0 目

录中,首先是配置 ncureses,输入如下命令:

复制代码
./configure  --prefix=/home/dongdong/linux/ncurses_code/ncurses   --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf --with-shared --without-profile --disable-stripping --without-progs --with-manpages --without-tests

解释:configure 就是配置脚本,--prefix 用于指定编译结果的保存目录,这里肯定将编译结果保存

到我们前面创建的"ncurses"目录中。--host 用于指定编译器前缀,这里设置为 "arm-linux-

gnueabihf",--target 用于指定目标,这里也设置为"arm-linux-gnueabihf"。

编译make 再安装 make install(安装的意思就是将编译出来的结果拷贝到--pfefix 指定的目录里面去).此处要加权限

安装成功以后查看一下前面创建的"ncurses"文件夹,我们需要将其中 include、lib 和 share 这三个目录中存放的文件分别拷贝到开发板根文件系统中的/usr/include、/usr/lib 和/usr/share 这三个目录中,如果哪个目录不存在的话请自行创建!!拷贝命令如下:

复制代码
sudo cp lib/* /home/dongdong/linux/nfs/rootfs/usr/lib/ -rfa
sudo cp share/* /home/dongdong/linux/nfs/rootfs/usr/share/ -rfa
sudo cp include/* /home/dongdong/linux/nfs/rootfs/usr/include/ -rfa

然后在开发板根目录的/etc/profile(没有的话自己创建一个)文件中添加如下所示内容:

复制代码
#!/bin/sh
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH
export TERM=vt100
export TERMINFO=/usr/share/terminfo
  • 继续移植 minicom

1.将 minicom-2.7.1.tar.gz 拷贝到 ubuntu 中的/home/zuozhongkai/linux/IMX6ULL/tool 目录下

2.在 tool 目录下新建一个名为"minicom"的子目录,用于存放 minicom编译结果

3.解压 minicom tar -vxzf minicom-2.7.1.tar.gz

4.解压完成以后会生成一个叫做 minicom-2.7.1 的文件夹,这个就是 minicom 的源码,进入到

此目录中,然后配置 minicom

复制代码
./configure CC=arm-linux-gnueabihf-gcc --prefix=/home/dongdong/linux/ncurses_code/minicom --host=arm-linux-gnueabihf CPPFLAGS=-I/home/dongdong/linux/ncurses_code/ncurses/include LDFLAGS=-L/home/dongdong/linux/linux/ncurses_code/ncurses/lib -enable-cfg-dir=/etc/minicom

5.配置成功以后执行如下命令编译并安装

复制代码
make
make install

缺少依赖,待解决!!!

6.将 minicom 目录中 bin 子目录下的所有文件拷贝到开发板根目录中的/usr/bin 目录下

复制代码
sudo cp bin/* /home/zuozhongkai/linux/nfs/rootfs/usr/bin/

完成以后在开发板中输入"minicom -v"来查看 minicom 工作是否正常,输入如下命令打开 minicom 配置界面:minicom -s

如果结果是打不开,新建/etc/passwd 文件,然后在 passwd 文件里面输入如下所示内容:

复制代码
root:x:0:0:root:/root:/bin/sh

完成以后重启开发板!

minicom工具使用

相关推荐
不脱发的程序猿25 分钟前
GD32串口数据收进内存之后DMA如何处理?
单片机·嵌入式硬件·dma·嵌入式·串口通信·gd32
且从容.2 小时前
ubuntu安装flink
linux·ubuntu·flink
爱和冰阔落4 小时前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
程序员沉梦听雨4 小时前
WSL2的安装与使用
linux·wsl
微小的鱼4 小时前
Linux的渲染与显示系统链路
android·java·linux
lisanmengmeng5 小时前
alertmanger 标签 rules 打上分组标签
linux·运维·服务器
Android系统攻城狮5 小时前
Linux FFmpeg深度解析之av_write_frame调用流程与实战(三十三)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频
Linux-lucky17 小时前
45-Linux学习之旅之防火墙与WEB加固
linux·前端·网络·学习·ubuntu
禁默17 小时前
启元 Q1 二次开发实践:Ubuntu 部署与仿真验证,从 PrimeConsole 到 ROS 2 Humble + RViz
linux·运维·ubuntu
skywalk816318 小时前
把 去也网站 从 Ubuntu 搬到 FreeBSD:一次 Service Jail + nginx 的部署实录
linux·运维·nginx·ubuntu·freebsd