GPDMA循环链表+双环形buffer实现高速串口接收不丢包(理论支持任意高波特率)

0 问题引出

在一些场合下,我们需要使用到串口通信,最常见的做法就是开启串口收发DMA、串口空闲中断,串口中断负责处理接收到的串口DMA数据,大致的操作为临时停止接收DMA,然后拷贝本次DMA接收到的数据,这可以应付串口速度比较慢的情况。如果串口速度很快,则在临时关闭DMA期间就可能发生丢失数据的问题。为了规避这一问题,本文提出使用GPDMA循环链表+双环形buffer实现高速串口接收不丢包,理论上支持任意高波特率。本文使用的实验平台如下:

硬件平台:STM32H503RBT6
HAL库版本:STM32Cube_FW_H5_V1.3.0

1 GPDMA循环链表+双环形buffer实现高速串口接收不丢包(理论支持任意高波特率)

1.1 核心思想

整个操作的核心可以用下图表示:
在这里插入图片描述

原理介绍:开启1ms中断,在1ms中断内计算接收DMA尾指针位置,和接收DMA头指针位置进行计算,得出这1ms内接收DMA接收到的数据量。然后根据DMA头指针位置,将接收到的串口数据拷贝到目标buffer中

### STM32CubeMX 配置 GPDMA 与 SPI 的实现方法 #### 1. GPDMA 和 SPI 的基础概述 GPDMA(General Purpose Direct Memory Access)是一种效的外设间或存储器间的传输机制,适用于多种外设的数据交换场景。SPI(Serial Peripheral Interface)作为常见的通信协议之一,常用于主机和从机设备之间的高速同步数据传输。结合两者可显著降低 CPU 占用率并提升系统性能[^1]。 #### 2. 在 CubeMX 中配置 GPDMA 支持 SPI 以下是基于 STM32CubeMX 工具的具体配置步骤说明: - **启用 GPDMA 功能** 在项目初始化阶段,打开 STM32CubeMX 用户界面中的 `DMA` 或者 `DMAMUX` 模块,并将其勾选以启动相关功能支持。此动作会自动生成所需的驱动代码框架以及必要的头文件引入[^5]。 - **关联 SPI 设备到 GPDMA** 寻找目标 SPI 外设节点,在其属性窗口下拉菜单里寻找有关 DMA 请求绑定项。将输入输出方向分别对应连接至预定义好的 GPDMA 信道之上[^6]。 - **定制化参数调节** 根据实际业务需求调整诸如传输长度、触发条件等细节设置。例如当采用循环模式时,确保每次完成后能无缝衔接新一轮操作而丢失任何样本点信息[^7]。 ```c // 示例:初始化 SPI 使用 GPDMA 进行全双工通讯 void MX_SPI_GPDMA_Init(SPI_HandleTypeDef* hspi, DMA_HandleTypeDef* hdma_tx, DMA_HandleTypeDef* hdma_rx){ /* Enable Clocks */ __HAL_RCC_SPI_CLK_ENABLE(hspi->Instance); /* Configure TX & RX DMA Channels */ hdma_tx->Init.PeriphInc = DMA_PINC_DISABLE; hdma_tx->Init.MemInc = DMA_MINC_ENABLE ; hdma_tx->Init.Direction = DMA_MEMORY_TO_PERIPH; hdma_rx->Init.PeriphInc = DMA_PINC_DISABLE; hdma_rx->Init.MemInc = DMA_MINC_ENABLE ; hdma_rx->Init.Direction = DMA_PERIPH_TO_MEMORY ; HAL_DMA_Init(hdma_tx); HAL_DMA_Init(hdma_rx); /* Associate the initialized DMAs to the SPI handle */ __HAL_LINKDMA(hspi, hdmatx, *hdma_tx); __HAL_LINKDMA(hspi, hdmarx, *hdma_rx); /* Initialize SPI with configured parameters */ if(HAL_SPI_Init(hspi)!= HAL_OK){ Error_Handler(); } } /* Start Data Transfer via DMA */ if(HAL_SPI_TransmitReceive_DMA(&hspi1, (uint8_t*)TxBuffer, (uint8_t*)RxBuffer, BufferSize) != HAL_OK){ // Handle possible errors here... } ``` 上述代码片段演示了如何借助 HAL 库来完成针对某个特定 SPI 实例的双向 DMA 数据流建立过程[^9]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NW嵌入式开发

感谢您的支持,让我们一起进步!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值