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