STM32F0芯片HAL库利用uart+dma+空闲中断+环形缓冲区实现不定长接收和不定长发送
阅读原文时间:2021年04月20日阅读:1

最近在做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

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章