初级会员

- 积分
- 95
- 金钱
- 95
- 注册时间
- 2016-7-5
- 在线时间
- 22 小时
|

楼主 |
发表于 2019-4-11 11:23:47
|
显示全部楼层
之前一直纠结DMA的TC中断标识、USART的TC中断标识,怎么放,其实关键在于DMA发送的原理:DMA接收到发送指令,配置好各参数,只能开始传递数据到USART_DR寄存器中,USART也开始把数据发送出去,传送结束后DMA1_FLAG_TC4置高,但此时串口发送还未结束,USART_FLAG_TC不会置高,等待一段时间之后,这个动作才能结束,USART串口通讯才能被终止,要不然会影响最后一次传输的数据。
所以,在使用DMA进行串口发送数据的时候,应该先配置DMA各参数,然后依次等待DMA1_FLAG_TC4、USART_FLAG_TC置高,也就是此次发送结束,之后才能进行下一包数据的传输。这样就能避免相邻两个数据包的覆盖问题,比加延时更高效,思路也更清晰。关键代码如下,希望对大家有帮助:
void USART1_DMA_Send(char *buffer, uint32_t buffer_size)
{
DMA_Cmd(DMA1_Channel4, DISABLE);
DMA1_Channel4->CMAR = (u32)buffer;
DMA1_Channel4->CNDTR = buffer_size;
DMA_Cmd(DMA1_Channel4, ENABLE);
while(DMA1_Channel4_Flag != 0);
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
DMA1_Channel4_Flag = 1;
}
|
|