[HAL库]STM32之DMA方式串口发送

本文介绍如何使用cube软件配置STM32的USART1模块,通过DMA方式实现数据的发送与接收。详细步骤包括在cubePinout中设置USART1为异步通讯,配置DMA通道并调整中断优先级。代码部分涉及发送缓存区与接收缓存区的建立及DMA收发函数的调用。同时,文章探讨了DMA接收机制下数据丢失的问题,并提供了解决方案。

目的:使用cube软件实现DMA方式的数据发送和接收

1.在cube Pinout中打开USART1,方式为异步通讯(Asynchronous);

2.在cube Configuration中打开USART1 Configuration,添加DMA通道(接收改为循环方式)以及打开usart的全局中断,在NVIC中调整优先级

3.生成代码,在keil中进行以下修改:
1)在main文件中建立发送缓存区和接收缓存区(两个定常数组)

使用HAL_UART_Receive_DMA(&huart1,aRxBuffer,sizeof(aRxBuffer)) 进行DMA的接收(等待接收)

使用HAL_UART_Transmit_DMA(&huart1,aTxBuffer,sizeof(aTxBuffer)); 进行DMA的发送(立即发送)

2)在usart文件中书写HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)函数的逻辑

该函数在DMA接收到期待接收长度的数据时触发中断进入

 

存留问题:

(1)DMA只有在接收到期待长度的数据时才触发中断,所以上位机发送数据时最好是补全至定长后发送;

(2)如果DMA的期待长度为1时,一次性发送不定长数据时会导致接收一个丢失下一个的情况,例如发送123456会接收到135,可能是DMA发送时无法及时接收接下来的数据。

解决办法:

1.改为中断接收

2.补全成定长的数据包后一个包一个包发送可以避免字符丢失

3.采用空闲中断的方式 即使数据长度没有达到期望,只要一段时间未接收到数据即进入中断

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值