HAL库学习05---串口通信(三种方式轮询、中断、DMA)

这篇具有很好参考价值的文章主要介绍了HAL库学习05---串口通信(三种方式轮询、中断、DMA)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、原理介绍

串行通信的通讯方式可以分为两类:
1、同步通信,带时钟信号的传输,如SPI、IIC、USART
2、异步传输,不带时钟信号的传输,如UART、USART

UART通用异步收发器:UART口指的是一种物理接口形式(硬件)

hal库串口通信,嵌入式裸机开发,单片机,学习,stm32UART是异步,全双工串口总线。它比同步串口复杂很多。有两根线,一根TXD用于发送,一根RXD用于接收。
UART的串行数据传输不需要使用时钟信号来同步传输,而是依赖于发送设备和接收设备之间预定义的配置。(约定固定波特率) 对于发送设备和接收设备来说,两者的串行通信配置应该设置为完全相同。
hal库串口通信,嵌入式裸机开发,单片机,学习,stm32
起始位:表示数据传输的开始,电平逻辑为“0” 。 数据位:可能值有5、6、7、8、9,表示传输这几个bit 位数据。一般取值为8,因为一个ASCII 字符值为8 位。 奇偶校验位:用于接收方对接收到的数据进行校验,校验“1” 的位数为偶数(偶校验) 或奇数(奇校验),以此来校验数据传送的正确性,使用时不需要此位也可以。 停止位:表示一帧数据的结束。电平逻辑为“1”。 如果用通用IO口模拟UART总线,则需一个输入口,一个输出口。

USART是通用同步/异步收发器:其可选使用异步方式,那将和UART无区别,如果是同步,则需要多一根时钟线(USART_CK)

串口发送接收有三种模式:轮询、中断和 DMA
补充几个名词:
Asynchronous:异步通信
Synchronous : 同步通信
Single Wire (Half-Duplex) :单线/半双工

二、STM32和PC进行数据互发

1、扫描接收发送

(1)、选择USART
(2)、设置MODE为异步通信(Asynchronous)
引脚一般自动设置为PA9、PA10
hal库串口通信,嵌入式裸机开发,单片机,学习,stm32
首先要在main.c或者是usart.c中对printf()和scanf()进行重定义,方便使用
记得要在头文件中输入#include "stdio.h"

int fputc(int ch,FILE *f)
{
HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );
return ch;
}
int fgetc(iFILE *f)
{
uint8_t ch=0;
HAL_UART_Receive (&huart1 ,&ch,1,HAL_MAX_DELAY );
return ch;
}

这样子就可以直接利用printf进行发送,打印

 while (1)
  {
    ch=getchar();
    HAL_UART_Transmit(&huart1,&ch,1,0);
  }

当然也可以用这种方式

uint8_t data[1];
while (1)
{
if(HAL_UART_Receive(&huart1,data,sizeof(data),HAL_MAX_DELAY)==HAL_OK){
		HAL_UART_Transmit (&huart1 ,data,sizeof(data),HAL_MAX_DELAY );
    }
}

1、中断接收发送

中断接收发送理解:原来的轮询方式是你一遍遍的询问前台你的外卖到了吗,在这期间你无法腾出时间去干其他事情,而中断则是外卖到了,前台告诉你,然后你去拿,在此期间你是可以做其他的事情的。
打开NVIC中断
hal库串口通信,嵌入式裸机开发,单片机,学习,stm32
补充一个函数:中断方式串口接收触发中断(接收完成)所调用的函数(void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart))用这个回调函数实现中断后的动作,
代码编写
在 main.c 中,while 循环前,串口初始化后,添加接收中断开启函数,这样在第一次接收到数据的时候才会触发中断,切记要添加该函数。

HAL_UART_Receive_IT(&huart1,(uint8_t*)data,sizeof(data));//data是自己定义的接收中断缓冲

在main.c下方添加中断回调函数,实现串口的发送和接收

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance==USART1)
	{
		HAL_UART_Transmit_IT(&huart1,data,sizeof(data));//发送你输入的内容
		HAL_UART_Receive_IT(&huart1,(uint8_t*)data,sizeof(data));//打开下一次串口接收中断
		}
}

3、DAM接收发送

DMA接收发送理解:中断是外卖来了,前台打电话给你然后你去取,会有这样子一种情况就是你现在在干一些其他的紧急事情(比如说你在考试),这时候你就需要其他人帮你拿一下外卖,DMA就是充当这个角色
Cubemax中点击DMA中的ADD,添加RX通道和TX通道
hal库串口通信,嵌入式裸机开发,单片机,学习,stm32
代码编写
在 main.c 中,while 循环前,串口初始化后,添加DMA方式接收中断开启函数,这样在第一次接收到数据的时候才会触发中断,切记要添加该函数。

HAL_UART_Receive_DMA(&huart1,data,sizeof(data));//data是自己定义的接收中断缓冲

