14. UART串口通信

14. UART串口通信

  • 1. UART
    • 1.1 UART 通信格式
    • 1.2 UART 电平标准
    • 1.3 I.MX6U UART 简介
      • 1.3.1 控制寄存器1 UARTx_UCR1(x=1~8)
      • 1.3.2 控制寄存器2 UARTx_UCR2
      • 1.3.3 控制寄存器3 UARTx_UCR3
      • 1.3.4 状态寄存器2 UARTx_USR2
      • 1.3.4 UARTx_UFCR 、 UARTx_UBIR 和 UARTx_UBMR
      • 1.3.5 UARTx_URXD 和 UARTx_UTXD
    • 1.4 代码实例
    • 1.5 编译下载
  • 2. 串口格式化函数
    • 2.1 代码实例
    • 2.2 编译下载

1. UART

1.1 UART 通信格式

串口通常也叫 COM 接口,串行接口指的是数据一个一个的顺序传输,通信线路简单。使用两条线就可以实现双向通信,一条用于发送,一条用于接口。UART 是异步串行收发器,与外界相连最少需要三条线:TXD发送、RXD接收和 GND地线。在这里插入图片描述
空闲位: 数据线在空闲状态的时候为逻辑1状态,也就是高电平,表示没有数据线空闲,没有数据传输。
起始位: 当要传输数据的时候先传输一个逻辑0,也就是将数据线拉低,表示开始数据传输
数据位: 数据位就是实际要传输的数据,可选择 5 ~ 8 位,一般都是按照字节传输数据的,一个字节 8 位,因此数据位通常是 8 位的,低位在前,先传输,高位最后传输。
奇偶检验位: 这是对数据中 1 的位数进行奇偶检验用的,可以不使用该功能
停止位: 数据传输完成标志位,停止位的位数可以选择 1、1.5 或 2 位高电平,一般都选择 1 位停止位
波特率: 就是 UART 数据传输的速率,也就是每秒传输的数据位数,一般选择 9600、19200、115200 等

1.2 UART 电平标准

UART 一般的接口电平有 TTL 和 RS-232。TTL 电平低电平表示逻辑 0,高电平表示逻辑 1;RS-232 采用差分线,-3 ~ -15 表示逻辑 1,3 ~ 15 表示逻辑 0.
在这里插入图片描述
上图所示就是 TTL 电平接口,下图是 RS-232电平接口
在这里插入图片描述
但是现在笔记本几乎没有这种接口,就有了usb转TTL芯片

1.3 I.MX6U UART 简介

一共有 8 个UART,主要特性如下:

  1. 兼容 TIA/EIA-232F标准,速度最高可达 5Mbit/s
  2. 支持串行 IR 接口,兼容 IrDA,最高可达115.2Kbit/s
  3. 支持 9 位或者多节点模式
  4. 1 或 2 位停止位
  5. 可编程的奇偶检验
  6. 自动波特率检查,最高支持 115.2 Kbit/s
    这里只用到最基本的串口功能。UART 的时钟源是由寄存器 CCM_CSCDR1 的 UART_CLK_SEL 位来选择的,当为 0 的时候 UART 的时钟源为 pll3_80m(80MHz),如果为 1 的时候 UART 的时钟源为 osc_clk(24M),一般选择 pll3_80m。寄存器 CCM_CSCDR1 的 UART_CLK_PODF 位是 UART 的时钟分频值,可设置 0 ~ 63,分别对应 1 ~ 64 分频,一般设置 1 分频,因此最终进入 UART 的时钟源是 80 MHz

1.3.1 控制寄存器1 UARTx_UCR1(x=1~8)

在这里插入图片描述
ADBR(bit14): 自动波特率检测使能位,为 0 的时候关闭自动波特率检测,为 1 的时候使能波特率检测
UARTEN(bit0): UART 使能位,为 0 的时候关闭 UART,为 1 的时候使能

1.3.2 控制寄存器2 UARTx_UCR2

