《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 数据收发函数
- 板子硬件原理
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值
- 添加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工具使用