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

这篇具有很好参考价值的文章主要介绍了基于STM32CubeMX和keil采用USART/UART实现非中断以及中断方式数据回环测试借助CH340以及XCOM。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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


1. 接口概述

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

1.1 USART/UART接口

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

基于STM32CubeMX和keil采用USART/UART实现非中断以及中断方式数据回环测试借助CH340以及XCOM,# STM32相关学习,stm32,单片机,嵌入式硬件,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为字长的数据帧的时序图。
基于STM32CubeMX和keil采用USART/UART实现非中断以及中断方式数据回环测试借助CH340以及XCOM,# STM32相关学习,stm32,单片机,嵌入式硬件,USART/UART

参数说明:
数据位: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传输过程

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

基于STM32CubeMX和keil采用USART/UART实现非中断以及中断方式数据回环测试借助CH340以及XCOM,# STM32相关学习,stm32,单片机,嵌入式硬件,USART/UART

3. 回环测试

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

3.1 上位机环境配置

使用的是CH340,安装驱动。
基于STM32CubeMX和keil采用USART/UART实现非中断以及中断方式数据回环测试借助CH340以及XCOM,# STM32相关学习,stm32,单片机,嵌入式硬件,USART/UART
基于STM32CubeMX和keil采用USART/UART实现非中断以及中断方式数据回环测试借助CH340以及XCOM,# STM32相关学习,stm32,单片机,嵌入式硬件,USART/UART
如果出现预安装成功,但是你用USB接开发板之后没反应,不妨换一根数据线(我这里踩坑饿了),有些垃圾数据线不支持协议。

XCOM的话,点击就能用,主要是上下位机的波特率要一致。
基于STM32CubeMX和keil采用USART/UART实现非中断以及中断方式数据回环测试借助CH340以及XCOM,# STM32相关学习,stm32,单片机,嵌入式硬件,USART/UART

基于STM32CubeMX和keil采用USART/UART实现非中断以及中断方式数据回环测试借助CH340以及XCOM,# STM32相关学习,stm32,单片机,嵌入式硬件,USART/UART

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 时钟配置

基于STM32CubeMX和keil采用USART/UART实现非中断以及中断方式数据回环测试借助CH340以及XCOM,# STM32相关学习,stm32,单片机,嵌入式硬件,USART/UART

4.2 调试配置

基于STM32CubeMX和keil采用USART/UART实现非中断以及中断方式数据回环测试借助CH340以及XCOM,# STM32相关学习,stm32,单片机,嵌入式硬件,USART/UART

4.3 串口引脚配置

基于STM32CubeMX和keil采用USART/UART实现非中断以及中断方式数据回环测试借助CH340以及XCOM,# STM32相关学习,stm32,单片机,嵌入式硬件,USART/UART

开启中断

基于STM32CubeMX和keil采用USART/UART实现非中断以及中断方式数据回环测试借助CH340以及XCOM,# STM32相关学习,stm32,单片机,嵌入式硬件,USART/UART

4.4 工程配置

基于STM32CubeMX和keil采用USART/UART实现非中断以及中断方式数据回环测试借助CH340以及XCOM,# STM32相关学习,stm32,单片机,嵌入式硬件,USART/UART

基于STM32CubeMX和keil采用USART/UART实现非中断以及中断方式数据回环测试借助CH340以及XCOM,# STM32相关学习,stm32,单片机,嵌入式硬件,USART/UART

5. 测试效果

使用中断还是阻塞,在这个回环测试都一个效果。
基于STM32CubeMX和keil采用USART/UART实现非中断以及中断方式数据回环测试借助CH340以及XCOM,# STM32相关学习,stm32,单片机,嵌入式硬件,USART/UART

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脚一次只能接受1byte数据,虽然每次发送了5个数据,但是只能收一个数据,这就导致只能收到h这个数据。
后来用了个for循环,其实就是多次发送,每次接受不同位置的数据,达到我们最终想要的效果。


总结

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

