基于STM32CubeMX和keil采用USART/UART实现非中断以及中断方式数据回环测试借助CH340以及XCOM

文章目录

  • 前言
  • 1. 接口概述
    • 1.1 USART/UART接口
    • 1.2 串口通信参数
    • 1.3 波特率计算
  • 2. 传输函数
  • 3. 回环测试
    • 3.1 上位机环境配置
    • 3.2 阻塞模式
    • 3.3 中断模式
  • 4. STM32CubeMX配置
    • 4.1 时钟配置
    • 4.2 调试配置
    • 4.3 串口引脚配置
    • 4.4 工程配置
  • 5. 测试效果
  • 6. 不借助上位机回环测试
  • 总结

前言

这篇博客从串口通信的接口讲起,阐述原理,介绍通信方式,最后上机测试。
本篇博客主要以异步通信为例。


1. 接口概述

串口分为很多种,我们STM32学习过程中常见的就是UART/USART,前者是同步模式,后者是异步模式。还有RS485,RS232这种也是串口。我们平常使用的串口模块,大多都是类似于USB转TTL模块,为什么叫USB转TTL而不是USB转串口,因为MCU上的串口是逻辑电平(TTL或者CMOS电平),MCU和模块的通信通过逻辑电平的串口信号线直接连接。所以两种叫法,后者包含前者。前者更为常用。

1.1 USART/UART接口

下面是USART/UART对应的一般接口图

请添加图片描述

各个引脚说明如下:
请注意各个箭头方向。

引脚标识引脚含义备注
TX串行输出信号MCU向对方设备发送数据
RX串行输入信号MCU接收对方设备发送的数据
nCTS允许发送信号低电平有效,是对方设备发来的信号。如果nCTS为低电平,则表示对方设备准备好了接受数据,本机可以发送数据了;否则,不能发送数据。
nRTS请求发送信号低电平有效,是发送给给对方设备的一个信号。如果本机准备好了接受数据,则将nRTS置为低电平,通知对方设备可以发送数据了
SCLK发送器输出的时钟信号时钟信号线仅用于同步模式,USART没有这个引脚,UART有。

上面的图和表是串口最全的情况,是带有硬件流控制,同时又是同步模式的情况。
其实一般我们使用异步模式,并且没有硬件流控制。所以上面的5个引脚,最常用的只有RX,TX。
拿USB转TTL模块来举例,我们只需要接RX,TX,GND,VCC四个脚就行。这里RX和TX注意要交叉接,主机的TX接从机的RX,从机的TX接主机的RX。这个也很好理解,就是数据发送与接收的方向。


1.2 串口通信参数

串口发送数据是以数据帧的方式发送数据,下图是以传输一个8为字长的数据帧的时序图。
在这里插入图片描述

参数说明:
数据位:8位/9位,一般设置为8位,即8bit,即1byte。这样一帧传输1字节的有效数据。
奇偶校验位:可以无奇偶校验位,也可以设置奇校验或者偶校验。
停止位:1个或者2个停止位,一般设置为1个停止位。
波特率:串行数据传输的速率,单位是bit/s,常用的波特率有9600、19200、115200等。最高波特率的计算是根据时钟来的。一个串口单元的时钟由APB1或APB2总线提供,所以挂在不同APB总线上的串口单元的最高波特率不同。

1.3 波特率计算

波特率 = 时钟频率 ( UART的分频因子 × 过采样次数 ) \text{波特率} = \frac{\text{时钟频率}}{(\text{UART的分频因子} \times \text{过采样次数})} 波特率=(UART的分频因子×过采样次数)时钟频率

分频因子我查了一下,使用STM32CubeMX似乎是自动配置的,我就没有管了。
不过手动配置多少的话,可以算。
比如波特率115200,时钟频率100MHz,过采样次数16
算出来的UART的分频因子大约为54.2534,四舍五入到最近的整数。即54


2. 传输函数

这一小节主要介绍一下串口传输数据的三种方式对应的函数

传输类别函数名功能说明
阻塞式传输HAL_UART_Transmit()阻塞方式发送一个缓冲区的数据,发送完成或超时后才返回
HAL_UART_Receive()阻塞方式将数据接收到一个缓冲区,接收完成或擦手后才返回
中断方式传输HAL_UART_Transmit_IT()以中断方式(非阻塞式)发送一个缓冲区的数据
HAL_UART_Receive_IT()以中断方式(非阻塞方式)将指定长度的数据接收到一个缓冲区
DMA方式传输HAL_UART_Transmit_DMA()以DMA方式发送一个缓冲区数据
HAL_UART_Receive_DMA()以DMA方式将指定长度的数据接收到缓冲区
HAL_UART_DMAPause()暂停DMA传输过程
HAL_UART_DMAResume()继续先前暂停的DMA传输过程
HAL_UART_DMAStop停止DMA传输过程

