欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1995|回復: 4
收起左側

STM32F DMA轉移存儲器的內容到串口發送寄存器,發送寄存器再發送會丟失數據嗎?

[復制鏈接]
ID:959891 發表于 2022-2-14 00:51 | 顯示全部樓層 |閱讀模式
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 所指示的通道
}          



回復

使用道具 舉報

ID:373388 發表于 2022-2-14 09:16 | 顯示全部樓層
你不用DMA的時候為了防止你說的問題的產生是如何做的呢? 當然你會判斷數據移位寄存器是否為空,才決定是否發送下一幀數據,DMA 會幫你自動完成這部分工作。
回復

使用道具 舉報

ID:959891 發表于 2022-2-14 12:33 | 顯示全部樓層
xhaity 發表于 2022-2-14 09:16
你不用DMA的時候為了防止你說的問題的產生是如何做的呢? 當然你會判斷數據移位寄存器是否為空,才決定是否 ...

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

使用道具 舉報

ID:625730 發表于 2022-2-14 13:39 | 顯示全部樓層
yermsir 發表于 2022-2-14 12:33
關于您說的DMA會自動判斷移位寄存器是否為空,來決定是否發送下一個字節數據到串口發送寄存器,有什么依 ...

數據手冊上是這么個意思。
“利用DMA發送
使用DMA進行發送,可以通過設置USART_CR3寄存器上的DMAT位激活。當TXE位被置為’1’時,DMA就從指定的SRAM區傳送數據到USART_DR寄存器。為USART的發送分配一個DMA通道的步驟如下(x表示通道號):
1. 在DMA控制寄存器上將USART_DR寄存器地址配置成DMA傳輸的目的地址。在每個TXE事件后,數據將被傳送到這個地址。
2. 在DMA控制寄存器上將存儲器地址配置成DMA傳輸的源地址。在每個TXE事件后,將從此存儲器區讀出數據并傳送到USART_DR寄存器。
3. 在DMA控制寄存器中配置要傳輸的總的字節數。
4. 在DMA寄存器上配置通道優先級。
5. 根據應用程序的要求,配置在傳輸完成一半還是全部完成時產生DMA中斷。
6. 在DMA寄存器上激活該通道。
當傳輸完成DMA控制器指定的數據量時,DMA控制器在該DMA通道的中斷向量上產生一中斷。
在發送模式下,當DMA傳輸完所有要發送的數據時,DMA控制器設置DMA_ISR寄存器的TCIF標志;監視USART_SR寄存器的TC標志可以確認USART通信是否結束,這樣可以在關閉USART或進入停機模式之前避免破壞最后一次傳輸的數據;軟件需要先等待TXE=1,再等待TC=1。
535”
回復

使用道具 舉報

ID:959891 發表于 2022-2-14 18:14 | 顯示全部樓層
TEC 發表于 2022-2-14 13:39
數據手冊上是這么個意思。
“利用DMA發送
使用DMA進行發送,可以通過設置USART_CR3寄存器上的DMAT位激 ...

再您的指導下,我明白了,非常感謝。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表