08 通信协议之UART

引言: 从本文开始, 本个专题之后的几篇文章都是讲解嵌入式开发中几种常见的通信协议的, 比如UART, I2C,SPI, CAN总线这些我就不讲了, 没用到过, 学是学不完的, 等用到的时候再去学习, 毕竟嵌入式开发有一句话, 技术够用就行。本文涵盖了UART的基础知识, 根据SOC的参考手册就行裸机编程事项uart的功能。

一、UART基础知识


   Universal Asynchronous Receiver Transmitter 即 通用异步收发器,是一种通用的串行、异步通信总线 该总线有两条数据线,可以实现全双工的发送和接收在嵌入式开发中常常用来外设与主机就行通信。

关于uart的基础知识, 在HAL库下使用uart的那篇文章有, 这里我就不做更详细的说明了。需要注意的UART之所以一次只发送一个字节的数据是因为因为uart是异步通信的, 这样可以减少误差的积累导致的数据错乱。

还有一个小问题, 大家有没有想过, 当出现一下这种情况的时候该怎么区分是一个1还是多个1或者是0还是多个0:

答案是根据时钟来确定高低电平时候的1或者0的个数, 也就是常听说的掐时钟。

二、UART的寄存器编程


在这里, 我给大家演示一下不使用各个库如何开发出uart的程序, 大家搞明白这个原理之后, 大家也就明白我们在开发stm32的时候使用的标准库和HAL的原理了, 他们就是根据芯片手册, 根据各个外设的存储器映射表对地址做了一下封装。

提升串口信号的抗干扰能力和通信的距离RS232协议,485协议, 在uart的标准上对电气特性做了加强, 抗干扰能力更强了,但是在软件编程上没有啥子区别的, 大家别担心。

我们调用的各个库里面的函数的实现原理:

#ifndef ___EXYNOS4412_H_
#define ___EXYNOS4412_H_#define  	__REG(x)					(*(volatile unsigned int *)(x))  /****************EXINT***************/
#define		EXT_INT1_CON		__REG(0X11400700)
#define		EXT_INT2_CON		__REG(0X11400704)
#define		EXT_INT3_CON		__REG(0X11400708)
#define		EXT_INT4_CON		__REG(0X1140070C)
#define		EXT_INT5_CON		__REG(0X11400710)
#define		EXT_INT6_CON		__REG(0X11400714)
#define		EXT_INT7_CON		__REG(0X11400718)#define		EXT_INT8_CON		__REG(0X11400700)
#define		EXT_INT9_CON		__REG(0X11400700)
#define		EXT_INT10_CON		__REG(0X11400700)
#define		EXT_INT11_CON		__REG(0X11400700)
#define		EXT_INT12_CON		__REG(0X11400700)

大家看以上代码, 0X11400700这些一系列的数字其实是各个寄存器的地址, 特殊功能寄存器, 我们可以讲这些地址封装成一个宏, 增加可读性,接着我们就可以使用c语言强大的功能, 使用指针对指定的地址进行读写操作。

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);}*//*UART_Send_Str("Hello World\n");*/printf("Hello World\n");}return 0;
}

以上代码大家不需要看懂, 在实际开发中我相信这样开发的很少, 大家只需要明白我们使用的不标准库, 还是HAL库,里面的函数的本质还是对寄存器进行读写, 只不过这些库将这些寄存器封装了一层又一层。

三、UART在HAL库, 标准库中的使用


这些内用在本专题的hal库下使用uart下有, 我就不重复了。

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

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

相关文章

什么情况下不应该使用 LockWindowUpdate ?

在之前的文章中&#xff0c;我们将了解了 LockWindowUpdate 应该在什么场景下使用&#xff0c;也就是拖动的场景。 今天&#xff0c;我们来看看 LockWindowUpdate 被误用的一些场景。 人们看到 LockWindowUpdate 的“您锁定的窗口将无法重新绘制自身”行为&#xff0c;并将其…

磁盘阵列(RAID)

1.独立硬盘冗余阵列&#xff08;RAID, Redundant Array of Independent Disks&#xff09; 旧称廉价磁盘冗余阵列&#xff08;Redundant Array of Inexpensive Disks&#xff09;&#xff0c;简称磁盘阵列 用虚拟化存储技术把多个硬盘组合起来&#xff0c;成为一个或多个硬盘阵…

Spark魔力:招聘网站数据深度分析系统

Spark魔力&#xff1a;招聘网站数据深度分析系统 简介数据集技术栈功能特点创新点 简介 在本文中&#xff0c;我们将介绍一款基于Spark的招聘网站数据分析系统&#xff0c;该系统使用爬取的前程无忧招聘数据。通过结合Flask、Pandas、PySpark、以及MySQL等技术&#xff0c;实现…

指定列名自动将Excel内的数据拆分为不同的Sheet(基于Python)

在Python中&#xff0c;可以使用pandas和openpyxl或xlsxwriter库来读取Excel文件、操作数据以及将数据写入新的Excel文件中。以下是一个简单的示例&#xff0c;说明如何读取一个Excel文件&#xff0c;将指定列的数据拆分到独立的sheet中&#xff1a; 首先&#xff0c;确保安装…

大数据机器学习GAN:生成对抗网络GAN全维度介绍与实战

文章目录 大数据机器学习GAN&#xff1a;生成对抗网络GAN全维度介绍与实战一、引言1.1 生成对抗网络简介1.2 应用领域概览1.3 GAN的重要性 二、理论基础2.1 生成对抗网络的工作原理2.1.1 生成器生成过程 2.1.2 判别器判别过程 2.1.3 训练过程训练代码示例 2.1.4 平衡与收敛 2.2…

