打印
[应用相关]

串口DMA+IDLE第一次传输可以然后就不可以的问题解决

[复制链接]
954|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 寄存器中与数据流相对应的事件标志必须清零。


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

72

主题

3307

帖子

3

粉丝