在这里插入图片描述
IRTS(bit14): 为 0 的时候使用 RTS 引脚功能,为 1 的时候忽略 RTS 引脚
PREN(bit8): 奇偶校验使能位,为 0 的时候关闭奇偶检验,为 1 的时候使能
PROE(bit7): 奇偶检验模式选择位,开启奇偶检验以后此位如果为 0 就是用偶校验,为 1 就是用基校验
STOP(bit6): 停止位数量,为 0 的话 1 位停止位,为 1 的话 2 位停止位
WS(bit5): 数据位长度,为 0 的时候选择 7 位数据位,为 1 的时候选择 8 位数据位
TXEN(bit2): 发送使能位,0 关闭发送功能,1 打开发送功能
RXEN(bit1): 接收使能位,0 关闭接收功能,1 打开接收功能
SRST(bit0): 软件复位,0 的时候软件复位 UART,为 1 的时候表示复位完成,复位完成后此位会自动置 1,表示复位完成。此位只能写0,写1会被忽略

1.3.3 控制寄存器3 UARTx_UCR3

在这里插入图片描述
这里只用到了 RXDMUXSEL(bit2),这个位应该始终为1

1.3.4 状态寄存器2 UARTx_USR2

在这里插入图片描述
TXDC(bit3): 发送完成标志位,为 1 的时候表明发送缓冲(TxFIFO) 和移位寄存器为空,也就是发送完成,向 TxFIFO 写入数据此位就会自动清零
RDR(bit0): 数据接收标志位,为 1 的时候表明至少接收到一个数据,从寄存器 UARTx_URXD 读取接收到的数据以后此位会自动清零

1.3.4 UARTx_UFCR 、 UARTx_UBIR 和 UARTx_UBMR

UARTx_UFCR 用到的位是 RFDIV(bit9:7),用来设置参考时钟分频
在这里插入图片描述
通过这三个寄存器可设置波特率,公式如下:
在这里插入图片描述
Ref Freq:经过分频以后进入 UART 的最终时钟频率
UBMR:寄存器UBMR中的值
UBIR:寄存器UBIR中的值
如果要设置115200,那么设置 RFDIV 为 1 分频,Ref Freq=80MHz,UBIR=71,UBMX=3124

1.3.5 UARTx_URXD 和 UARTx_UTXD

这两个是接收和发送数据寄存器,低八位为接收到的和要发送的数据。

1.4 代码实例

bsp_uart.h

#pragma once
#include "imx6ul.h"void uart_init();
void uart_io_init();
void uart_disable(UART_Type *base);
void uart_enable(UART_Type *base);
void uart_softreset(UART_Type *base);
void uart_setbaudrate(UART_Type *base, unsigned int baudrate, unsigned int srcclock_hz);
void putc(unsigned char c);
void puts(char *str);
unsigned char getc();
void raise(int sig_nr);

bsp_uart.c

