MCU常见通信总线串讲(一)—— UART和USART

🙌秋名山码民的主页
😂oi退役选手,Java、大数据、单片机、IoT均有所涉猎,热爱技术,技术无罪
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
获取源码,添加WX

目录

  • 前言
  • 一、简介
  • 二、帧格式
  • 三、硬件连接
  • 四、工作模式
  • 五、使用流程
  • 最后


前言

首先明确一个概念,关于MCU中通信总线和通信协议,通信总线是一种用于连接各种外设和模块的物理接口,它可以传输数据和控制信息。通信协议则是指在通信总线上传输数据时所遵循的规则和约定,以确保不同设备之间能够正确地交换信息,我们也可以把他叫做通信总线协议。

系列文章,主要讲解以下几个总线协议,读者可以按需选择:

  1. UART和USART
  2. RS232、RS485总线
  3. IIC总线
  4. SPI总线
  5. CAN总线
  6. USB总线

一、简介

UART:Universal Asynchronous Receiver/Transmitter,通用异步收发器。
USART:Universal Synchronous/Asynchronous Receiver/Transmitter,通用同步/异步串行接收/发送器。

UART是一种通用的异步串行通信协议,它使用起始位、数据位、校验位和停止位来传输数据。在UART通信中,数据的传输是通过固定的波特率进行的,发送和接收端需要事先约定好波特率、数据位、校验位和停止位等参数。UART通常用于连接微控制器、传感器、外围设备等,并且在计算机系统中也广泛应用于串口通信。

USART是一种更为复杂的串行通信协议,它同时支持同步和异步的数据传输方式。与UART不同的是,USART可以选择同步或者异步模式进行通信,并且提供了更多的控制选项,比如硬件流控制、双向通信等。USART通常用于对数据传输速度要求较高、需要双向通信或者需要更灵活控制的场景。

二、帧格式

UART:
在这里插入图片描述

  1. 起始位(Start Bit):起始位指示数据帧的开始。它始终是逻辑低电平,并且标志着数据的传输即将开始

  2. 数据位(Data Bits):数据位是实际的数据传输部分。它表示要传输的数据,可以是5位、6位、7位或8位,取决于所选择的数据位长度。

  3. 校验位(Parity Bit):校验位是可选的,用于检测传输过程中的错误。常见的校验方式包括奇校验、偶校验或者不使用校验。校验位的选择取决于通信双方事先约定好的校验规则。

  4. 停止位(Stop Bit):停止位标志着数据帧的结束。它始终是逻辑高电平,用于告知接收端该数据帧已经传输完成

发送过程中,发送方和接收方的波特率需要保持一致,为了减少累计的误差,最多发送1个字节,也就是发送的数据位,最多为8位。

USART支持同步模式,因此USART 需要同步始终信号USART_CK,一般在单片机里面同步信号很少使用,所以USART和UART使用方式是一样的,都使用异步模式。

三、硬件连接

USART和UART在硬件连接上有一些差别,主要是因为USART支持同步通信而UART不支持。下面是它们的硬件连接方式:

  1. UART的硬件连接:
  • UART通常使用三根线进行连接:TX(发送端)、RX(接收端)和地线(GND)。发送端的TX线连接到接收端的RX线,接收端的TX线连接到发送端的RX线。此外,两端的地线需要连接在一起,以确保信号的参考电位相同。
  • 在单片机或者嵌入式系统中,UART通常通过芯片上的引脚来连接,例如MCU的TX引脚连接到外部设备的RX引脚,MCU的RX引脚连接到外部设备的TX引脚。

在这里插入图片描述

  1. USART的硬件连接:
  • USART的连接方式与UART类似,但是在同步模式下还需要连接一个时钟线(CLK)。因此,USART在同步模式下通常使用四根线进行连接:TX、RX、CLK和GND。
  • 在使用USART进行同步通信时,发送端和接收端需要共享一个时钟信号,因此需要额外的时钟线来进行连接。

总的来说,UART和USART在硬件连接上的主要区别在于是否需要连接时钟线。

