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.mfbz.cn/a/283776.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何开发一个google插件(二)

前言 在上一篇文章如何开发一个google插件(一)里主要介绍了google插件的基本结构。 在这篇文章中主要结合reactwebpack进行一个代码演示&#xff0c;源码地址&#xff1a;源码地址 下载源码后打开浏览器的扩展程序管理->加载已解压的扩展程序&#xff0c;即可调试插件 此…

2024年安全员-B证证模拟考试题库及安全员-B证理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年安全员-B证证模拟考试题库及安全员-B证理论考试试题是由安全生产模拟考试一点通提供&#xff0c;安全员-B证证模拟考试题库是根据安全员-B证最新版教材&#xff0c;安全员-B证大纲整理而成&#xff08;含2024年…

java struts2教务管理系统Myeclipse开发mysql数据库struts2结构java编程计算机网页项目

一、源码特点 java struts2 教务管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助 struts2 框架开发&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境 为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库…

7.12全排列②(LC47-M)

算法&#xff1a; 这道题目和46.全排列 (opens new window)的区别在与给定一个可包含重复数字的序列&#xff0c;要返回所有不重复的全排列。 所以就是多了个去重操作。 还是一样的套路&#xff1a; 先排序&#xff1a; Arrays.sort(nums); 再去重&#xff1a; // used[…

C语言课程设计参考题目

一、工资管理系统 需求分析 工资信息存放在文件中&#xff0c;提供文件的输入、输出等操作&#xff1b;要实现浏览功能&#xff0c;提供显示、排序操作&#xff1b;而查询功能要求实现查找操作&#xff1b;另外还应该提供键盘式选择菜单以实现功能选择。 2、总体设计 整个系统可…

管道进行进程间通信(上)

管道进行进程间通信 在posix和system V标准还没有出现的时候&#xff0c;进程间是如何进行通信的呢&#xff1f;这就要借助于我们今天学习的这个东西了。在进程间通信的标准没有出现之前&#xff0c;在os中就已经存在了文件了。而管道就是基于文件的一种进行进程间通信的方式。…

Redis 数据结构和常用命令

* 代表多个&#xff0c;&#xff1f;代表一个 &#xff08;不用全部敲出来&#xff0c;按住tab可以自动补全&#xff09; -2是无效&#xff0c;-1是永久有效 &#xff1b;贴心小提示&#xff1a;内存非常宝贵&#xff0c;对于一些数据&#xff0c;我们应当给他一些过期时间&a…

springboot 双数据源配置

1:pom <!--SpringBoot启动依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</group…

NNote插件:让网络阅读变得更高效,轻松同步至Notion笔记

NNote笔记 在这个互联网时代&#xff0c;我们每天都在浏览器中阅读大量的文章和资讯&#xff0c;时常会遇到让人眼前一亮的观点和想法。然而&#xff0c;当我们试图将这些精彩内容记录下来时&#xff0c;却常常感受到复制粘贴的繁琐。为了解决这个问题&#xff0c;NNote插件应运…

计算机网络物理层 习题答案及解析

2-1 下列选项中&#xff0c;不属于物理层接口规范定义范畴的是&#xff08; D &#xff09;。 A. 引脚功能 B. 接口形状 C. 信号电平 D. 传输媒体 【答案】D 【解析】 2-2 某网络在物理层规定&#xff0c;信号的电平范围为- 15V~15V &#xff0c; 电线长…

微信小程序开发系列-10组件间通信01

微信小程序开发系列目录 《微信小程序开发系列-01创建一个最小的小程序项目》 《微信小程序开发系列-02注册小程序》 《微信小程序开发系列-03全局配置中的“window”和“tabBar”》 《微信小程序开发系列-04获取用户图像和昵称》 《微信小程序开发系列-05登录小程序》 《…

java生产设备效率管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web生产设备效率管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为ac…

kivy中的GridLayout

说明 GridLayout 是 Kivy 框架中的一个布局管理器&#xff0c;它允许你在网格中排列子控件。你可以指定网格的行数和列数&#xff0c;然后添加子控件到网格中。GridLayout 会自动调整子控件的位置和大小&#xff0c;以适应网格的单元格。 在 Kivy 框架中&#xff0c;size_hint…

动态内存分配函数

malloc void* malloc( unsigned size) 申请size个字节的地址连续的内存单元 成功则返回指向内存块的指针, 失败则返回NULL malloc不对申请的空间初始化 calloc void*calloc&#xff08;unsigned n&#xff0c;unsigmed size&#xff09; 申请n* size字节的个地址连续的内…

2024-01-01 服务器开发-11个最佳免费和便宜SSL证书颁发机构

摘要: 2024-01-01 服务器开发-11个最佳免费和便宜SSL证书颁发机构 ssl证书颁发机构 在网站上实施 SSL 证书不再被视为奢侈品。它不仅通过加密网站访问者与您的网站之间交换的通信来提高您的网站安全性&#xff0c;而且还提高了网站的 SEO 排名。此外&#xff0c;如果你托管的平…

深度学习核心技术与实践之计算机视觉篇

非书中全部内容&#xff0c;只是写了些自认为有收获的部分 计算机视觉背景 &#xff08;1&#xff09;视觉皮层的神经元是一列一列组织起来的&#xff0c;每一列神经元只喜欢某一种特定的形状或者某些简单的线条组合&#xff0c;而不是鱼、老鼠、鲜花 &#xff08;2&#xf…

HTTPS协议详解

目录 前言 一、HTTPS协议 1、加密是什么 2、为什么要加密 二、常见加密方式 1、对称加密 2、非对称加密 三、数据摘要与数据指纹 1、数据摘要 2、数据指纹 四、HTTPS加密策略探究 1、只使用对称加密 2、只使用非对称加密 3、双方都使用非对称加密 4、对称加密非…

如何使用Docker compose安装Spug并实现远程访问登录界面

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. Docker安装Spug二. 本地访问测试三. Linux 安装cpolar四. 配置Spug公网访问…

Git:常用命令(一)

取得项目的Git 仓库 从当前目录初始化 1 git init 初始化后&#xff0c;在当前目录下会出现一个名为.git 的目录&#xff0c;所有Git 需要的数据和资源都存放在这个目录中。不过目前&#xff0c;仅仅是按照既有的结构框架初始化好了里边所有的文件和目录&#xff0c;但我们还…

Python备忘录工具:创建自己的备忘录应用

更多Python学习内容&#xff1a;ipengtao.com 在日常生活和工作中&#xff0c;经常需要记录重要信息、任务清单和想法。为了更好地管理这些信息&#xff0c;可以使用Python创建一个备忘录工具。本文将介绍如何使用Python开发一个简单而功能强大的备忘录应用&#xff0c;以及提供…