STM32F0芯片HAL库利用uart+dma+空闲中断+环形缓冲区实现不定长接收和不定长发送

最近在做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_BUF_SIZE);   //开启DMA接收

uart1_rx_buf是dma接收缓冲区,USART1_RX_BUF_SIZE是缓冲区的大小

2)开启空闲中断以及DMA接收后,有数据到来就会进入USART1_IRQHandler()中断函数,在这个中断函数中要进行接收数据的处理,以及清除中断,以下是我的实现方式:


void USART1_IRQHandler(void)
{
 

你可能感兴趣的:(学习总结)