四、工作模式

  • 单工模式(Simplex Communication)的数据传输是单向的。通信双方中,一方固定为发送端,一方则固定为接收端。信息只能沿一个方向传输,使用一根传输线。
  • 半双工模式(Half Duplex)通信使用同一根传输线,既可以发送数据又可以接收数据,但不能同时进行发送和接收。数据传输允许数据在两个方向上传输,但是,在任何时刻只能由其中的一方发送数据,另一方接收数据。因此半双工模式既可以使用一条数据线,也可以使用两条数据线。半双工通信中每端需有一个收发切换电子开关,通过切换来决定数据向哪个方向传输。因为有切换,所以会产生时间延迟,信息传输效率低些。
  • 全双工模式(Full Duplex)通信允许数据同时在两个方向上传输。因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。在全双工模式中,每一端都有发送器和接收器,有两条传输线,信息传输效率高。

显然,在其它参数都一样的情况下,全双工比半双工传输速度要快,效率要高。

五、使用流程

  1. 初始化:首先需要初始化UART模块,包括设置波特率(Baud Rate)、数据位长度、校验位和停止位等参数。这些参数需要与通信的对端设备相匹配,以确保正常的数据传输。

  2. 发送数据:要发送数据,首先将要发送的数据写入到UART发送缓冲区。通过编程方式将数据写入发送缓冲区后,UART模块会自动将数据发送出去。在发送数据之前,需要检查发送缓冲区是否为空,以确保可以安全地写入新的数据。

  3. 接收数据:接收数据时,需要检查接收缓冲区中是否有新的数据可供读取。如果接收缓冲区中有数据可读,可以通过编程方式读取数据并进行处理。

  4. 错误处理:在UART通信过程中,可能会发生一些错误,比如校验错误或者帧错误。在接收数据时,需要及时检查错误标志位,以便进行相应的错误处理和恢复。

  5. 中断处理:为了提高系统的响应速度和效率,通常会使用UART中断来处理接收和发送数据。在使用中断的情况下,需要编写相应的中断服务程序(ISR),以处理接收到的新数据或者发送缓冲区为空的情况。

  6. 关闭和清理:在程序结束或者不再需要使用UART时,需要关闭UART模块,并进行相应的资源清理工作,以释放相关的资源和关闭相应的中断。

具体示例(MCU为STM32F103)

#include "bsp_usart.h"/*** @brief  配置嵌套向量中断控制器NVIC* @param  无* @retval 无*/
static void NVIC_Configuration(void)
{NVIC_InitTypeDef NVIC_InitStructure;/* 嵌套向量中断控制器组选择 */NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);/* 配置USART为中断源 */NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;/* 抢断优先级*/NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;/* 子优先级 */NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;/* 使能中断 */NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;/* 初始化配置NVIC */NVIC_Init(&NVIC_InitStructure);
}/*** @brief  USART GPIO 配置,工作参数配置* @param  无* @retval 无*/
void USART_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;// 打开串口GPIO的时钟DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);// 打开串口外设的时钟DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);// 将USART Tx的GPIO配置为推挽复用模式GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);// 将USART Rx的GPIO配置为浮空输入模式GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);// 配置串口的工作参数// 配置波特率USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;// 配置 针数据字长USART_InitStructure.USART_WordLength = USART_WordLength_8b;// 配置停止位USART_InitStructure.USART_StopBits = USART_StopBits_1;// 配置校验位USART_InitStructure.USART_Parity = USART_Parity_No ;// 配置硬件流控制USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;// 配置工作模式,收发一起USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;// 完成串口的初始化配置USART_Init(DEBUG_USARTx, &USART_InitStructure);// 串口中断优先级配置NVIC_Configuration();// 使能串口接收中断USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);	// 使能串口USART_Cmd(DEBUG_USARTx, ENABLE);		// 清除发送完成标志//USART_ClearFlag(USART1, USART_FLAG_TC);     
}/*****************  发送一个字符 **********************/
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
{/* 发送一个字节数据到USART */USART_SendData(pUSARTx,ch);/* 等待发送数据寄存器为空 */while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);	
}/*****************  发送字符串 **********************/
void Usart_SendString( USART_TypeDef * pUSARTx, char *str)
{unsigned int k=0;do {Usart_SendByte( pUSARTx, *(str + k) );k++;} while(*(str + k)!='\0');/* 等待发送完成 */while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET){}
}/*****************  发送一个16位数 **********************/
void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch)
{uint8_t temp_h, temp_l;/* 取出高八位 */temp_h = (ch&0XFF00)>>8;/* 取出低八位 */temp_l = ch&0XFF;/* 发送高八位 */USART_SendData(pUSARTx,temp_h);	while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);/* 发送低八位 */USART_SendData(pUSARTx,temp_l);	while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);	
}///重定向c库函数printf到串口,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{/* 发送一个字节数据到串口 */USART_SendData(DEBUG_USARTx, (uint8_t) ch);/* 等待发送完毕 */while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);		return (ch);
}///重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{/* 等待串口输入数据 */while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) == RESET);return (int)USART_ReceiveData(DEBUG_USARTx);
}