上表中我只列举了函数名称,对于其中的参数并没有详细介绍,具体参数可以参考对应的驱动文件。

在这里插入图片描述

3. 回环测试

简单的回环测试,先接收上位机PC用XCOM发来的信息,再把数据发回去。

3.1 上位机环境配置

使用的是CH340,安装驱动。
在这里插入图片描述
在这里插入图片描述
如果出现预安装成功,但是你用USB接开发板之后没反应,不妨换一根数据线(我这里踩坑饿了),有些垃圾数据线不支持协议。

XCOM的话,点击就能用,主要是上下位机的波特率要一致。
在这里插入图片描述

在这里插入图片描述

3.2 阻塞模式

使用到的函数为

HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout)

函数对应的参数说明如下:
UART_HandleTypeDef *huart: 串口响应对象
const uint8_t *pData:发送/接受的数据
uint16_t Size:发送/接收数据的大小
uint32_t Timeout:发送或接收数据超时时间。超时后结束函数。

测试代码

uint8_t testBuf[5]="hello";
uint8_t receiveBuf[20]={0};
while (1){		if(HAL_UART_Receive(&huart1,receiveBuf,sizeof(testBuf),100)==HAL_OK)	{HAL_UART_Transmit(&huart1,receiveBuf,sizeof(testBuf),100);}/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}

3.3 中断模式

使用到的函数为

HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)

函数对应的参数说明如下:
UART_HandleTypeDef *huart: 串口响应对象
uint8_t *pData:发送/接受的数据
uint16_t Size:发送/接收数据的大小

测试代码

uint8_t testBuf[5]="hello";
uint8_t receiveBuf[20]={0};
while (1){		if(HAL_UART_Receive_IT(&huart1,receiveBuf,sizeof(testBuf))==HAL_OK)	{HAL_UART_Transmit_IT(&huart1,receiveBuf,sizeof(testBuf));}/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}

4. STM32CubeMX配置

4.1 时钟配置

在这里插入图片描述

4.2 调试配置

在这里插入图片描述

4.3 串口引脚配置

在这里插入图片描述

开启中断

在这里插入图片描述

4.4 工程配置

在这里插入图片描述

在这里插入图片描述

5. 测试效果

使用中断还是阻塞,在这个回环测试都一个效果。
在这里插入图片描述

6. 不借助上位机回环测试

原始版本,这个代码和上面的很类似,不同的地方在于硬件的连接。

uint8_t testBuf[5]="hello";
uint8_t receiveBuf[20]={0};
while (1){HAL_UART_Transmit(&huart1,testBuf,sizeof(testBuf),100);HAL_UART_Receive(&huart1,receiveBuf,sizeof(testBuf),100);
}

我这里将STM32F407ZET6的TX1直接接到RX1上了,按道理来说这样的效果使用debug来看的话,receiveBuf接收到的值应该是"hello",但是实际效果却不是这样的,我用debug来看,得到的数据却一直是h。后面的数据根本过不来。我一开始以为是发送需要时间,我没给延时,后来给了延时也是一样的效果。

按照显示的现象,我修改了部分代码

for(int i=0;i<sizeof(testBuf);i++)
{HAL_UART_Transmit(&huart1,testBuf+i,sizeof(testBuf),100);HAL_UART_Receive(&huart1,receiveBuf+i,sizeof(testBuf),100);
}

改完后,再用debug来看,发现数据正常了。

一直不太明白为什么,目前自己暂时认为,GPIO脚一次只能接受1bit数据,虽然每次发送了5个数据,但是只能收一个数据,这就导致只能收到h这个数据。
后来用了个for循环,其实就是多次发送,每次接受不同位置的数据,达到我们最终想要的效果。


总结

这个平时用的时候没有遇到第六小节的情况,因为都是借助上位机以及对应的USB转TTL做的测试。只关注了波特率,校验位等配置。没有过多考虑TX直接RX这种情况。这次出现的问题还有待确切的答案,暂时只能先这样认定。

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

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

相关文章

VX-3R APRS发射试验

