USART在DMA模式下,进DMA发送完成中断后发现数据其实USART那边还没有真正的完成发送。
然后在中断里面改了下,先把DMA禁止掉,然后等待TC置位,TC置位就可以确认所有数据已经送出。
void DMA1_Channel7_IRQHandler(void)
{
if(SET==DMA_GetITStatus(DMA1_IT_TC7))
{
DMA_ClearITPendingBit(DMA1_IT_TC7);
DMA_Cmd(DMA_USART2_TX, DISABLE);
DMA_USART2_TX->CNDTR = 0;
while(RESET == USART_GetFlagStatus(USART2,USART_FLAG_TC))
{
USART_ClearFlag(USART2,USART_FLAG_TC);
}
Usart2_TR_Sw(RS485_RX);
return ;
}
}
|