中级会员
 
- 积分
- 246
- 金钱
- 246
- 注册时间
- 2015-1-28
- 在线时间
- 50 小时
|
1金钱
我按照原子的例程调试DMA,发现使用带有DMA的串口,在输出的时候前面打印的数据会被后方的覆盖掉.
按照下方的程序,理论上应该打印:
333
4444
55555
实际打印为:
334455555
也就是说前方数据没有打印完成的时候就被后方数据覆盖掉了.
于是,我在每个printf中间加了一个delay_um(),发现在延时280um时,程序可以正常打印,当延时低于280微秒的时候,数据发生了覆盖,并且随着延时的降低,覆盖的情况越来越严重。
我的问题如下:
1、按照原子的程序,因该增加while(DMA1_Channel7->CNDTR!=0);作为发送完成的标志,否则将继续等待,但是我按照此法添加了while((temp = DMA_GetCurrDataCounter(DMA_Channelx)) != RESET);后,发现程序直接卡死了,这是什么原因造成的?
2、DMA的发送速度这么慢吗?即便是上述发送完成标志可用,每次发送也要等待很长时间,这样的话完全体现不出来DMA的优势了,请问我的程序应该如何设计呢?
[mw_shl_code=c,true]//USART3的DMA串口打印函数
void u3_printf(char* fmt,...)
{
va_list ap;
va_start(ap, fmt);
vsprintf((char *)DMA_Tran_Buf3, fmt,ap);
va_end(ap);
USART_DMA_Send(DMA1_Channel2, strlen((const char *)DMA_Tran_Buf3));
}
//DMA发送函数
void USART_DMA_Send(DMA_Channel_TypeDef * DMA_Channelx, u16 Trans_Len)
{
int temp = 0;
DMA_Cmd(DMA_Channelx, DISABLE);
// while((temp = DMA_GetCurrDataCounter(DMA_Channelx)) != RESET); //检测CNDTR非空,加了这句以后程序就卡死.
printf("Trans_Len=%d\n",Trans_Len);
DMA_SetCurrDataCounter(DMA_Channelx, Trans_Len);
DMA_Cmd(DMA_Channelx, ENABLE);
}
while(1)
{
u3_printf("333\n");
delay_us(DMADELAY);
u3_printf("4444\n");
delay_us(DMADELAY);
u3_printf("55555\n");
delay_us(DMADELAY);
}[/mw_shl_code]
|
|