UART实验

一、UART简介

UART

Universal Asynchronous Receiver Transmitter 即通用异步收发器,是一种通用的串行、异步通信总线该总线有两条数据线,可以实现全双工的发送和接收在嵌入式系统中常用于主机与辅助设备之间的通信

二、通信基础 - 并行和串行

并行通信

在这里插入图片描述
并行:多条数据线,

缺点:浪费很多资源,数据条数多,多条数据线之间传送数据时会有一些信号干扰
:char类型转换二进制八位二进制数,并行一次性可以用八根线传输这八位二进制

串行通信

在这里插入图片描述
串行:一条数据线,
:char类型转换二进制八位二进制数,串行只能一次传送一位二进制的数据

三、通信基础 - 单工和双工

单工通信

在这里插入图片描述

双工通信

在这里插入图片描述

四、通信基础 - 波特率

波特率

波特率用于描述UART通信时的通信速度,其单位为bps(bit per second)即每秒钟传送的bit的数量

五、UART帧格式

在这里插入图片描述
UART帧格式:
A->B串行发送数据时 如:0x55(01010101),
空闲位:空闲的时候必须是高电平 1
起始位:发送数据之前先发送一个低电平,用于空闲时期和发送数据之间的区分 0
数据位:5-8位(先发高位,后发低位)10101010
校验位:验证发送的数据(奇偶方式)
停止位:高电平
注意:一次最多发送一个字节(八位),发送多个字节必须发完一个字节之后停止,然后再发送下一个字节

  • 为什么串行发送数据最多八位呢?
  • 因为UART使用的是一种异步通信,发送和接收方使用的时钟不一样,发送的数据多了会产生误差,为了防止这种 误差,就把数据位控制在最多八位

六、UART硬件连接

硬件连接

在这里插入图片描述

七、UART控制器

UART控制器

一般情况下处理器中都会集成UART控制器 我们使用UART进行通信时候只需对其内部的相关寄存器进行设置即可
在这里插入图片描述

实验

UART实验: 通信的功能,比如,我的主控制器要和其他芯片或外围设备就会用到UART进行通信

通过UART寄存器实现4412电路板和电脑传输数据

第一步:

在电路板上面找到想要传输数据的串口的名字:CON7,在芯片电路板上找到相应的网络标号,控制着那个引脚

发送引脚网络标号:4 BUF_XuTXD2/UART_AUDIO_TXD
接收引脚网络标号:4 BUF_XuRXD2/UART_AUDIO_RXD

在这里插入图片描述

在这里插入图片描述
可以看到控制该引脚的寄存器是GPA1_0和GPA1_1这两个寄存器

第二步:

在这里插入图片描述
找到GPA1寄存器,通过GPA1CON设置这一组寄存器,GPA1CON[0]引脚设置 0x2 ,串口 2 的接收引脚, GPA1CON[1] 引脚设置成0x2,串口的发送引脚

第四步:

在4412芯片手册中查看UART第二组寄存器设置相关寄存器,并初始化相关寄存器

在这里插入图片描述
代码:


