STM32 DMA 重新使能的一点心得

2019-07-20 22:41发布

最近做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(待传数据项数目)寄存器的值,然后才能重新使能
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。