DMA+USART接收数据,为什么只能接收到一次

2019-08-22 15:48发布

STM32F205 DMA+USART接收数据。按照网上的说法,总线空闲中断里已经关掉了DMA,而后设置传输次数重启,可是还是只能接收一次。之后DMA_GetCurrDataCounter(DMA1_Stream5)返回值一直都是初值。代码:
rx_len = USART2->SR;rx_len = USART2->DR;
USART_ClearITPendingBit(USART2, USART_IT_IDLE);
DMA_Cmd(DMA1_Stream5, DISABLE);
。。。。。。
。。。。。。
while(DMA1_Stream5->CR & (uint32_t)DMA_SxCR_EN);        //ÅD¶ÏS5CRμÄENλêÇ·ñÎa0
DMA_SetCurrDataCounter(DMA1_Stream5, UART_RX_LEN);
DMA_Cmd(DMA1_Stream5, ENABLE);


谁能帮忙看看是怎么回事????



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
Owen
1楼-- · 2019-08-22 19:43
STM32F2手册上写,将EN 位置“1”以启动新传输(即调用DMA_Cmd(DMAy_Streamx, ENABLE)函数使能数据流)之前,DMA_LISR 或DMA_HISR 寄存器中与数据流相对应的事件标志(DMA_FLAG_TCIFx)必须清零。重新使能DMA之前清除DMA中断的标志位,问题就解决了
八度空间
2楼-- · 2019-08-23 01:41
Owen
3楼-- · 2019-08-23 02:24
 精彩回答 2  元偷偷看……
JUSTNIUB
4楼-- · 2019-08-23 06:58
我最近在研究F0系列的DMA,在文档上看到这样一句话
If a DMA channel is disabled, the DMA registers are not reset. The DMA channel registers
(DMA_CCRx, DMA_CPARx and DMA_CMARx) retain the initial valuesprogrammed during
the channel configuration phase.
大意讲的是如果禁止掉DMA功能后,再使能DMA,相关DMA通道的寄存器不会被复位掉,会保留上一次执行的值
在你的程序里面,在接收完一次数据后,失能DMA通道时,DMA的CNDTR寄存器应该已经被清0了
而当你再次去使能它时,这个寄存器一直为0,所以就不会去产生接收的动作,所以你读取出来DR的值一直没有更新,就会是第一次的数值。

个人拙见。

Owen
5楼-- · 2019-08-23 10:33
JUSTNIUB 发表于 2017-4-7 14:38
我最近在研究F0系列的DMA,在文档上看到这样一句话
If a DMA channel is disabled, the DMA registers are ...

NDTR的值已经软件重设了,不是0.我看了一下午数据手册,找到出问题的地方在于需要在重新使能DMA之前清除DMA_LISR 和 DMA_HISR中的中断标志位。因为我用的是USART的总线空闲中断,所以一直没注意DMA中断的问题
JUSTNIUB
6楼-- · 2019-08-23 16:01
Owen 发表于 2017-4-7 15:55
NDTR的值已经软件重设了,不是0.我看了一下午数据手册,找到出问题的地方在于需要在重新使能DMA之前清除D ...

恩,我也有考虑过,NDTR的值不太可能是0.
不过你提到的这两个中断我在F0系列上确实没有见到过,所以给出的参考不正确。

一周热门 更多>