STM32F 配置DMA把数组的数据传送给串口的发送寄存器,然后串口的发送寄存器就可以自动进行发送。DMA发送的数据量是8200个,存储器属于自增模式。当串口的发送寄存器只有一个字节的空间,DMA把数组的数据一个一个传过来的时候,串口的发送寄存器有可能上一个传过来的数据还没来得及发送出去,就被DMA新的运过来的数据覆盖掉了,这样的话会导致数据丢失才对。但是为什么大家都这样呢,而且没有数据丢失的情况。DMA传送的数据到串口发送寄存器,和串口发送寄存器进行发送,这两个的时序是怎么配合的?
while(1)
{
t=KEY_Scan(0);
if(t==KEY0_PRES)//KEY0按下
{
LCD_ShowString(60,150,200,16,16,"Start Transimit....");
LCD_ShowString(60,170,200,16,16," %");//显示百分号
printf("\r\nDMA DATA:\r\n ");
USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);
MYDMA_Enable(DMA1_Channel4);//开始一次DMA传输!
//等待DMA传输完成,此时我们来做另外一些事,点灯
//实际应用中,传输数据期间,可以执行另外的任务
while(1)
{
if(DMA_GetFlagStatus(DMA1_FLAG_TC4)!=RESET)//等待通道4传输完成
{
DMA_ClearFlag(DMA1_FLAG_TC4);//清除通道4传输完成标志
break;
}
pro=DMA_GetCurrDataCounter(DMA1_Channel4);//得到当前还剩余多少个数据
pro=1-pro/((TEXT_LENTH+2)*100);//得到百分比
pro*=100; //扩大100倍
LCD_ShowNum(60,170,pro,3,16);
}
LCD_ShowNum(60,170,100,3,16);//显示100%
LCD_ShowString(60,150,200,16,16,"Transimit Finished!");//提示传送完成
}
i++;
delay_ms(10);
if(i==20)
{
LED0=!LED0;//提示系统正在运行
i=0;
}
}
}
void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)
{
DMA_Cmd(DMA_CHx, DISABLE ); //关闭USART1 TX DMA1 所指示的通道
DMA_SetCurrDataCounter(DMA1_Channel4,DMA1_MEM_LEN);//DMA通道的DMA缓存的大小
DMA_Cmd(DMA_CHx, ENABLE); //使能USART1 TX DMA1 所指示的通道
}
|