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

一般,是这样写:


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

因为忽视了这句,我又花费了一上午找问题!Fuck。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值