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.mzph.cn/news/65059.shtml

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

相关文章

抖音视频删了怎么在电脑上找回来

【昨天整理电脑文件时&#xff0c;不小心将剪辑好的抖音作品误删了&#xff0c;但是回收站中找不回来了&#xff0c;这些视频是我花了很多心血制作的&#xff0c;如果没了真的十分可惜&#xff01;希望大家能帮帮我&#xff0c;告诉我应该如何恢复这些文件。】 现在人们都喜欢…

重装Windows10系统

以前清理电脑我一般是重置电脑的&#xff0c;但是重置电脑会清理C盘&#xff0c;新系统又遗留有以前的系统文件&#xff0c;导致后面配置环境遇到了棘手的问题&#xff0c;所以我打算重装系统。 第一次重装windows10系统&#xff0c;踩了很多坑&#xff0c;搞了两天才配回原来的…

【Rust】002-基础语法:函数

【Rust】002-基础语法&#xff1a;函数 文章目录 【Rust】002-基础语法&#xff1a;函数一、概述二、函数1、基本函数2、参数3、即时补充&#xff1a;函数参数是 String 和 &str 的区别String&str对比 4、返回值语句和表达式语句块示例返回值 一、概述 在 Rust 中&…

网络编程

1. 网络编程入门 1.1 网络编程概述 计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统&#xff0c;网络管理软件及网络通信协议的管理和协调下&#xff0c;实现资源共享和信息传递的计算机系统…

(七)k8s实战-高级调度

一、CronJob 定时任务 1、cron 表达式 # ┌───────────── 分钟 (0 - 59) # │ ┌───────────── 小时 (0 - 23) # │ │ ┌───────────── 月的某天 (1 - 31) # │ │ │ ┌───────────── 月份 (1 - 12) # │ │ │ │ ┌…

ChatGPT AIGC 完成二八分析柏拉图的制作案例

我们先让ChatGPT来总结一下二八分析柏拉图的好处与优点 同样ChatGPT 也可以帮我们来实现柏拉图的制作。 效果如下: 这样的按年份进行选择的柏拉图使用前端可视化的技术就可以实现。 如HTML,JS,Echarts等,但是代码可以让ChatGPT来做,生成。 在ChatGPT中给它一个Prompt …

html5——前端笔记

html 一、html51.1、理解html结构1.2、h1 - h6 (标题标签)1.3、p (段落和换行标签)1.4、br 换行标签1.5、文本格式化1.6、div 和 span 标签1.7、img 图像标签1.8、a 超链接标签1.9、table表格标签1.9.1、表格标签1.9.2、表格结构标签1.9.3、合并单元格 1.10、列表1.10.1、ul无序…

Zookeeper 脑裂问题

什么是脑裂&#xff1f; 脑裂(split-brain)就是“大脑分裂”&#xff0c;也就是本来一个“大脑”被拆分了两个或多个“大脑”&#xff0c;如果一个人有多个大脑&#xff0c;并且相互独立的话&#xff0c;那么会导致人体“手舞足蹈”&#xff0c;“不听使唤”。 脑裂通常会出现…

Java虚拟机(JVM)框架

见&#xff1a;GitHub - eHackyd/Java_JVM: Java虚拟机(JVM)框架的学习笔记

Android studio实现水平进度条

原文 ProgressBar 用于显示某个耗时操作完成的百分比的组件称为进度条。ProgressBar默认产生圆形进度条。 实现效果图&#xff1a; MainActivity import android.os.Bundle; import android.view.View; import android.app.Activity; import android.widget.Button; import…

Python:多变量赋值

相关文章 Python专栏https://blog.csdn.net/weixin_45791458/category_12403403.html?spm1001.2014.3001.5482 Python中的赋值语句可以同时对多个变量进行对象绑定&#xff08;赋值&#xff09;&#xff0c;既可以是多变量链式赋值&#xff0c;也可以是多变量平行赋值&#x…

部署Spring Boot项目

上传jar包 之前在新建Spring Boot项目[1]使用mvn install的方式&#xff0c;已经构建出jar包。 通过scp或rz/sz&#xff0c;将该jar包上传到服务器 执行java -jar hello-0.0.1-SNAPSHOT.jar,发生如下报错&#xff1a; Exception in thread "main" java.lang.Unsuppo…

KubeAdmin方式搭建K8S(1.26.0)

本次安装K8S版本为1.26.0 服务器环境配置 ip描述配置192.168.233.221master节点CPU&#xff08;2C&#xff09; 内存&#xff08;2G&#xff09; 硬盘&#xff08;50G&#xff09;192.168.233.222node1节点CPU&#xff08;2C&#xff09; 内存&#xff08;2G&#xff09; 硬盘…

(笔记五)利用opencv进行图像几何转换

参考网站&#xff1a;https://docs.opencv.org/4.1.1/da/d6e/tutorial_py_geometric_transformations.html &#xff08;1&#xff09;读取原始图像和标记图像 import cv2 as cv import numpy as np from matplotlib import pyplot as pltpath r"D:\data\flower.jpg&qu…

Redis-监听过期key-JAVA实现方案

一、创建监听配置类 RedisListenerConfig。 import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.d…

图文详解PhPStudy安装教程

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 官方下载 请在PhPStudy官方网站下载安装文件&#xff0c;官方链接如下&#xff1a;https://m.xp.cn/linux.html&#xff1b;图示如下&#xff1a; 请下载PhPStudy安装文件…

QML与C++的交互操作

QML旨在通过C 代码轻松扩展。Qt QML模块中的类使QML对象能够从C 加载和操作&#xff0c;QML引擎与Qt元对象系统集成的本质使得C 功能可以直接从QML调用。这允许开发混合应用程序&#xff0c;这些应用程序是通过混合使用QML&#xff0c;JavaScript和C 代码实现的。除了从QML访问…

OpenCV(十五):拷贝图像

在OpenCV中&#xff0c;拷贝图像数据时有两种方式&#xff1a;深拷贝&#xff08;Deep Copy&#xff09;和浅拷贝&#xff08;Shallow Copy&#xff09;。这两种拷贝方式的主要区别在于是否创建新的图像副本。 浅拷贝&#xff08;Shallow Copy&#xff09;是指将图像对象的指针…

Python中的计数器Counter

计数器counter是包含在collections模块中的容器。 什么是容器Container&#xff1f; 容器是容纳对象的对象。它们提供了一种访问所包含对象并对其进行迭代的方法。内置容器的例子有元组、列表和字典。其他内容包含在“collections”模块中。 Counter是dict的子类。因此&#…

WebGIS的一些学习笔记

一、简述计算机网络的Internet 概念、网络类型分类、基本特征和功用是什么 计算机网络的Internet 概念 计算机网络是地理上分散的多台独立自主的计算机遵循约定的通讯协议&#xff0c;通过软、硬件互连以实现交互通信、资源共享、信息交换、协同工作以及在线处理等功能的系统…