[应用相关] 串口DMA+IDLE第一次传输可以然后就不可以的问题解决

[复制链接]
 楼主| nawu 发表于 2021-7-6 16:49 | 显示全部楼层 |阅读模式
一般,是这样写:


//重新恢复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 寄存器中与数据流相对应的事件标志必须清零。


您需要登录后才可以回帖 登录 | 注册

本版积分规则

73

主题

3308

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部