VX-3R本身是不带APRS功能的&#xff0c;不过可能通过外加TNC实现APRS功能。 有大佬已经用Arduino实现了相应的发射功能&#xff1a; https://github.com/handiko/Arduino-APRS 我要做的&#xff0c;就是简单修改一下代码&#xff0c;做一个转接板。 YEASU官方没有给出VX-3R的音…

AI:56-基于深度学习的微表情识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

C语言之动态内存管理实现通讯录(完整版)

我们在之前的博客中写过静态版的通讯录&#xff0c;我们今天来写一个动态版的&#xff0c;不需要规定它到底需要多大空间&#xff0c;只要还有内存&#xff0c;我们都可以存放的下&#xff01;同时&#xff0c;函数实现原理&#xff0c;我在通讯录静态版的博客里做了详细的讲解…

LabVIEW对多个同一类型控件进行操作

LabVIEW对多个同一类型控件进行操作 有时候LabVIEW要多多个同一类的控件进行操作&#xff0c;如对tab中某个page中所有String控件设为dissable。就可以用如下的方式。className是获取不同类型的控件。通过类型选择&#xff0c;可以选择所有的String控件&#xff0c;并可对特定…

prometheus + grafana进行服务器资源监控

在性能测试中&#xff0c;服务器资源是值得关注一项内容&#xff0c;目前&#xff0c;市面上已经有很多的服务器资 源监控方法和各种不同的监控工具&#xff0c;方便在各个项目中使用。 但是&#xff0c;在性能测试中&#xff0c;究竟哪些指标值得被关注呢&#xff1f; 监控有…

从零开始制作一个割草机器人

项目背景 为啥要做一个割草机器人呢&#xff1f;&#xff08;个人因素&#xff1a;我梦想就是做一款人形机器人保护人类&#xff0c;解放人类&#xff09; 基础准备&#xff1a;我们公司本身做过高精度&#xff0c;基于高精度的技术扩展到农机自动化驾驶。目前可以实现AB线拖…

0003Java安卓程序设计-springboot基于Android的学习生活交流APP

文章目录 **摘** **要**目 录系统设计开发环境 编程技术交流、源码分享、模板分享、网课教程 &#x1f427;裙&#xff1a;776871563 摘 要 网络的广泛应用给生活带来了十分的便利。所以把学习生活交流管理与现在网络相结合&#xff0c;利用java技术建设学习生活交流APP&…

【算法】昂贵的聘礼(dijkstra算法)

题目 年轻的探险家来到了一个印第安部落里。 在那里他和酋长的女儿相爱了&#xff0c;于是便向酋长去求亲。 酋长要他用 10000 个金币作为聘礼才答应把女儿嫁给他。 探险家拿不出这么多金币&#xff0c;便请求酋长降低要求。 酋长说&#xff1a;”嗯&#xff0c;如果你能够替我…

云智慧联合北航提出智能运维(AIOps)大语言模型及评测基准

随着各行业数字化转型需求的不断提高&#xff0c;人工智能、云计算、大数据等新技术的应用已不仅仅是一个趋势。各行业企业和组织纷纷投入大量资源&#xff0c;以满足日益挑剔的市场需求&#xff0c;追求可持续性和竞争力&#xff0c;这也让运维行业迎来了前所未有的挑战和机遇…

MacOS安装git

文章目录 通过Xcode Command Lines Tool安装(推荐)终端直接运行git命令根据流程安装先安装Command Lines Tool后再安装git 官网下载二进制文件进行安装官方国外源下载二进制文件(不推荐)国内镜像下载二进制文件(推荐)安装git 通过Xcode Command Lines Tool安装(推荐) 简单来讲C…

vivado布局分析

1、高亮显示布局 1. 在“ Netlist ” &#xff08; 网表 &#xff09; 窗口中 &#xff0c; 选择要分析的层级。 2. 从弹出菜单中 &#xff0c; 选择“ Highlight Leaf Cells ” → “ Select a color ” &#xff08; 高亮叶节点单元 > 选择颜色 &#xff09; 。 3. …

Docker DeskTop安装与启动(Windows版本)

一、官网下载Docker安装包 Docker官网如下&#xff1a; Docker官网不同操作系统下载页面https://docs.docker.com/desktop/install/windows-install/ 二、安装Docker DeskTop 2.1 双击 Docker Installer.exe 以运行安装程序 2.2 安装操作 默认勾选&#xff0c;具体操作如下…