最近在做F091芯片的项目,利用HAL库实现uart+dma的不定长接收和发送,并且要利用环形缓冲区,达到数据接收和发送都不会进行阻塞且不会丢失的目的。
网上查了很多资料,也有很多关于这种的文章,但是几乎没有一个方式完美的,不是只有发送,就是只有接收,或者发送接收都没有实现环形缓冲区,而且发送只讲了怎么使用HAL_UART_Transmit_DMA()函数,但是没有完整的实现方案。
本文章就是实现发送和接受全双工进行,而且即使cpu发送速度大于dma处理速度时,也不会造成数据丢失。
下面开始将实现方法:
1. 首先配置uart管脚和dma,我是通过cubeMx配置的,关于cubemx的使用配置uart+dma网上也有很多资料,这里不再重复;
uart的dma接收设置成circle模式,发送设置成normal模式;之所以接收配置成circle模式,是因为接收是被动接收的,所以要处于循环模式,发送设置成normal模式,是因为有数据时才需要发送,如果设置成circle模式,在没有数据的时候,uart会一直向串口发送\0数据,这样串口根本没法使用,全部被\0突突突的覆盖;
2. 先说接收:
1)首先在配置完cubemx生成工程之后,要在初始化完成后打开空闲中断,并且启动DMA接收:
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); //开启空闲中断
HAL_UART_Receive_DMA(&huart1, (uint8_t*)uart1_rx_buf, USART1_RX
手机扫一扫
移动阅读更方便
你可能感兴趣的文章