回顾 2023,展望 2024

by zhengkai.blog.csdn.net 项目与心得 今年最大的项目和心得&#xff0c;非GCP莫属&#xff0c;作为全球顶尖的云平台&#xff0c; GCP有他的优势&#xff0c;也有很多难用的地方。但是作为当时的一个strategic solution&#xff0c;我们的印度本地化项目必须使用GCP&#xf…

uni-app js语法

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…

Zookeeper实现分布式锁和注册中心

目录 分布式锁 实现方式 分布式锁场景如何选择Redis和zookeeper 用InterProcessMutex实现分布式锁 zookeeper实现注册中心 分布式锁 实现方式 数据库唯一索引Redis的setnxZookeeper创建临时节点及监听机制Zookeeper创建临时有序节点 分布式锁场景如何选择Redis和zookeepe…

App Inventor 2 接入短信服务,实现短信验证码功能

发送短信验证码功能一般都是基于短信平台提供的sdk进行调用&#xff0c;这里是基于阿里云短信平台进行的开发&#xff0c;阿里云短信平台接入步骤请点此参考。 App Inventor 2拓展提供的函数如下&#xff1a; 主要提供2个函数&#xff0c;生成随机位数的数字随机码 和 发送短信…

01.QT概述

一、QT简介 Qt是一个跨平台的应用程序开发框架&#xff0c;用于开发图形界面和嵌入式应用程序。它最初由挪威的Trolltech公司开发&#xff0c;并于1995年首次发布。Qt提供了一套丰富的工具和类库&#xff0c;用于开发桌面应用程序、移动应用程序和嵌入式系统。 二、QT特点 1.…

jsp介绍

JSP 一种编写动态网页的语言&#xff0c;可以嵌入java代码和html代码&#xff0c;其底层本质上为servlet,html部分为输出流&#xff0c;编译为java文件 例如 源jsp文件 <% page contentType"text/html; charsetutf-8" language"java" pageEncoding&…

【小白专用】winform启动界面+登录窗口 更新2024.1.1

需求场景&#xff1a;先展示启动界面&#xff0c;然后打开登录界面&#xff0c;如果登录成功就跳转到主界面 首先在程序的入口路径加载启动界面&#xff0c;使用ShowDialog显示界面&#xff0c; 然后在启动界面中添加定时器&#xff0c;来实现显示一段时间的效果&#xff0c;等…

基于斑点鬣狗算法优化的Elman神经网络数据预测 - 附代码

基于斑点鬣狗算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于斑点鬣狗算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于斑点鬣狗优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…

计算机网络教案——计算机网络设备章节

第五章 计算机网络设备 一、教学目标: 1. 了解计算机网络的主要设备 2. 了解计算机网络设备的主要原理 3. 掌握计算机网络设备的基本用途 4. 掌握计算机网络设备的使用常识 二、教学重点、难点 计算机网络设备的主要原理 三、技能培训重点、难点 计算机网络设备的使用…

创建型--单例模式

1. basic 1.1 什么是单例模式 保证⼀个类仅有⼀个实例&#xff0c;并提供⼀个访问它的全局访问点。 1.2 分类 两种&#xff1a; 饿汉模式&#xff1a;饿了就饥不择⻝了&#xff0c;所以在单例类定义的时候就进⾏实例化。懒汉模式&#xff1a;顾名思义&#xff0c;不到万不…

接收Kafka数据并消费至Hive表

1 Hive客户端方案 将Kafka中的数据消费到Hive可以通过以下简单而稳定的步骤来实现。这里假设的数据是以字符串格式存储在Kafka中的。 步骤&#xff1a; 创建Hive表&#xff1a; 使用Hive的DDL语句创建一个表&#xff0c;该表的结构应该与Kafka中的数据格式相匹配。例如&#…

(六)Java 运算符

目录 一. 前言 二. 算术运算符 三. 关系运算符 四. 位运算符 五. 逻辑运算符 六. 赋值运算符 七. 其他运算符 7.1. 条件运算符&#xff08;三元运算符&#xff09; 7.2. instanceof 运算符 八. Java 运算符优先级 九. 课后习题 一. 前言 计算机的最基本用途之一就是…

Pix2Pix如何工作?

一、说明 在本指南中&#xff0c;我们将重点介绍 Pix2Pix [1]&#xff0c;它是用于配对图像翻译的著名且成功的深度学习模型之一。在地理空间科学中&#xff0c;这种方法可以帮助传统上不可能的广泛应用&#xff0c;在这些应用中&#xff0c;我们可能希望从一个图像域转到另一个…

vue3基础知识一,安装及使用

一、安装vue3 需要安装node&#xff0c;然后在项目所在目录命令行执行以下代码。 npm create vuelatest 回车后需要配置以下内容。 二、安装所需的依赖包并运行 cd到项目目录&#xff0c;执行以下代码安装依赖包 npm i 运行项目 npm run dev 打开浏览器查看结果 ok&#…

重温MySQL之索引那些事

文章目录 前言一、概念1.1 索引作用1.2 索引类型1.3 B树索引结构1.4 B树索引源码分析 二、查询计划2.1 explain2.2 id2.3 select_type2.4 table2.5 partitions2.6 type2.7 possible_keys2.8 key2.9 key_len2.10 ref2.11 rows2.12 filtered2.13 Extra 三、索引优化3.1 索引失效3…