#include "bsp_uart.h"// 初始化串口1,波特率为115200
void uart_init()
{// 初始化串口 IOuart_io_init();// 初始化 UART1uart_disable(UART1);		// 先关闭UART1uart_softreset(UART1);		// 软件复位UART1UART1->UCR1=0;				// 先清除 UCR1 寄存器UART1->UCR1 &= ~(1<<14);	// 关闭自动波特率检测// 设置 UCR2 寄存器,忽略RTS引脚,关闭奇偶检验,设置1位停止位,8位数据位,打开发送和接收UART1->UCR2 |= (1<<14) | (1<<5) | (1<<2) | (1<<1);UART1->UCR3 |= 1<<2;// 设置波特率UART1->UFCR = 5<<7;UART1->UBIR = 71;UART->UBMR = 3124;// 使能串口uart_enable(UART1);
}// 初始化串口1所使用的引脚
void uart_io_init()
{IOMUXC_SetPinMUX(IOMUXC_UART1_TX_DATA_UART1_TX, 0);IOMUXC_SetPinMUX(IOMUXC_UART1_RX_DATA_UART1_RX, 0);IOMUXC_SetPinConfig(IOMUXC_UART1_TX_DATA_UART1_TX, 0x10B0);IOMUXC_SetPinConfig(IOMUXC_UART1_RX_DATA_UART1_RX, 0x10B0);
}// 关闭指定的UART
void uart_disable(UART_Type *base)
{base->UCR1 &= ~(1<<0);
}	// 打开指定的UART
void uart_enable(UART_Type *base)
{base->UCR1 |= (1<<0);	
}// 复位指定的UART
void uart_softreset(UART_Type *base)
{base->UCR2 &= ~(1<<0);				// 复位while((base->UCR2 & 0x1) == 0);		// 等待复位完成,复位完成后此位自动置1
}// 设置波特率,由官方 SDK 包移植过来
void uart_setbaudrate(UART_Type *base, unsigned int baudrate, unsigned int srcclock_hz);// 发送一个字符
void putc(unsigned char c)
{while(((UART1->USR2 >>3) &0x01)==0);	// 等待上一次发送完成,发送完成会清零UART1->UTXD = c & 0xFF;					
}// 发送一个字符串
void puts(char *str)
{char *p = str;while(*p){putc(*p++);}
}// 接收一个字符
unsigned char getc()
{while((UART1->USR2 & 0x1)==0);	// 等待接收完成return UART1->URXD;
}// 防止编译器报错
void raise(int sig_nr)
{}

main.c

