首先说一下过程,之前在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程序也无法收发,折腾了几天,无解,最后改成了中断收发了。 |
楼主看代码中的MX_DMA_Init();这个函数位置,有没有将它放在前,在串口初始化前面。没有的话可以试一下看看。
刚好我最近使用STM32G031 测试过,使用DMA进行UART收发没有问题。倒是有个地方提醒下,如果基于Cubemx生成地初始化代码,当开启IDLE中断时, 关于IDLE中断的处理不要完全使用它的处理代码,它没有考虑到不定长接收,这个地方应说有bug,需要自行处理下。
楼主看代码中的MX_DMA_Init();这个函数位置,有没有将它放在前,在串口初始化前面。没有的话可以试一下看看 ...
查看了一下cubemx自动生成的代码,串口1的初始化在DMA初始化之前,串口2的初始化在DMA初始化之后。不知道如何调整cubemx生成初始化代码的顺序。但感觉很有可能是这个问题,导致DMA配置失败。
查看了一下cubemx自动生成的代码,串口1的初始化在DMA初始化之前,串口2的初始化在DMA初始化之后。不 ...
[md]这个顺序会影响的。 偶尔会有人反馈这个问题。 这里有个相关话题专门介绍。一个跟初始化顺序有关的异常话题 (qq.com)