標(biāo)題: STM32F DMA轉(zhuǎn)移存儲(chǔ)器的內(nèi)容到串口發(fā)送寄存器,發(fā)送寄存器再發(fā)送會(huì)丟失數(shù)據(jù)嗎? [打印本頁]

作者: yermsir    時(shí)間: 2022-2-14 00:51
標(biāo)題: STM32F DMA轉(zhuǎn)移存儲(chǔ)器的內(nèi)容到串口發(fā)送寄存器,發(fā)送寄存器再發(fā)送會(huì)丟失數(shù)據(jù)嗎?
STM32F 配置DMA把數(shù)組的數(shù)據(jù)傳送給串口的發(fā)送寄存器,然后串口的發(fā)送寄存器就可以自動(dòng)進(jìn)行發(fā)送。DMA發(fā)送的數(shù)據(jù)量是8200個(gè),存儲(chǔ)器屬于自增模式。當(dāng)串口的發(fā)送寄存器只有一個(gè)字節(jié)的空間,DMA把數(shù)組的數(shù)據(jù)一個(gè)一個(gè)傳過來的時(shí)候,串口的發(fā)送寄存器有可能上一個(gè)傳過來的數(shù)據(jù)還沒來得及發(fā)送出去,就被DMA新的運(yùn)過來的數(shù)據(jù)覆蓋掉了,這樣的話會(huì)導(dǎo)致數(shù)據(jù)丟失才對(duì)。但是為什么大家都這樣呢,而且沒有數(shù)據(jù)丟失的情況。DMA傳送的數(shù)據(jù)到串口發(fā)送寄存器,和串口發(fā)送寄存器進(jìn)行發(fā)送,這兩個(gè)的時(shí)序是怎么配合的?


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,"   %");//顯示百分號(hào)
                        printf("\r\nDMA DATA:\r\n ");             
                       USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);   
                        MYDMA_Enable(DMA1_Channel4);//開始一次DMA傳輸!          
                    //等待DMA傳輸完成,此時(shí)我們來做另外一些事,點(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)前還剩余多少個(gè)數(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 所指示的通道
}          




作者: xhaity    時(shí)間: 2022-2-14 09:16
你不用DMA的時(shí)候?yàn)榱朔乐鼓阏f的問題的產(chǎn)生是如何做的呢? 當(dāng)然你會(huì)判斷數(shù)據(jù)移位寄存器是否為空,才決定是否發(fā)送下一幀數(shù)據(jù),DMA 會(huì)幫你自動(dòng)完成這部分工作。
作者: yermsir    時(shí)間: 2022-2-14 12:33
xhaity 發(fā)表于 2022-2-14 09:16
你不用DMA的時(shí)候?yàn)榱朔乐鼓阏f的問題的產(chǎn)生是如何做的呢? 當(dāng)然你會(huì)判斷數(shù)據(jù)移位寄存器是否為空,才決定是否 ...

關(guān)于您說的DMA會(huì)自動(dòng)判斷移位寄存器是否為空,來決定是否發(fā)送下一個(gè)字節(jié)數(shù)據(jù)到串口發(fā)送寄存器,有什么依據(jù)嗎?
作者: TEC    時(shí)間: 2022-2-14 13:39
yermsir 發(fā)表于 2022-2-14 12:33
關(guān)于您說的DMA會(huì)自動(dòng)判斷移位寄存器是否為空,來決定是否發(fā)送下一個(gè)字節(jié)數(shù)據(jù)到串口發(fā)送寄存器,有什么依 ...

數(shù)據(jù)手冊(cè)上是這么個(gè)意思。
“利用DMA發(fā)送
使用DMA進(jìn)行發(fā)送,可以通過設(shè)置USART_CR3寄存器上的DMAT位激活。當(dāng)TXE位被置為’1’時(shí),DMA就從指定的SRAM區(qū)傳送數(shù)據(jù)到USART_DR寄存器。為USART的發(fā)送分配一個(gè)DMA通道的步驟如下(x表示通道號(hào)):
1. 在DMA控制寄存器上將USART_DR寄存器地址配置成DMA傳輸?shù)哪康牡刂。在每個(gè)TXE事件后,數(shù)據(jù)將被傳送到這個(gè)地址。
2. 在DMA控制寄存器上將存儲(chǔ)器地址配置成DMA傳輸?shù)脑吹刂。在每個(gè)TXE事件后,將從此存儲(chǔ)器區(qū)讀出數(shù)據(jù)并傳送到USART_DR寄存器。
3. 在DMA控制寄存器中配置要傳輸?shù)目偟淖止?jié)數(shù)。
4. 在DMA寄存器上配置通道優(yōu)先級(jí)。
5. 根據(jù)應(yīng)用程序的要求,配置在傳輸完成一半還是全部完成時(shí)產(chǎn)生DMA中斷。
6. 在DMA寄存器上激活該通道。
當(dāng)傳輸完成DMA控制器指定的數(shù)據(jù)量時(shí),DMA控制器在該DMA通道的中斷向量上產(chǎn)生一中斷。
在發(fā)送模式下,當(dāng)DMA傳輸完所有要發(fā)送的數(shù)據(jù)時(shí),DMA控制器設(shè)置DMA_ISR寄存器的TCIF標(biāo)志;監(jiān)視USART_SR寄存器的TC標(biāo)志可以確認(rèn)USART通信是否結(jié)束,這樣可以在關(guān)閉USART或進(jìn)入停機(jī)模式之前避免破壞最后一次傳輸?shù)臄?shù)據(jù);軟件需要先等待TXE=1,再等待TC=1。
535”
作者: yermsir    時(shí)間: 2022-2-14 18:14
TEC 發(fā)表于 2022-2-14 13:39
數(shù)據(jù)手冊(cè)上是這么個(gè)意思。
“利用DMA發(fā)送
使用DMA進(jìn)行發(fā)送,可以通過設(shè)置USART_CR3寄存器上的DMAT位激 ...

再您的指導(dǎo)下,我明白了,非常感謝。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1