找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1742|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

STM32F DMA轉(zhuǎn)移存儲器的內(nèi)容到串口發(fā)送寄存器,發(fā)送寄存器再發(fā)送會丟失數(shù)據(jù)嗎?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:959891 發(fā)表于 2022-2-14 00:51 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
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 所指示的通道
}          



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

板凳
ID:959891 發(fā)表于 2022-2-14 12:33 | 只看該作者
xhaity 發(fā)表于 2022-2-14 09:16
你不用DMA的時候?yàn)榱朔乐鼓阏f的問題的產(chǎn)生是如何做的呢? 當(dāng)然你會判斷數(shù)據(jù)移位寄存器是否為空,才決定是否 ...

關(guān)于您說的DMA會自動判斷移位寄存器是否為空,來決定是否發(fā)送下一個字節(jié)數(shù)據(jù)到串口發(fā)送寄存器,有什么依據(jù)嗎?
回復(fù)

使用道具 舉報(bào)

地板
ID:625730 發(fā)表于 2022-2-14 13:39 | 只看該作者
yermsir 發(fā)表于 2022-2-14 12:33
關(guān)于您說的DMA會自動判斷移位寄存器是否為空,來決定是否發(fā)送下一個字節(jié)數(shù)據(jù)到串口發(fā)送寄存器,有什么依 ...

數(shù)據(jù)手冊上是這么個意思。
“利用DMA發(fā)送
使用DMA進(jìn)行發(fā)送,可以通過設(shè)置USART_CR3寄存器上的DMAT位激活。當(dāng)TXE位被置為’1’時,DMA就從指定的SRAM區(qū)傳送數(shù)據(jù)到USART_DR寄存器。為USART的發(fā)送分配一個DMA通道的步驟如下(x表示通道號):
1. 在DMA控制寄存器上將USART_DR寄存器地址配置成DMA傳輸?shù)哪康牡刂。在每個TXE事件后,數(shù)據(jù)將被傳送到這個地址。
2. 在DMA控制寄存器上將存儲器地址配置成DMA傳輸?shù)脑吹刂。在每個TXE事件后,將從此存儲器區(qū)讀出數(shù)據(jù)并傳送到USART_DR寄存器。
3. 在DMA控制寄存器中配置要傳輸?shù)目偟淖止?jié)數(shù)。
4. 在DMA寄存器上配置通道優(yōu)先級。
5. 根據(jù)應(yīng)用程序的要求,配置在傳輸完成一半還是全部完成時產(chǎn)生DMA中斷。
6. 在DMA寄存器上激活該通道。
當(dāng)傳輸完成DMA控制器指定的數(shù)據(jù)量時,DMA控制器在該DMA通道的中斷向量上產(chǎn)生一中斷。
在發(fā)送模式下,當(dāng)DMA傳輸完所有要發(fā)送的數(shù)據(jù)時,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”
回復(fù)

使用道具 舉報(bào)

5#
ID:959891 發(fā)表于 2022-2-14 18:14 | 只看該作者
TEC 發(fā)表于 2022-2-14 13:39
數(shù)據(jù)手冊上是這么個意思。
“利用DMA發(fā)送
使用DMA進(jìn)行發(fā)送,可以通過設(shè)置USART_CR3寄存器上的DMAT位激 ...

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

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表