Linux中裸机串口通信的基本方法

本文涉及的产品
数据传输服务 DTS,同步至DuckDB 3个月
简介: Linux中裸机串口通信的基本方法

第一:串口的基本简介

     串口又叫做串行接口,通常叫做COM接口,串行接口指的是数据一个一个的顺序传输,通信线路简单。使用两条线即可实现双向通信,一条用于发送,一条用于接收。

      UART作为串口的一种,其工作原理也是将数据一位一位的进行传输,发送和接收各用一 条线,因此通过 UART 接口与外界相连最少只需要三条线:TXD(发送)、RXD(接收)和 GND(地 线)。

各个为含义如下:

      空闲位:数据线在空闲状态的时候为逻辑“1”状态,也就是高电平,表示没有数据线空闲, 没有数据传输。

      起始位:当要传输数据的时候先传输一个逻辑“0”,也就是将数据线拉低,表示开始数据 传输。

      数据位:数据位就是实际要传输的数据,数据位数可选择 5~8 位,我们一般都是按照字节 传输数据的,一个字节 8 位,因此数据位通常是 8 位的。低位在前,先传输,高位最后传输。

       奇偶校验位:这是对数据中“1”的位数进行奇偶校验用的,可以不使用奇偶校验功能。停止位:数据传输完成标志位,停止位的位数可以选择 1 位、1.5 位或 2 位高电平,一般都 选择 1 位停止位。

        波特率:波特率就是 UART 数据传输的速率,也就是每秒传输的数据位数,一般选择 9600、 19200、115200 等。

第二:UART的特点

      ①、兼容 TIA/EIA-232F 标准,速度最高可到 5Mbit/S。

      ②、支持串行 IR 接口,兼容 IrDA,最高可到 115.2Kbit/s。

      ③、支持 9 位或者多节点模式(RS-485)。

      ④、1 或 2 位停止位。

      ⑤、可编程的奇偶校验(奇校验和偶校验)。

      ⑥、自动波特率检测(最高支持 115.2Kbit/S)。

      接下来看一下UART几个重要的寄存器,第一个就是 UART 的控制寄存器 1,即 UARTx_UCR1(x=1~8)。

      第二个寄存器UARTx_UFCR、UARTx_UBIR和UARTx_UBMR,寄存器UARTx_UFCR中要用的是位RFDIV(bit9:7),用来设置参考

   通过这三个寄存器可以设置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,根据上面的

公式可以得到:

第三:UART的配置步骤    

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 的数据收发操作。

第四:代码基本实现

   先实现串口的头文件的基写法:

#ifndef _BSP_UART_H#define _BSP_UART_H//函数声明void uart_init(void);void uart_to_init(void);void uart_disable(UART_Type *base);void uart_enable((UART_Type *base);#endif

     函数声明中,继续编写对应的源文件内容:

#include "uart.h"//初始化串口1,波特率为115200void uart_init(void){    //初始化串口IO    uart_io_init();  /* 2、初始化 UART1 */ uart_disable(UART1); /* 先关闭 UART1 */ uart_softreset(UART1); /* 软件复位 UART1 */  UART1->UCR1 = 0; /* 先清除 UCR1 寄存器 */ UART1->UCR1 &= ~(1<<14); /* 关闭自动波特率检测 *//* * 设置 UART 的 UCR2 寄存器,设置字长,停止位,校验模式,关闭硬件流控 * bit14: 1 忽略 RTS 引脚 * bit8: 0 关闭奇偶校验 * bit6: 0 1 位停止位 * bit5: 1 8 位数据位 * bit2: 1 打开发送 * bit1: 1 打开接收 */ UART1->UCR2 |= (1<<14) | (1<<5) | (1<<2) | (1<<1); UART1->UCR3 |= 1<<2; /* UCR3 的 bit2 必须为 1 */  /* * 设置波特率 * 波特率计算公式:Baud Rate = Ref Freq / (16 * (UBMR + 1)/(UBIR+1))  * 如果要设置波特率为 115200,那么可以使用如下参数: * Ref Freq = 80M 也就是寄存器 UFCR 的 bit9:7=101, 表示 1 分频 * UBMR = 3124 * UBIR = 71 * 因此波特率= 80000000/(16 * (3124+1)/(71+1)) * = 80000000/(16 * 3125/72)  * = (80000000*72) / (16*3125)  * = 115200 */ UART1->UFCR = 5<<7; /* ref freq 等于 ipg_clk/1=80Mhz */ UART1->UBIR = 71; UART1->UBMR = 3124;  #if 0 uart_setbaudrate(UART1, 115200, 80000000); /* 设置波特率 */ #endif uart_enable(UART1); /* 使能串口 */}

总结:实现串口的基本功能,对后面利用串口来调试程序,具有重要的实践意义。