最后

如果本文对你有所帮助,还请三连支持一下博主!
请添加图片描述

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

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

相关文章

网络编程套接字(2)——简单的TCP网络程序

文章目录 一.简单的TCP网络程序1.服务端创建套接字2.服务端绑定3.服务端监听4.服务端获取连接5.服务端处理请求6.客户端创建套接字7.客户端连接服务器8.客户端发起请求9.服务器测试10.单执行流服务器的弊端 二.多进程版的TCP网络程序1.捕捉SIGCHLD信号2.让孙子进程提供服务 三.…

el-table中的el-input标签修改值,但界面未更新,解决方法

el-table中的el-input标签修改值,界面未更新 在el-table中的el-input里面写的change事件根本不触发,都不打印,试了网络上各种方法都没用 然后换成input事件,input事件会触发,但界面也未更新。我在触发事件的时候&…

构建强大的Web应用之Django详解

引言: Django是一个功能强大且灵活的Python Web框架,它提供了一套完整的工具和功能,帮助开发者快速构建高效的Web应用。本篇文章将带您逐步了解Django的基本概念和使用方法,并通过实际的代码案例,帮助您从零开始构建自…

vue + axios + mock

参考来源:Vue mock.js模拟数据实现首页导航与左侧菜单功能_vue.js_AB教程网 记录步骤:在参考资料来源添加axios步骤 1、安装mock依赖 npm install mock -D //只在开发环境使用 下载完成后,项目文件package.json中的devDependencies就会加…

基于java+springboot+vue的幼儿园信息网站

项目介绍 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于幼儿园管理系统当然也不能排除在外,随着网络技术的不断成熟,带动了幼儿园管理系统,它彻底改变了过…

【排序算法】 快速排序(快排)!图解+实现详解!

🎥 屿小夏 : 个人主页 🔥个人专栏 : 算法—排序篇 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言🌤️快速排序的概念☁️快速排序的由来☁️快速排序的思想☁️快速排序的实…

高校为什么需要大数据挖掘平台?

目前数据挖掘已经成为各种应用领域的重要技术,大学数据挖掘课程的开放已经出现。数据挖掘课程整合了多门学科知识。该课程包括各种理论知识,也离不开相关的实用技术。整个教学过程是培养和提高学生全面创新和解决问题的能力。过去,教学过程理…

ZYNQ_project:led

本次实验完成:led流水间隔0.5s 闪烁间隔0.25s。 名词解释: analysis分析:对源文件进行全面的语法检查。 synthesis综合:综合的过程是由 FPGA 综合工具箱 HDL 原理图或其他形式源文件进行分析,进而推演出由 FPGA 芯…

【C语言】数据结构——无头单链表实例探究

💗个人主页💗 ⭐个人专栏——数据结构学习⭐ 💫点击关注🤩一起学习C语言💯💫 目录 导读:1. 单链表1.1 什么是单链表1.2 优缺点 2. 实现单链表基本功能2.1 定义结构体2.2 单链表打印2.3 销毁单链…

大数据之LibrA数据库系统告警处理(ALM-12030 无合法license存在)

告警解释 系统在安装集群后和每天零点检查当前系统中是否存在合法的license文件,如果没有则产生该告警。 导入合法license文件时,告警恢复。 说明: 如果当前集群使用节点数小于等于10节点(不包含管理节点)&#xf…

一图搞懂傅里叶变换(FT)、DTFT、DFS和DFT之间的关系

自然界中的信号都是模拟信号,计算机无法处理,因此我们会基于奈奎斯特定理对模拟信号采样得到数字信号。 但是我们发现,即便是经过采样,在时域上得到了数字信号,而在频域上还是连续信号。 因此我们可以在时域中选取N点…

记录腾讯云重置密码之后ssh就连不上的踩坑

腾讯云轻量级服务器SSH连不上 解决方案在最后,点我跳转 问题背景: 首先ssh ubuntu用户我是能用xshell带上密钥正常连接的 其次我重置了root密码,自己改了一个root密码,因为我要用root账号使用ftp传输文件 然后重置密码之后&…