STM32F407使用DMA_USART3传输数据只能收发一次1次的解决方法

芯片用的是STM32F407ZGT6,用的是标准库,使用串口1配置位DMA的收发方式测试的完全没问题,但是把串口1改为串口3就不行了,每次启动只能收发一次数据,复位后也是只能收发一次。

研究了一整天没搞成功,后来换了一个思路一个小时左右就解决了主要问题。代码就不粘了,说一下思路。


首先是我尝试在定时器中断的地方加了  DMA_DeInit(DMA1_Stream3);  DMA_DeInit(DMA1_Stream1);  这两个函数,再加上DMA配置串口3的初始化函数,测试结果发现定时器中断产生之后DMA就能再重新收发数据,

这样就给我一个思路就是定时给它重新初始化(这种方法在实际操作中不可取,测试时可以用),把DMA_DeInit 和 DMA配置串口 的初始化里面的代码写到定时器中断处,再继续测试,当然跟上一次的结果是一样的,中断之后能用。

那接下来的工作就是找出哪句话可以使它能用,就是把定时器中断里面复制过来的那么多代码删一块就测试一次,删一块就测试一次,我这里的 DMA - USART3发送功能 就得到一行代码  DMA1->LIFCR = DMA_Stream3_IT_MASK; ,加上它就能工作,删除就不工作,把它再从定时器中断中删除,加到触发 DMA - USART3发送 的函数里面,再测试,每次触发 DMA - USART3发送 的时候都能正常发送了。接收也是一样的思路。


因为我对寄存器底层了解不是太深,代码也存在其他问题,就不往这里粘了,思路可以参考一下,这种解决方法至于会不会产生其他问题,就要在以后的实践中去测试了。

·关于我们·免责声明·服务条款·RSS订阅·dede168.com技术支持

Copyright © 1998-2015  All rights reserved.