在main.c下方添加中断回调函数,实现串口的发送和接收

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance==USART1)
	{
		HAL_UART_Transmit_DMA(&huart1,data,sizeof(data));
		HAL_UART_Receive_DMA(&huart1,data,sizeof(data));
	}
}

以上就是关于串口收发的三种方式了,不知道有没有写清楚,后面有更好的表述方式会重修修改的。文章来源地址https://www.toymoban.com/news/detail-670854.html

到了这里,关于HAL库学习05---串口通信(三种方式轮询、中断、DMA)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • STM32-HAL库串口DMA空闲中断的正确使用方式+解析SBUS信号

    能够点进这篇文章的小伙伴肯定是对STM32串口DMA空闲中断接收数据感兴趣的啦,今天用这一功能实现串口解析航模遥控器sbus信号时,查阅了很多网友发布的文章(勤劳的搬运工~),包括自己之前写过一篇博客 STM32_HAL库_CubeMx串口DMA通信(DMA发送+DMA空闲接收不定长数据)。本文

    2024年02月09日
    浏览(56)
  • HAL库中断方式进行串口通信

    软件: STM32CubeMX:6.6.0 KEIl:5.37.0.0 FlyMcu:0.188 硬件: STM32F103ZET6 1.1 设置SYS 1.2 设置RCC 1.3 设置USART 1.4 设置NVIC 1.5 设置时钟 1.6 创建项目 2.1 printf函数设置 在 main.c 和 usart.c 中添加头文件 #include \\\"stdio.h\\\" 之后,勾选Target中的use MicroLIB,在 mian.c 文件中,添加如下代码,进行重定义 2.2 设

    2024年02月03日
    浏览(31)
  • STM32使用三种方式(阻塞、中断、DMA)实现串口发送和接收数据

    记录下学习STM32开发板的心得的和遇见的问题。 板卡型号:STM32F405RGT6 软件:STM32CubeMX、IAR STM32串口外设提供了3种接收和发送方式:阻塞、中断、DMA,主要给大家分享中断方式接收不定长数据和DMA使用空闲中断接收不定长数据。 阻塞发送: 阻塞接收: 两个函数需要注意的就

    2024年02月03日
    浏览(35)
  • STM32CubeMX系列05——ADC(轮询、中断、DMA)

    ==== 文章汇总(有代码汇总) ==== 正点原子Mini板,主控 STM32F103RCT6. 用到的外设: 串口1(PA9、PA10) 任意几个GPIO口(这里用PA1、PA2、PA3,对应ADC通道1、2、3)。 配置时钟源 配置debug模式(如果需要ST-Link下载及调试可以勾选) 配置时钟树(可以直接在HCLK那里输入72,然后敲回

    2024年02月10日
    浏览(36)
  • 【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日
    浏览(34)
  • STM32:串口轮询模式、中断模式、DMA模式和接收不定长数据

           在STM32每个串口的内部都有两个寄存器:发送数据寄存器(TDR)/发送移位寄存器,当我们调用HAL_UART_Transmit 把数据发送出去时,CPU会将数据依次将数据发送到数据寄存器中,移位寄存器中的数据会根据我们设置的比特率传化成高低电平从TX引脚输出。待发送移位寄存器中发

    2024年02月07日
    浏览(43)
  • STM32 CubeMX ADC采集 单通道,多通道,内部温度(轮询,DMA,中断)(HAL库)

    12位ADC是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部 信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右 对齐方式存储在16位数据寄存器中。 模拟看门狗特性允许应用程序检测输入电压是否超出用户定

    2024年02月06日
    浏览(71)
  • 【STM32 HAL库实战】串口DMA + 空闲中断 实现不定长数据接收

    STM32CubeMX最新版: 打开STM32CubeMX软件,点击ACCESS TO MCU SELECTOR,在Commercial Part Number 中输入MCU型号,例如我在这里输入了STM32L431RCT6。选中正确型号然后双击进入下一步的配置界面。 1.1 SYS配置如图 1.2 RCC配置如图 开启了外部晶振,若无则都选择Disable 1.3 USART1配置 NVIC Settings 注意

    2024年02月03日
    浏览(68)
  • (stm32之HAL库)UART工作在DMA模式要打开串口中断吗?

    最近学习了stm32(F4xx)的串口在DMA模式下的使用,期间以ST官方提供的例程进行参考学习,发现其初始化过程中是打开了UART的中断的,而且HAL库中stm32f4xx_hal_uart.c文件中的DMA模式使用说明里也有这么一句话: 即在非循环模式下(也就是发完一次数据就停止的常用模式)需要配置

    2024年02月12日
    浏览(30)
  • STM32串口通信——DMA中断 (简单配置即可直接使用)

    目录 各函数的功能及使用方法 1.串口调试输出 2. 串口调试输出 接口设置    3. 串口格式化输出 4.用户串口DMA中断初始化函数 使用方法 1.找到系统的串口初始化函数 2.在结束位置添加我们的串口初始化函数  5.用户中断回调函数 使用方法 1.找到系统的中断服务.c文件 打开  

    2024年02月09日
    浏览(33)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包