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_URXDUARTx_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_DATAIOMUXC_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工具使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/95129.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据课程K13——Spark的距离度量相似度度量

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 掌握Spark的距离度量和相似度度量; ⚪ 掌握Spark的欧氏距离; ⚪ 掌握Spark的曼哈顿距离; ⚪ 掌握Spark的切比雪夫距离; ⚪ 掌握Spark的最小二乘法; 一、距离度量和相似度度量 1. …

【大数据】Flink 详解(六):源码篇 Ⅰ

Flink 详解&#xff08;六&#xff09;&#xff1a;源码篇 Ⅰ 55、Flink 作业的提交流程&#xff1f;56、Flink 作业提交分为几种方式&#xff1f;57、Flink JobGraph 是在什么时候生成的&#xff1f;58、那在 JobGraph 提交集群之前都经历哪些过程&#xff1f;59、看你提到 Pi…

某人事系统架构搭建设计记录

首发博客地址 https://blog.zysicyj.top/ 先大致列一下基础情况 架构必须是微服务 场景上涉及大量查询操作&#xff0c;分析操作 存在临时大量写入的场景 并发并不高 对高可用要求较高&#xff0c;不能挂掉 对安全要求高 要能过等保测试等三方测试 使用人数并不多&#xff0c;十…

手撕二叉平衡树

今天给大家带来的是平衡树的代码实现&#xff0c;如下&#xff1a; #pragma once #include <iostream> #include <map> #include <set> #include <assert.h> #include <math.h> using namespace std; namespace cc {template<class K, clas…

【kubernetes】使用KubeSphere devops部署我的微服务系统

KubeSphere Devops 入门使用KubeSphere的Devops功能部署"我的微服务系统" &#xff08;内容学习于尚硅谷云原生课程&#xff09; kubesphere devops官方文档&#xff1a; https://v3-1.docs.kubesphere.io/zh/docs/devops-user-guide/how-to-use/create-a-pipeline-u…

Ubuntu20.04下安装google输入法

Ubuntu20.04下安装google输入法 1、添加中文语言支持 打开 系统设置——区域和语言——管理已安装的语言——在“语言”tab下——点击“添加或删除语言” 弹出“已安装语言”窗口&#xff0c;勾选中文&#xff08;简体&#xff09;&#xff0c;点击应用 回到“语言支持”窗…

c语言每日一练(13)

前言&#xff1a;每日一练系列&#xff0c;每一期都包含5道选择题&#xff0c;2道编程题&#xff0c;博主会尽可能详细地进行讲解&#xff0c;令初学者也能听的清晰。每日一练系列会持续更新&#xff0c;上学期间将看学业情况更新。 五道选择题&#xff1a; 1、程序运行的结果…

Android AGP版本

做个记录&#xff1a; Android AGP版本 https://developer.android.com/studio/releases/gradle-plugin?hlzh-cn

ZMTP协议

ZoreMQ Transport Protocol是一个传输层协议&#xff0c;用于ZMQ的连接的信息交互&#xff0c;本文档描述的是3.0协议&#xff0c;主要分析基于NULL Security Mechanism 协议语法 ZMTP由三部分组成&#xff0c;分别是 greeting、handshake、traffic 部分描述构成greeting描述…

SpringBoot-学习笔记(基础)

文章目录 1. 概念1.1 SpringBoot快速入门1.2 SpringBoot和Spring对比1.3 pom文件坐标介绍1.4 引导类1.5 修改配置1.6 读取配置1.6.1 读取配置信息1.6.2 读取配置信息并创建类进行封装 1.7 整合第三方技术1.7.1 整合JUnit1.7.1 整合Mybatis1.7.1 整合Mybatis-Plus1.7.1 整合Drui…

什么是RTC

参考&#xff1a; https://zhuanlan.zhihu.com/p/377100294 RTC&#xff08;Real time communication&#xff09;实时通信&#xff0c;是实时音视频的一个简称&#xff0c;我们常说的RTC技术一般指的是WebRTC技术&#xff0c;已经被 W3C 和 IETF 发布为正式标准。由于几乎所…

Docker从认识到实践再到底层原理(二-3)|LXC容器

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…