久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1695|回復: 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 所指示的通道
}          



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

使用道具 舉報

沙發
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”
回復

使用道具 舉報

5#
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品国产一区二区三区 | 黄色日本片 | 拍真实国产伦偷精品 | av播播 | 国产成人精品一区二 | 午夜影院在线观看 | 91网在线播放| 精品亚洲一区二区 | 久久久久久久一区 | 久久久精| 午夜在线 | 久久精品一 | 国产一区二区三区视频 | 国产成人啪免费观看软件 | 国产一区二区在线视频 | 国产精品久久久久国产a级 欧美日韩国产免费 | 亚洲 中文 欧美 日韩 在线观看 | 一区二区在线 | 国产亚洲一区精品 | 国产精品国产成人国产三级 | 伊人电影院av| 91视视频在线观看入口直接观看 | 北条麻妃av一区二区三区 | 色视频在线免费观看 | 精品欧美乱码久久久久久 | 亚洲激情一级片 | 激情欧美日韩一区二区 | 97国产精品视频人人做人人爱 | 亚洲视频免费观看 | 午夜av一区二区 | 羞羞视频在线免费 | 国产一区二区三区四区三区四 | 国产高清视频 | 亚洲午夜精品一区二区三区 | 成人免费激情视频 | 伊人网综合 | 六月色婷 | 精品成人在线视频 | 亚洲日韩中文字幕一区 | 黄色片免费在线观看 | 国产综合在线视频 |