一般,是这样写:
//重新恢复DMA指针
void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)
{
DMA_Cmd(DMA_CHx, DISABLE ); //关闭USART1 TX DMA1所指示的通道
DMA_SetCurrDataCounter(DMA_CHx,DMA_Rec_Len);//DMA通道的DMA缓存的大小
DMA_Cmd(DMA_CHx, ENABLE); //打开USART1 TX DMA1所指示的通道
}
其实,小问题很多。
标准写法:
//仅针对 任意通道的 Stream2 而言
void uart1_DMA_Restart(DMA_Stream_TypeDef* DMAy_Streamx, uint16_t Counter)
{
DMA_Cmd(DMAy_Streamx, DISABLE);
while(DMA_GetCmdStatus(DMAy_Streamx) != DISABLE);
DMA_ClearITPendingBit(DMAy_Streamx, DMA_IT_TCIF2 | DMA_IT_HTIF2 | DMA_IT_TEIF2 | DMA_IT_DMEIF2 | DMA_IT_FEIF2);
DMA_SetCurrDataCounter(DMAy_Streamx, Counter);
DMA_Cmd(DMAy_Streamx, ENABLE);
}
为什么要加上这句:
DMA_ClearITPendingBit(DMAy_Streamx, DMA_IT_TCIF2 | DMA_IT_HTIF2 | DMA_IT_TEIF2 | DMA_IT_DMEIF2 | DMA_IT_FEIF2);
因为手册里的一句话:
注意: 将 EN 位置“1”以启动新传输之前,DMA_LISR 或 DMA_HISR 寄存器中与数据流相对应的事件标志必须清零。
|