|
STM32F 配置DMA把數(shù)組的數(shù)據(jù)傳送給串口的發(fā)送寄存器,然后串口的發(fā)送寄存器就可以自動進(jìn)行發(fā)送。DMA發(fā)送的數(shù)據(jù)量是8200個,存儲器屬于自增模式。當(dāng)串口的發(fā)送寄存器只有一個字節(jié)的空間,DMA把數(shù)組的數(shù)據(jù)一個一個傳過來的時候,串口的發(fā)送寄存器有可能上一個傳過來的數(shù)據(jù)還沒來得及發(fā)送出去,就被DMA新的運(yùn)過來的數(shù)據(jù)覆蓋掉了,這樣的話會導(dǎo)致數(shù)據(jù)丟失才對。但是為什么大家都這樣呢,而且沒有數(shù)據(jù)丟失的情況。DMA傳送的數(shù)據(jù)到串口發(fā)送寄存器,和串口發(fā)送寄存器進(jìn)行發(fā)送,這兩個的時序是怎么配合的?
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傳輸完成,此時我們來做另外一些事,點(diǎn)燈
//實(shí)際應(yīng)用中,傳輸數(shù)據(jù)期間,可以執(zhí)行另外的任務(wù)
while(1)
{
if(DMA_GetFlagStatus(DMA1_FLAG_TC4)!=RESET)//等待通道4傳輸完成
{
DMA_ClearFlag(DMA1_FLAG_TC4);//清除通道4傳輸完成標(biāo)志
break;
}
pro=DMA_GetCurrDataCounter(DMA1_Channel4);//得到當(dāng)前還剩余多少個數(shù)據(jù)
pro=1-pro/((TEXT_LENTH+2)*100);//得到百分比
pro*=100; //擴(kuò)大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;//提示系統(tǒng)正在運(yùn)行
i=0;
}
}
}
void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)
{
DMA_Cmd(DMA_CHx, DISABLE ); //關(guān)閉USART1 TX DMA1 所指示的通道
DMA_SetCurrDataCounter(DMA1_Channel4,DMA1_MEM_LEN);//DMA通道的DMA緩存的大小
DMA_Cmd(DMA_CHx, ENABLE); //使能USART1 TX DMA1 所指示的通道
}
|
|