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 所指示的通道
}
|