×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-05-23 发布时间:
|

目的:使用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.采用空闲中断的方式 即使数据长度没有达到期望,只要一段时间未接收到数据即进入中断



关键字:HAL库  STM32  DMA方式  串口发送 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
8051单片机的函数发生器的设计