#include "bsp_clk.h"
#include "bsp_delay.h"
#include "bsp_led.h"
#include "bsp_beep.h"
#include "bsp_key.h"
#include "bsp_int.h"
#include "bsp_uart.h"int main()
{unsigned char a = 0;unsigned char state = OFF;int_init();imx6u_clkinit();delay_init();clk_enable();led_init();beep_init();uart_init();while(1){puts("请输入一个字符:");a=getc();putc(a);	// 数据回显,就是将输入的数据显示出来,如果没有这一行,效果就像linux系统中输入密码什么都不显示一样puts("\r\n");puts("输入的字符为:");putc(a);puts("\r\n\r\n");state = !state;led_switch(LED0, state);}return 0;
}

1.5 编译下载

在通用makefile文件中,将 TARGET 修改为 uart,在 INCDIRS 和 SRCDIRS 中加入 bsp/uart。在设置波特率函数中使用到了除法运算,链接的时候需要将编译器的数学库也链接进来,并且使用 -L来指定库所在的目录。

LIBPATH := -lgcc -L /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/lib/gcc/arm-linux-gnueabihf/4.9.4

-fno-builtin表示不使用内建函数,也就可以自己实现该函数,否则会发生冲突

$(SOBJS) : obj/%.o : %.S$(CC) -Wall -nostdlib -fno-builtin -c -O2 $(INCLUDE) -o $@ $<
$(COBJS) : obj/%.o : %.c$(CC) -Wall -nostdlib -fno-builtin -c -O2 $(INCLUDE) -o $@ $<

2. 串口格式化函数

2.1 代码实例

其余函数基本不变,多添加一个stdio.h头文件

int main()
{int a, b;unsigned char state = OFF;int_init();imx6u_clkinit();delay_init();clk_enable();led_init();beep_init();uart_init();while(1){printf("请输入两个整数:");scanf("%d%d, &a, &b);printf("\r\n数据%d + %d = %d\r\n\r\n",a,b,a+b);state = !state;led_switch(LED0, state);}return 0;
}

2.2 编译下载

修改 TARGET,在 INCDIRS 中添加stdio/include,在 SRCDIRS 中添加 stdio/lib。编译C文件时需要添加选项

$(COBJS) : obj/%.o : %.c$(CC) -Wall -Wa,-mimplicit-it=thumb -nostdlib -fno-builtin -c -O2

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

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

相关文章

P2 C++变量

前言 一 C变量的作用 本期我们来讨论一下c 中的变量。 在一个 C 程序中&#xff0c;大部分内容实际上都是在使用数据。我们操作任何类型的数据&#xff0c;如包括我们想要改变、想要修改&#xff0c; 想要读和写数据。我们都需要把数据存储进叫做变量的东西里面。变量允许我们…

Activiti,Apache camel,Netflex conductor对比,业务选型

Activiti,Apache camel,Netflex conductor对比&#xff0c;业务选型 1.activiti是审批流&#xff0c;主要应用于人->系统交互&#xff0c;典型应用场景&#xff1a;请假&#xff0c;离职等审批 详情可见【精选】activti实际使用_activiti通过事件监听器实现的优势_记录点滴…

【开发流程】持续集成、持续交付、持续部署

一、开发工作流程 假设把开发流程分为以下几个阶段&#xff1a; 编码 -> 构建 -> 集成 -> 测试 -> 交付 -> 部署 如上图所示&#xff0c;持续集成、持续交付、持续部署有着不同的软件自动交付周期。 二、持续集成、持续交付、持续部署 1、持续集成 持续集成…

mysql 查询

-- 多表查询select * from tb_dept,tb_emp; 内来链接 -- 内连接 -- A 查询员工的姓名 &#xff0c; 及所属的部门名称 &#xff08;隐式内连接实现&#xff09;select tb_emp.name,tb_dept.name from tb_emp,tb_dept where tb_emp.idtb_emp.id;-- 推荐使用select a.name,b.n…

SSL加密

小王学习录 今日摘录前言HTTP + SSL = HTTPSSSL加密1. 对称加密2. 非对称加密 + 对称加密3. 证书今日摘录 但愿四海无尘沙,有人卖酒仍卖花。 前言 SSL表示安全套接层,是一个用于保护计算机网络中数据传输安全的协议。SSL通过加密来防止第三方恶意截取并篡改数据。在实际应用…

GaussDB新特性Ustore存储引擎介绍

1、 Ustore和Astore存储引擎介绍 Ustore存储引擎&#xff0c;又名In-place Update存储引擎&#xff08;原地更新&#xff09;&#xff0c;是openGauss 内核新增的一种存储模式。此前的版本使用的行存储引擎是Append Update&#xff08;追加更新&#xff09;模式。相比于Append…

泉盛UV-K5/K6全功能中文固件

https://github.com/wu58430/uv-k5-firmware-chinese/releases 主要功能&#xff1a; 中文菜单 许多来自 OneOfEleven 的模块&#xff1a; AM 修复&#xff0c;显著提高接收质量长按按钮执行 F 操作的功能复制快速扫描菜单中的频道名称编辑频道名称 频率显示选项扫描列表分配…

Java入门篇 之 内部类

本篇碎碎念&#xff1a;本篇没有碎碎念&#xff0c;想分享一段话&#xff1a; 你不笨&#xff0c;你只是需要时间&#xff0c;耐心就是智慧&#xff0c;不见得快就好&#xff0c;如果方向都不对&#xff0c;如果心术不正&#xff0c;如果德不配位&#xff0c;快就是对自己天分的…

easyExcel注解详情

前言11个注解字段注解 类注解基础综合示例补充颜色总结 11个注解 ExcelProperty ColumnWith 列宽 ContentFontStyle 文本字体样式 ContentLoopMerge 文本合并 ContentRowHeight 文本行高度 ContentStyle 文本样式 HeadFontStyle 标题字体样式 HeadRowHeight 标题高度 HeadStyle…

8Base集团通过SmokeLoader部署新的Phobos勒索软件变种

最近&#xff0c;8Base集团的威胁行为者通过Phobos勒索软件的变种展开了一系列金融动机的攻击。这一发现来自于思科Talos的研究结果&#xff0c;他们记录了网络犯罪分子活动的增加。 安全研究员Guilherme Venere在周五发表的详尽的两部分分析中表示&#xff1a;“该组织的大多…

excel导入 Easy Excel

依旧是框架感觉有东西&#xff0c;但是确实是模拟不出来&#xff0c;各种零零散散的件太多了 controller层 ApiOperation(value "导入Excel", notes "导入Excel", httpMethod "POST", response ExcelResponseDTO.class)ApiImplicitParams({…

如何有效的禁止Google Chrome自动更新?

禁止Chrome自动更新 1、背景2、操作步骤 1、背景 众所周知&#xff0c;当我们在使用Selenium进行Web自动化操作&#xff08;如爬虫&#xff09;时&#xff0c;一般会用到ChromeDriver。然而Driver的更新速度明显跟不上Chrome的自动更新。导致我们在使用Selenium进行一些操作时就…

华为ac+fit无线2层漫游配置案例

ap的管理dhcp在ac上&#xff0c;业务dhcp在汇聚交换机上、并且带2层漫游 R1: interface GigabitEthernet0/0/0 ip address 11.1.1.1 255.255.255.0 ip route-static 12.2.2.0 255.255.255.0 11.1.1.2 ip route-static 192.168.0.0 255.255.0.0 11.1.1.2 lsw1: vlan batch 100…

鸿蒙系统扫盲(二):再谈鸿蒙是不是安卓套壳?

最近小米发布了澎湃OS&#xff0c;vivo发布了蓝OS&#xff0c;好像自从华为回归后&#xff0c;大伙都开始写自己的OS了&#xff0c;小米官方承认是套壳安卓&#xff0c;然后被大家喷了&#xff0c;于是鸿蒙是不是安卓套壳的话题又回到了大众的视野&#xff0c;今天在讨论下这个…

React函数组件状态Hook—useState《进阶-对象数组》

React函数组件状态-state 对象 state state 中可以保存任意类型的 JavaScript 值&#xff0c;包括对象。但是&#xff0c;你不应该直接修改存放在 React state 中的对象。相反&#xff0c;当你想要更新⼀个对象时&#xff0c;你需要创建⼀个新的对象&#xff08;或者将其拷⻉⼀…

VS+Qt+C++ Yolov8物体识别窗体程序onnx模型

程序示例精选 VSQtC Yolov8物体识别窗体程序onnx模型 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《VSQtC Yolov8物体识别窗体程序onnx模型》编写代码&#xff0c;代码整洁&#xff0c;规…

Spring接入Metric+Graphite+Grafana搭建监控系统

环境搭建 Metric 主要是记录操作记录&#xff0c;把数据传给Graphite&#xff0c;这个只需要引入依赖就可以了 日志收集系统&#xff0c;可以支持很多的监控系统一般在Spring项目中用其收集数据&#xff0c;可以发送到Graphite等监控系统中一般使用Merter和Timer分别记录成功…

多目标应用:基于非支配排序的蜣螂优化算法NSDBO求解微电网多目标优化调度(MATLAB)

一、微网系统运行优化模型 微电网优化模型介绍&#xff1a; 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、基于非支配排序的蜣螂优化算法NSDBO 基于非支配排序的蜣螂优化算法NSDBO简介&#xff1a; https://blog.csdn.net/weixin46204734/article/details/128…

HTTPS流量抓包分析中出现无法加载key

HTTPS流量抓包分析(TLSv1.2)&#xff0c;这篇文章分析的比较透彻&#xff0c;就不班门弄斧了 https://zhuanlan.zhihu.com/p/635420027 写个小问题&#xff1a;RSA密钥对话框加载rsa key文件的时候注意不要在中文目录下&#xff0c;否则会提示&#xff1a;“Enter the passwor…

IDEA自动注解设置(中文版)

IDEA自动注解设置 1、添加类自动注释 文件 - 设置 - 编辑器 - 文件和代码模板 - Include - File Header /** *description&#xff1a;TODO *author&#xff1a; ${USER} *create&#xff1a; ${DATE} ${TIME} */2、添加类方法自动注释 文件 - 设置 - 编辑器 - 实时模版 - …