RT_Thread:关于4.0.2版本STM32L0xx系列BSP的uart采用DMA方式接收时,无法接收数据的问题

官方给出的下面drv_usart.c驱动代码中函数stm32_dma_config()的L0系列的宏定义预编译SOC_SERIES_STM32L0中是没有DMA_Handle->Init.Request参数的,但是实际上L0系列的DMA传输需要配置这个值,否则会造成数据接收不到的问题

#if defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32L0)
    DMA_Handle->Instance                 = dma_config->Instance;
#elif defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7)
    DMA_Handle->Instance                 = dma_config->Instance;
    DMA_Handle->Init.Channel             = dma_config->channel;
#elif defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32G0)
    DMA_Handle->Instance                 = dma_config->Instance;
    DMA_Handle->Init.Request             = dma_config->request;
#endif

需要改成如下,将SOC_SERIES_STM32L0宏定义单独作为一项,并添加DMA_Handle->Init.Request = dma_config->request;代码段

#if defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32F0)
    DMA_Handle->Instance                 = dma_config->Instance;
#elif defined(SOC_SERIES_STM32L0)
    DMA_Handle->Instance                 = dma_config->Instance;
    DMA_Handle->Init.Request             = dma_config->request;
#elif defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7)
    DMA_Handle->Instance                 = dma_config->Instance;
    DMA_Handle->Init.Channel             = dma_config->channel;
#elif defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32G0)
    DMA_Handle->Instance                 = dma_config->Instance;
    DMA_Handle->Init.Request             = dma_config->request;
#endif

为了配合上述代码,还需要在dma_config添加,同理,如果有其它通道的串口DMA,也需要做此处理

#define UART1_RX_DMA_REQUEST       DMA_REQUEST_3

#if defined(BSP_UART1_RX_USING_DMA) && !defined(UART1_RX_DMA_INSTANCE)
#define UART1_DMA_RX_IRQHandler          DMA1_Channel4_5_6_7_IRQHandler
#define UART1_RX_DMA_RCC                 RCC_AHBENR_DMA1EN
#define UART1_RX_DMA_INSTANCE            DMA1_Channel5
#define UART1_RX_DMA_REQUEST             DMA_REQUEST_3
#define UART1_RX_DMA_IRQ                 DMA1_Channel4_5_6_7_IRQn
#endif

另外,在uart_config.h文件中的串口DMA结构体初始化定义中,也需要添加request字段

#if defined(BSP_UART1_RX_USING_DMA)
#ifndef UART1_DMA_RX_CONFIG
#define UART1_DMA_RX_CONFIG                                         \
    {                                                               \
        .Instance = UART1_RX_DMA_INSTANCE,                          \
        .dma_rcc  = UART1_RX_DMA_RCC,                               \
        .dma_irq  = UART1_RX_DMA_IRQ,                               \
        .request  = UART1_RX_DMA_REQUEST,                           \
    }
#endif /* UART1_DMA_RX_CONFIG */
#endif /* BSP_UART1_RX_USING_DMA */

 

这里也吐槽一下rt-thread中这部分代码的作者,既然没有验证过就别轻易放上去,这是个很明显的bug了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tristan Tsai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值