#include "exynos_4412.h"/*串口控制器号初始化*/
void UART_Init(void)
{/*1.将GPA1_0和GPA1_1设置成UART2的接收和发送引脚 GPA1CON[7:0]*/GPA1.CON = GPA1.CON & (~(0xFF << 0)) | (0x22 << 0);/*2.设置UART2的帧格式 8位数据位 1位停止位 无校验 正常模式 ULCON2[6:0]*/UART2.ULCON2 = UART2.ULCON2 & (~(0x7F << 0)) | (0x3 << 0);/*3.设置UART2的接收和发送模式为轮询模式 UCON2[3:0]*/UART2.UCON2 = UART2.UCON2 & (~(0xF << 0)) | (0x5 << 0);/*4.设置UART2的波特率为115200 UBRDIV2/UFRACVAL2*/UART2.UBRDIV2 = 53;UART2.UFRACVAL2 = 4;
}/*对外发送一个字节数据*/
void UART_Send_Byte(char Dat)
{/*等待发送寄存器为空,即上一个数据已经发送完成 UTRSTAT2[1]*/while(!(UART2.UTRSTAT2 & (1 << 1)));/*将要发送的数据写入发送寄存器 UTXH2*/UART2.UTXH2 = Dat;
}/*接受外部发来的数据*/
char UART_Rec_Byte(void)
{char Dat = 0;/*判断接收寄存器是否接收到了数据 UTRSTAT2[0]*/if(UART2.UTRSTAT2 & 1) { /*从接收寄存器读取接收到的数据 URXH2*/Dat = UART2.URXH2;return Dat;} else {return 0;}}void UART_Send_Str(char *pstr) {while(* pstr != '\0') {UART_Send_Byte(*pstr++);}
} int main()
{char RecDat = 0;UART_Init();while(1){RecDat = UART_Rec_Byte();if(RecDat == 0) {}else {RecDat = RecDat + 1;UART_Send_Byte(RecDat);}#if 0/*通过串口输出字符串*/UART_Send_Str("Hello world!");/* 这个printf不是Linux系统函数,是自己写的* 两个的区别就在于输出重定向不同* 1. 来源不一样:这个自己写的printf函数   Linux下是调用的C库函数* 2. 输出定向不同:*		Linux下终端输入' ls > out.txt' 将查到的目录下的信息输出到out.txt文件当中*		‘ ls’ 是将输出定向到了显示器 是直接将信æ¯显示到屏幕上面去的*		' ls > out.txt ' 是将输出定向磁盘中,该命令是将信息输出到文件当中**		Linux下的printf:输出定向到了显卡,然后显示到屏幕上*		而自己写的printf函数:输出定向到了UART寄存器,然后UART寄存器再将输出的信息发送到计算机当中解析** */printf("Hello world!");
#endif}return 0;
}

例:

例:编程实现电脑远程控制LED状态
注:在终端上输入‘2’,LED2点亮,再次输入‘2’,LED2熄灭… …

#include "exynos_4412.h"/*串口控制器号初始化*/
void UART_Init(void)
{/*1.将GPA1_0和GPA1_1设置成UART2的接收和发送引脚 GPA1CON[7:0]*/GPA1.CON = GPA1.CON & (~(0xFF << 0)) | (0x22 << 0);/*2.设置UART2的帧格式 8位数据位 1位停止位 无校验 正常模式 ULCON2[6:0]*/UART2.ULCON2 = UART2.ULCON2 & (~(0x7F << 0)) | (0x3 << 0);/*3.设置UART2的接收和发送模式为轮询模式 UCON2[3:0]*/UART2.UCON2 = UART2.UCON2 & (~(0xF << 0)) | (0x5 << 0);/*4.设置UART2的波特率为115200 UBRDIV2/UFRACVAL2*/UART2.UBRDIV2 = 53;UART2.UFRACVAL2 = 4;
}/*对外发送一个字节数据*/
void UART_Send_Byte(char Dat)
{/*等待发送寄存器为空,即上一个数据已经发送完成 UTRSTAT2[1]*/while(!(UART2.UTRSTAT2 & (1 << 1)));/*将要发送的数据写入发送寄存器 UTXH2*/UART2.UTXH2 = Dat;
}/*接受外部发来的数据*/
char UART_Rec_Byte(void)
{char Dat = 0;/*判断接收寄存器是否接收到了数据 UTRSTAT2[0]*/if(UART2.UTRSTAT2 & 1) { /*从接收寄存器读取接收到的数据 URXH2*/Dat = UART2.URXH2;if (Dat == 2)return Dat;return Dat;} else {return 0;}}void UART_Send_Str(char *pstr) {while(* pstr != '\0') {UART_Send_Byte(*pstr++);}
} /* 通过设置GPX2_CON寄存器来将GPX2_7引脚设置成输出功能 LED2*/
void GPIO_CON() {GPX2.CON = GPX2.CON & (~(0xF << 28)) | (0x1 << 28);
}/*通过GPX2_DAT引脚的设置 对LED2灯点亮和熄灭 */
void GPIO_DAT(char flag) {if (flag) {/* 熄灭LED2 */GPX2.DAT = GPX2.DAT & (~(1 << 7));} else {/* 点亮LED2 */GPX2.DAT = GPX2.DAT | (1 << 7);}}int main()
{char RecDat = 0;char flag = 0x1;UART_Init();while(1){RecDat = UART_Rec_Byte();if(RecDat == '2') {flag = !flag;	GPIO_DAT(flag);}else {RecDat = RecDat + 1;UART_Send_Byte(RecDat);}}return 0;
}

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

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

相关文章

【JavaEE】Spring Boot - 项目的创建和使用

【JavaEE】Spring Boot 开发要点总结&#xff08;1&#xff09; 文章目录 【JavaEE】Spring Boot 开发要点总结&#xff08;1&#xff09;1. Spring Boot 的优点2. Spring Boot 项目创建2.1 下载安装插件2.2 创建项目过程2.3 加载项目2.4 启动项目2.5 删除一些没用的文件 3. Sp…

GCC编译过程:预处理->编译->汇编->链接

目录 引言 概括介绍 一、预处理 二、编译 三、汇编 四、链接 总结 引言 当使用集成开发环境&#xff08;IDE&#xff09;进行C语言编程时&#xff0c;点击"编译"按钮后&#xff0c;整个C程序从源代码到可执行文件的生成过程会自动完成。IDE会在后台为我们执行C…

Jwt(Json web token)——使用token的权限验证方法 用户+角色+权限表设计 SpringBoot项目应用

目录 引出使用token的权限验证方法流程 用户、角色、权限表设计权限表角色表角色-权限关联表用户表查询用户的权限&#xff08;四表联查&#xff09;数据库的视图 项目中的应用自定义注解拦截器controller层DTO返回给前端枚举类型的json化日期json问题 实体类-DAO 总结 引出 1.…

Linux usb设备固定端口号

Linux usb设备固定端口号 一:/sys/bus/usb/devices/二:设备信息三:固定usb设备名方法 一:/sys/bus/usb/devices/ 信息显示如下 1-0:1.0 1&#xff1a;表示 1 号总线&#xff0c;或者说 1 号 Root Hub0&#xff1a;表示端口号1&#xff1a;表示配置号0&#xff1a;表示接口号命…

flink+kafka+doris+springboot集成例子

目录 一、例子说明 1.1、概述 1.1、所需环境 1.2、执行流程 二、部署环境 2.1、中间件部署 2.1.1部署kakfa 2.1.1.1 上传解压kafka安装包 2.1.1.2 修改zookeeper.properties 2.1.1.3 修改server.properties 2.1.1.3 启动kafka 2.1.2、部署flink 2.1.2.1 上传解压f…

SpringBoot项目-个人博客系统的实现【下】

10.实现强制要求登陆 当用户访问 博客列表页和 博客详情页时, 如果用户当前尚未登陆, 就自动跳转到登陆页面 1.添加拦截器 public class LoginInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletRespon…

根文件系统制作

1.官网下载工具 制作工具&#xff1a;busybox https://busybox.net/downloads/ 2.制作根文件系统 2.1准备工作 a.把压缩包放在FSP1M目录下&#xff0c;并解压 2.2正式开始 2.2.1配置交叉编译工具链 1. 打开Makefile文件 2. 修改ARCH &#xff1f;$(SUBARCH) &#xf…

Yolov5缺陷检测/目标检测 Jetson nx部署Triton server

使用AI目标检测进行缺陷检测时&#xff0c;部署到Jetson上即小巧算力还高&#xff0c;将训练好的模型转为tensorRT再部署到Jetson 上供http或GRPC调用。1 Jetson nx 刷机 找个ubuntu 系统NVIDIA官网下载安装Jetson 的sdkmanager一步步刷机即可。 本文刷的是JetPack 5.1, 其中包…

day03

#ifndef __SEQLIST_H__ #define __SEQLIST_H__#include <stdio.h> #include <string.h> #include <stdlib.h>#define MAX 40 typedef int datatype; typedef struct {datatype data[MAX];int len; }seqlist, *seqlistPtr;//创建顺序表 seqlistPtr list_creat…

vscode连接远程Linux服务器

文章目录 一、环境安装1.1 下载vscode1.2 下载vscode-sever 二、ssh链接2.1 安装Remote-SSH2.2 设置vscode ssh2.3 设置免密登录2.3.1 本地生成公私钥2.3.2 服务器端添加公钥 三、安装插件3.1 vscode安装插件3.1.1 在线安装插件3.1.2.1 下载插件3.1.2.2 安装插件 3.2 vscode-se…

Openlayers实战:判断共享单车是否在电子围栏内

共享单车方便了我们的日常生活,解决了后一公里的行程问题。为了解决共享单车乱放的问题,运营部门规划出一些围栏,配合到电子地图上即为电子围栏,只有放在围栏内才能停车结算,在我们的Openlayers实战示例中,即模拟这一场景。 效果图 源代码 /* * @Author: 大剑师兰特(x…

【Git】Git切换地址

如何切换git代码地址&#xff1f; 1、查看当前远程 url git remote -v执行命令后&#xff0c;可以看见当前有2个URL。 远程 URL 在一般情况下有两个&#xff0c;分别是 fetch 和 push。 fetch URL 是用于从远程仓库获取最新版本的数据。当您运行 git fetch 命令时&#xf…

ThreadPoolExecutor线程池详解

ThreadPoolExecutor线程池详解 1. 背景 项目最近的迭代中使用到了ThreadPoolExecutor线程池&#xff0c;之前都只是知道怎么用&#xff0c;没有了解过线程池的底层原理&#xff0c;项目刚上线&#xff0c;有时间整理一下线程池的用法&#xff0c;学习一下线程池的底层实现与工…

运行 Jmeter 文件生成 HTML 测试报告,我选择 ANT 工具

概述 ant 是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具&#xff0c;大多用于 Java 环境中的软件开发。 在与 Jmeter 生成的 jmx 文件配合使用中&#xff0c;ant 会完成jmx计划的执行和生成jtl文件&#xff0c;并将jtl文件转化为html页面进行查看。 还可…

Node.js |(三)Node.js API:path模块及Node.js 模块化 | 尚硅谷2023版Node.js零基础视频教程

学习视频&#xff1a;尚硅谷2023版Node.js零基础视频教程&#xff0c;nodejs新手到高手 文章目录 &#x1f4da;path模块&#x1f4da;Node.js模块化&#x1f407;介绍&#x1f407;模块暴露数据⭐️模块初体验⭐️暴露数据 &#x1f407;导入文件模块&#x1f407;导入文件夹的…

CAPL - XML和TestModule结合实现测试项可选

目录 目的:是否想实现如下面的功能呢? 一、.can和.cin文件中函数开发

C/C++面试总结

一、关键字static、const、extern、volatile作用 1、const 1.修饰常量 用const修饰的变量是不可变的&#xff0c;修饰后的变量只能使用&#xff0c;不能修改。 2.修饰指针 如果const位于*的左侧&#xff0c;eg&#xff1a;const int* a&#xff0c;则const就是用来修饰指针…

研发工程师玩转Kubernetes——hostPath

有别于《研发工程师玩转Kubernetes——emptyDir》一文中介绍的emptyDir&#xff0c;hostPath可以在同一个Node的不同Pod间共享卷。 下面的清单文件利用了Pod亲和性&#xff0c;让Pod集中到一个Node上。 apiVersion: apps/v1 kind: Deployment metadata:name: hostpath-deploy…

Adobe ColdFusion 反序列化漏洞复现(CVE-2023-29300)

0x01 产品简介 Adobe ColdFusion是美国奥多比&#xff08;Adobe&#xff09;公司的一套快速应用程序开发平台。该平台包括集成开发环境和脚本语言。 0x02 漏洞概述 Adobe ColdFusion存在代码问题漏洞&#xff0c;该漏洞源于受到不受信任数据反序列化漏洞的影响&#xff0c;攻击…

FinClip 支持小程序维度域名配置;桌面端体验活动进行中

FinClip 的使命是使您&#xff08;业务专家和开发人员&#xff09;能够通过小程序解决关键业务流程挑战&#xff0c;并完成数字化转型的相关操作。不妨让我们看看在本月的产品与市场发布亮点&#xff0c;看看是否有助于您实现目标。 产品方面的相关动向&#x1f447;&#x1f…