相关实践学习
自建数据库迁移到云数据库
本场景将引导您将网站的自建数据库平滑迁移至云数据库RDS。通过使用RDS,您可以获得稳定、可靠和安全的企业级数据库服务,可以更加专注于发展核心业务,无需过多担心数据库的管理和维护。
Sqoop 企业级大数据迁移方案实战
Sqoop是一个用于在Hadoop和关系数据库服务器之间传输数据的工具。它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。 本课程主要讲解了Sqoop的设计思想及原理、部署安装及配置、详细具体的使用方法技巧与实操案例、企业级任务管理等。结合日常工作实践,培养解决实际问题的能力。本课程由黑马程序员提供。
目录
相关文章
|
9月前
|
Ubuntu 物联网 Linux
从零安装一个Linux操作系统几种方法,以Ubuntu18.04为例
一切就绪后,我们就可以安装操作系统了。当系统通过优盘引导起来之后,我们就可以看到跟虚拟机中一样的安装向导了。之后,大家按照虚拟机中的顺序安装即可。 好了,今天主要介绍了Ubuntu Server版操作系统的安装过程,关于如何使用该操作系统,及操作系统更深层的原理,还请关注本号及相关圈子。
|
9月前
|
缓存 监控 Linux
Linux系统清理缓存(buff/cache)的有效方法。
总结而言,在大多数情形下你不必担心Linux中buffer与cache占用过多内存在影响到其他程序运行;因为当程序请求更多内存在没有足够可用资源时,Linux会自行调整其占有量。只有当你明确知道当前环境与需求并希望立即回收这部分资源给即将运行重负载任务之前才考虑上述方法去主动干预。
2284 10
|
9月前
|
Ubuntu Linux 图形学
推广与体验Ubuntu Linux的便捷方法
如果你的朋友或家人对尝试Linux感兴趣,但希望在安装之前先体验一下,你可以分享以下链接给他们:Ubuntu在线导览。通过这个链接,他们可以在任何地方轻松体验Ubuntu,无需安装即可深入了解这个流行的操作系统。
|
9月前
|
XML 缓存 Linux
在Linux环境下解决Visual Studio Code字体显示异常和字体替换方法。
解决Linux下VS Code字体显示异常,需要对Linux字体渲染机制有所理解,并对VS Code的配置选项进行合理设置。替换字体时则要通过系统字体配置或VS Code设置来完成。通过上述方法,可以有效地解决字体显示问题,从而提升代码编辑的视觉体验。
1312 0
|
8月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
877 1
二、Linux文本处理与文件操作核心命令
|
8月前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
496 137
|
8月前
|
安全 Ubuntu Unix
一、初识 Linux 与基本命令
玩转Linux命令行,就像探索一座新城市。首先要熟悉它的“地图”,也就是/根目录下/etc(放配置)、/home(住家)这些核心区域。然后掌握几个“生存口令”:用ls看周围,cd去别处,mkdir建新房,cp/mv搬东西,再用cat或tail看文件内容。最后,别忘了随时按Tab键,它能帮你自动补全命令和路径,是提高效率的第一神器。
1353 58
|
11月前
|
JSON 自然语言处理 Linux
linux命令—tree
tree是一款强大的Linux命令行工具,用于以树状结构递归展示目录和文件,直观呈现层级关系。支持多种功能,如过滤、排序、权限显示及格式化输出等。安装方法因系统而异常用场景包括:基础用法(显示当前或指定目录结构)、核心参数应用(如层级控制-L、隐藏文件显示-a、完整路径输出-f)以及进阶操作(如磁盘空间分析--du、结合grep过滤内容、生成JSON格式列表-J等)。此外,还可生成网站目录结构图并导出为HTML文件。注意事项:使用Tab键补全路径避免错误;超大目录建议限制遍历层数;脚本中推荐禁用统计信息以优化性能。更多详情可查阅手册mantree。
931 143
linux命令—tree
|
7月前
|
存储 安全 Linux
Linux卡在emergency mode怎么办?xfs_repair 命令轻松解决
Linux虚拟机遇紧急模式?别慌!多因磁盘挂载失败。本文教你通过日志定位问题,用`xfs_repair`等工具修复文件系统,三步快速恢复。掌握查日志、修磁盘、验重启,轻松应对紧急模式,保障系统稳定运行。
1214 2
|
8月前
|
Unix Linux 程序员
Linux文本搜索工具grep命令使用指南
以上就是对Linux环境下强大工具 `grep` 的基础到进阶功能介绍。它不仅能够执行简单文字查询任务还能够处理复杂文字处理任务,并且支持强大而灵活地正则表达规范来增加查询精度与效率。无论您是程序员、数据分析师还是系统管理员,在日常工作中熟练运用该命令都将极大提升您处理和分析数据效率。
643 16