久芯网

STM32G071串口1无法使用DMA收发,串口2可以

avatar 真情永存 提问时间: 2023-08-19 09:08:49 / 已解决

首先说一下过程,之前在F1,F0上使用DMA串口发送和接收数据,开启空闲中断接收不定长数据,都没有任何问题。后来用上了G030,使用串口1做的DMA收发,同样也没有问题。后来有一个项目,因为需要单片机有UID(G030没有UID),所以更换单片机为G071CB,使用CUBEMX做配置,串口1和串口2都使用DMA收发数据,结果串口2的收发没有任何问题,串口1发不出去数据,也接收不了数据,但是更改函数HAL_UART_Transmit_DMA(&huart1,aTx1Buffer,4);为HAL_UART_Transmit_IT(&huart1,aTx1Buffer,4);就可以正常收发,即串口1用DMA 无法收发,用中断方式可以收发,使用官方dome程序也无法收发,折腾了几天,无解,最后改成了中断收发了。


如需获得 STM32G071 等器件的更多信息,请点击链接或 点击此处 联系在线客服!

4个回答
  • avatar butterflyspring
    最佳答案
    回答时间: 2023-08-19 09:39:24

    楼主看代码中的MX_DMA_Init();这个函数位置,有没有将它放在前,在串口初始化前面。没有的话可以试一下看看。

  • avatar xmshao
    回答时间: 2023-08-19 10:07:36

    刚好我最近使用STM32G031 测试过,使用DMA进行UART收发没有问题。倒是有个地方提醒下,如果基于Cubemx生成地初始化代码,当开启IDLE中断时, 关于IDLE中断的处理不要完全使用它的处理代码,它没有考虑到不定长接收,这个地方应说有bug,需要自行处理下。

  • avatar 真情永存
    回答时间: 2023-08-19 10:34:20
    butterflyspring 发表于 2021-11-8 11:38
    楼主看代码中的MX_DMA_Init();这个函数位置,有没有将它放在前,在串口初始化前面。没有的话可以试一下看看 ...

    查看了一下cubemx自动生成的代码,串口1的初始化在DMA初始化之前,串口2的初始化在DMA初始化之后。不知道如何调整cubemx生成初始化代码的顺序。但感觉很有可能是这个问题,导致DMA配置失败。

  • avatar xmshao
    回答时间: 2023-08-19 10:52:49
    真情永存 发表于 2021-11-17 16:18
    查看了一下cubemx自动生成的代码,串口1的初始化在DMA初始化之前,串口2的初始化在DMA初始化之后。不 ...

    [md]这个顺序会影响的。 偶尔会有人反馈这个问题。 这里有个相关话题专门介绍。一个跟初始化顺序有关的异常话题 (qq.com)

会员中心 微信客服
客服
回到顶部