到了这里,关于基于STM32CubeMX和keil采用USART/UART实现非中断以及中断方式数据回环测试借助CH340以及XCOM的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32CubeMx+MATLAB Simulink串口输出实验,UART/USART串口测试实验

    STM32CubeMx+MATLAB Simulink串口输出实验

    2024年02月21日
    浏览(45)
  • HAL库STM32CUBEMX学习记录(一)——USART(串口中断收发数据)

    一、首先使用STM32CUBEMX新建一个工程 二、打开工程文件 1.在usart.c中添加以下代码  2.然后在最后面加入中断回调函数 3.在usart.h文件中加入  4.新建一个cmd.c文件,创建命令check函数 5.在mian函数中的while(1)循环中调用USART1_Check(USART_RX_BUF)函数 6.最后串口初始化函数后打开串口中

    2024年02月16日
    浏览(45)
  • 【STM32+HAL库+CubeMX】UART轮询收发、中断收发、DMA收发方法及空闲中断详解

    Author: DrinkCat(szt@drinkcat.com) Copyright © 2023 DrinkCat Original link: DrinkCat’s Blog UART是一种异步串行通信接口,常用于通过串口与外部设备进行通信。它通过发送和接收数据帧来实现数据传输,使用起来相对简单。UART通常包含发送器(Transmitter)和接收器(Receiver),通过两根信号线

    2024年02月10日
    浏览(40)
  • STM32CubeMX-HAL库-UART串口接收中断回调函数代码分析

            CubeMx中HAL库函数的调用不同于库函数调用,在学习CubeMx串口通信时,不理解HAL库中的回调函数是怎么被调用的,于是查看每个的定义,参考其他人写的博客,总算弄明白了HAL库中断调用与库函数不同之处。写下这篇博客一是加深自己的理解,二是希望对不理解HA

    2024年02月02日
    浏览(56)
  • 【STM32笔记】STM32的定时器开发基础(二)(基于STM32CubeMX实现定时器中断)

      传统STM32外部中断 的设计步骤:  (1)将GPIO初始化为输入端口。  (2)配置相关I/O引脚与中断线的映射关系。  (3)设置该I/O引脚对印的中断触发条件。  (4)配置NVIC,并使能中断。  (5)编写中断服务函数。   基于STM32CubeMX的外部中断 设计步骤  (1)在STM3

    2024年02月20日
    浏览(62)
  • 基于STM32F1以及STM32CubeMx实现串口中断通讯(字符串发送与接收)

    首先选好自己的板子并打开软件设置,本实验基于STM32F103ZET6实现,打开软件后如图: 打开外部高速晶振,然后接着配置时钟: 将时钟频率修改为72MHz,接着设置接线方式为SW 接下来需要使用串口中断通讯,打开我们的串口设置并打开中断 这里波特率设置为115200,数据位为

    2024年02月09日
    浏览(47)
  • STM32CubeMX实现USART串口通信

    硬件:stm32f103c8t6核心板 软件:STM32CubeMX 6.6.1 keil5 mdk 这里就不再详细介绍了,详细请参考上一篇博客: https://blog.csdn.net/qq_55894922/article/details/127232999?spm=1001.2014.3001.5501 若点击 Manage embedded software packages 后,出现失败,则需要随便点击其它任一选项,进行下载一些文件,比如点

    2023年04月17日
    浏览(57)
  • 2.基于正点原子STM32F103的定时器中断实验(HAL库实现)(cubeMX)

      基本上每一款MCU都会配备定时器这个外设,STM32 的每个通用定时器都是完全独立的,没有互相共享的任何资源。 同样,STM32F1系列的定时器功能也很强大,包括: TIM1和TIM8两个高级定时器; TIM2~TIM5是个通用寄存器; TIM7,TIM8,两个基本定时器。 由于本次实验适用于新手入门

    2023年04月26日
    浏览(162)
  • 匿名上位机V7.12协议编程(基于STM32F407+CubeMX+UART外设通信)

    本篇以STM32F407VET6主控为基础进行论述。 文章的目的在于记录和引导, 传递一些编写通信类功能会用到的基本思想 ,以及组合这些功能的思想。 匿名上位机V7版本的功能在本篇没有全部写出来,而是针对本上位机常用的功能举例来描述。 相信读者通过仔细阅读笔者的思想引

    2023年04月14日
    浏览(86)
  • STM32 cubemx配置USART DMA传输

    本篇文章来讲解DMA的概念,并使用DMA来进行串口的数据收发。 DMA(Direct Memory Access,直接内存访问)是一种计算机系统的技术,允许外部设备(如硬盘驱动器、网络适配器或图形卡)直接与计算机内存进行数据传输,而不需要CPU的直接参与。这种直接的内存访问可以提高数据

    2024年02月11日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包