最近做STM32F205的DMA+USART 总线空闲中断接收不定长数据的程序,在总线空闲中断里处理DMA缓存的数据。期间一直存在问题就是DMA只能接收一次数据,之后即便在DMA停止状态下使用DMA_SetCurrDataCounter()设置待发送数据项数目,DMA也不能重新使能。查了数据手册发现,必须将DMA_LISR和 DMA_HISR中相关的事件标致清零才能重新配置数据流。因为我用的是USART_IT_IDLE标致的总线空闲中断处理,所以一直没注意DMA中断标志位的清除,导致出错。
另附一些USART+DMA重新使能方面的内容:
l DMA通道disable后重新enable的时候,数据会重新从DMA_MemoryBaseAddr(DMA缓存区首地址)开始写入。l 注意: 将EN 位置“1”以启动新传输(即调用DMA_Cmd(DMAy_Streamx, ENABLE)函数使能数据流)之前,DMA_LISR 或DMA_HISR 寄存器中与数据流相对应的事件标志(DMA_FLAG_TCIFx)必须清零。l 如果DMA_SxNDTR(待传数据项数目)寄存器的值为零,则即使使能数据流,也无法完成任何事务。l 如果使能了数据流,通过重置DMA_SxCR 寄存器中的 EN 位将其禁止,然后读取此位以确认没有正在进行的数据流操作。将此位写为 0 不会立即生效,因为实际上只有所有当前传输都已完成时才会将其写为 0。当所读取 EN 位的值为 0 时,才表示可以配置数据流。因此在开始任何数据流配置之前,需要等待 EN 位置 0。应将先前的数据块 DMA传输中在状态寄存器(DMA_LISR 和 DMA_HISR)中置 1 的所有数据流专用的位置 0,然后才可重新使能数据流l 应先将EN位 置0,然后才能重新设置DMA_SxNDTR(待传数据项数目)寄存器的值,然后才能重新使能
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
之前用的F103,没啥问题。
现在F407,就不行了。。
折腾了1半天多,确定硬件没问题。最后带仿真编译了35分钟41秒,一个一个寄存器查看,发现DMA没有重新使能。
禁止DMA后,对应的TCIF 传输完成中断标志,会置位。
清除TCIF 后,DMA才可以重新使能。
另外发现,DMA_SxNDTR如果不需要更改预设值,直接使能DMA就会自动重装。
一周热门 更多>