首页 > 其他分享 >stm32CubeIDE 串口UART+DMA+空闲中断接收不定长数据

stm32CubeIDE 串口UART+DMA+空闲中断接收不定长数据

时间:2023-07-31 17:14:02浏览次数:30  
标签:DMA 缓存 UART 中断 串口 接收 空闲

一、概述

  串口使用时,有时候会有接收不定长数据的需求,这时候用DMA+空闲中断的方式是最好的方法。

二、cubeide的配置

  串口按照需求配置后,添加一个串口接收的DMA,如下图

 

三、代码编写部分

  1、在 串口init函数 MX_UART4_Init(void)的末尾用户代码区域添加使能空闲中断和dma接收的代码,如下图,注意DMA接收缓存数组需要自定义

 

2、自定义一个串口中断函数,并在stm32h7xx_it.c文件中串口中断位置处添加该函数。

 

3、在自定义的中断函数中实现空闲中断时的处理。(为什么要添加一个自定义中断函数,而不在HAL_UART_RxCpltCallback中断接收回调函数中处理空闲中断?因为在HAL库当中,空闲中断并不会触发HAL_UART_RxCpltCallback回调函数,只有当DMA的receive buff满了之后才会触发)

 注意:

  1、首先要判断是否为空闲中断,是的话要及时清除空闲标志位

  2、这里非常重要,也容易搞忘。需要关闭串口的DMA,因为不关闭的话,后面会在缓存数组中自增接着存储,将多次不定长存储数据混着存在一起,而不能到达每一次空闲中断接收到的数据都刷新缓存数组,从缓存数组的第一个字节开始。

  3、这个也非常重要,在下一次开启dma接收前将dma缓存中的数据取出来存到其他数组中,因为如果在下一次dma缓存开启后同时又要读取dma缓存数据进行处理的话,会造成DMA不接收数据的错误。所以要提前取出数据以供后续数据处理,或者下一次dma接收换接收缓存地址也可以。

  4、清空dma缓存数组

  5、开启下一次DMA接收,不开启的话下一次则不能接收。

 

标签:DMA,缓存,UART,中断,串口,接收,空闲
From: https://www.cnblogs.com/tgc-3/p/17593893.html

相关文章

  • Java利用Rxtx进行串口通讯
    最近在做传感器数据采集的工作,底层是基于Zigbee的无线传感网络,所有数据采集到Zigbee协调器上然后通知上位机数据采集完成,上位机通过USB转串口去读取数据就可以了。那么问题来了,如何进行串口通讯呢?老板说你用Java写个程序好了嘛,用Java写串口程序也是醉了。实验室也没别人写了,所以就......
  • rdma-core之rping.c
    头部信息#define_GNU_SOURCE#include<endian.h>#include<getopt.h>#include<stdlib.h>#include<string.h>#include<stdio.h>#include<errno.h>#include<sys/types.h>#include<sys/socket.h>#include<netdb......
  • Rockchip RK3399 - Platform驱动(DMA&i2s0)
    Platfromdriver提供了配置/使能SoC音频接口的能力;Plaftrom驱动分为两个部分:snd_soc_platform_driver、snd_soc_dai_driver。snd_soc_platform_driver:负责管理音频数据,把音频数据通过DMA或其他操作传送至CPUDAI中;snd_soc_dai_driver:负责完成SoC一侧的DAI参数配置,同时也会通过......
  • Quartz实战:基于Quartz实现定时任务的动态调度,实现定时任务的增删改查
    文章目录一、Quartz基础二、使用Quartz实现定时任务的动态调度1、使用Quartz-jobStore持久化2、前端页面实现效果图3、自定义job表4、增删改查Controller5、Quartz工具类6、测试任务类7、springboot启动初始化定时任务8、自定义JobFactory,使Task注册为Bean9、省略的内容10、总结......
  • linux tty uart
    uartregistersI/OportRead(DLAB=0)Write(DLAB=0)Read(DLAB=1)Write(DLAB=1)baseRBR receiverbufferTHR transmitterholdingDLL divisorlatchLSBDLL divisorlatchLSBbase+1IER interruptenableIER interruptenableDLM divisorlatchMSBDLM......
  • rdma-core之riostream.c
    头文件和库以及全局变量#include<stdio.h>#include<stdlib.h>#include<string.h>#include<strings.h>#include<errno.h>#include<getopt.h>#include<sys/types.h>#include<sys/socket.h>#include<sys/time.h>#i......
  • 瑞芯微|rk3568 uart快速上手
    一、调试环境平台:rk3568kernel:4.19.232SDK:rk_android11.0_sdkBoard:rk3568-evb1-ddr4-v10二、rk3568uart控制器1.特性:rk3568UART控制器特性如下:-UART控制器通道:UART0~UART8【datasheet好像写的有问题】-包含2组64字节的FIFO,用于接收和传输-支持流控......
  • FPGA vivado quartus 设置外挂 编辑器
     1.vivado   tools->settings->editor ->customeditor... C:\\pg\\MicrosoftVSCodeInsiders\\Code-Insiders.exe[filename]  2.quartus tools->options->preferredtexteditortexteditor:custom command-line:"C:\pg\M......
  • Quartz任务调度快速入门
    了解Quartz体系结构Quartz对任务调度的领域问题进行了高度的抽象,提出了调度器、任务和触发器这3个核心的概念,并在org.quartz通过接口和类对重要的这些核心概念进行描述:●Job:是一个接口,只有一个方法voidexecute(JobExecutionContextcontext),开发者实现该接口定义运行任务,JobExe......
  • WIFI&蓝牙(ESP32)转CAN总线&串口TTL模块-A2-蓝牙和CAN总线透传通信(经典蓝牙主机)
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/ESP32_CAN"frameborder="0"scrolling="auto"width="100%"height="1500"></iframe></p>          实现的......