『壹』 stm32單片機dma1通道之間有影響嗎
下面代碼是一個標准DMA設置,當然實際應用中可根據實際情況進行裁減:
DMA_DeInit(DMA_Channel1);
上面這句是給DMA配置通道,根據ST提供的資料,STM3210Fx中DMA包含7個通道(CH1~CH7),也就是說可以為外設或memory提供7座「橋梁」(請允許我使用橋梁一詞,我覺得更容易理解,哈哈,別「拍磚」呀!);
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
上面語句中的DMA_InitStructure是一個DMA結構體,在庫中有聲明了,當然使用時就要先定義了;DMA_PeripheralBaseAddr是該結構體中一個數據成員,給DMA一個起始地址,好比是一個buffer起始地址,數據流程是:外設寄存器à DMA_PeripheralBaseAddàmemory中變數空間(或flash中數據空間等),ADC1_DR_Address是我定義的一個地址變數;
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_ConvertedValue;
上面這句很顯然是DMA要連接在Memory中變數的地址,ADC_ConvertedValue是我自己在memory中定義的一個變數;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
上面的這句是設置DMA的傳輸方向,就如前面我所說的,DMA可以雙向傳輸,也可以單向傳輸,這里設置的是單向傳輸,如果需要雙向傳輸:把DMA_DIR_PeripheralSRC改成DMA_DIR_PeripheralDST即可。
DMA_InitStructure.DMA_BufferSize = 2;
上面的這句是設置DMA在傳輸時緩沖區的長度,前面有定義過了buffer的起始地址:ADC1_DR_Address ,為了安全性和可靠性,一般需要給buffer定義一個儲存片區,這個參數的單位有三種類型:Byte、HalfWord、word,我設置的2個half-word(見下面的設置);32位的MCU中1個half-word佔16 bits。
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
上面的這句是設置DMA的外設遞增模式,如果DMA選用的通道(CHx)有多個外設連接,需要使用外設遞增模式:DMA_PeripheralInc_Enable;我的例子里DMA只與ADC1建立了聯系,所以選用DMA_PeripheralInc_Disable
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
上面的這句是設置DMA的內存遞增模式,DMA訪問多個內存參數時,需要使用DMA_MemoryInc_Enable,當DMA只訪問一個內存參數時,可設置成:DMA_MemoryInc_Disable。
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
上面的這句是設置DMA在訪問時每次操作的數據長度。有三種數據長度類型,前面已經講過了,這里不在敘述。
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
與上面雷同。在此不再說明。
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
上面的這句是設置DMA的傳輸模式:連續不斷的循環模式,若只想訪問一次後就不要訪問了(或按指令操作來反問,也就是想要它訪問的時候就訪問,不要它訪問的時候就停止),可以設置成通用模式:DMA_Mode_Normal
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
上面的這句是設置DMA的優先順序別:可以分為4級:VeryHigh,High,Medium,Low.
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
上面的這句是設置DMA的2個memory中的變數互相訪問的
DMA_Init(DMA_Channel1,&DMA_InitStructure);
前面那些都是對DMA結構體成員的設置,在次再統一對DMA整個模塊做一次初始化,使得DMA各成員與上面的參數一致。
/*DMA Enable*/
DMA_Cmd(DMA_Channel1,ENABLE);
哈哈哈!這一句我想我就不羅嗦了,大家一看就明白。
至此,整個DMA總算設置好了,但是,DMA通道又是怎樣與外設聯系在一起的呢?哈哈,這也是我當初最想知道的一個事情,別急!容我想喝口茶~~~~~~哈哈哈!
要使DMA與外設建立有效連接,這不是DMA自身的事情,是各個外設的事情,每個外設都有 一個xxx_DMACmd(XXXx,Enable )函數,如果使DMA與ADC建立有效聯系,就使用ADC_DMACmd(ADC1,Enable); (這里我啟用了ADC中的ADC1模塊)。
『貳』 單片機里的DMA是什麼意思啊,有款單片機說具有DMA控制器,中的DMA是什麼意思啊
DMA就是直接存儲器訪問的首字母縮寫(Direct Memory Access)。
CPU的匯流排上同時會掛著多幾個存儲器,如果想要將存儲器1的內容復制到存儲器2,如果不用DMA的話,就得靠CPU直接去操作了,操作過程大致是:CPU准備好存儲器1的地址和控制信號,讀取存儲器1的內容,存放到CPU內部寄存器中,再准備好存儲器2的地址和控制信號,將寄存器中的內容寫入到存儲器2。
如果是單個數據的操作,這個過程都是必須的,效率問題也不明顯,但如果一次要復制大量數據(比如一幀圖像數據、一批語音數據等),那麼靠CPU這樣循環一個數據一個數據地操作,不僅速度慢(由於架構設計的原因,一般CPU訪問外部匯流排的速度都不是很高),還會導致CPU和匯流排一直被佔用,效率就非常低了。如果在CPU內部做一個硬體控制器,專門負責這種數據搬移操作(自動產生存儲器的地址和控制信號,自動實現讀寫時序),不僅速度可以提高很多,CPU還可以在此期間做其它的事情,這樣效率就會高很多了。DMA就是這么個意思,硬體上必須有一個DMA控制器來實現這一功能。
現在DMA的概念和作用已經大大延伸了,很多復雜CPU裡面甚至會包含很多個DMA控制器,DMA操作也不再僅限於外部存儲器了,內部存儲器之間、內部和外部存儲器之間、各種標准外設和存儲器之間,都有DMA控制器來實現數據交換,這樣CPU的功能越來越強,數據處理也越來越快。。
『叄』 單片機中DMA是什麼意思
DMA是一種不需要CPU參與傳送數據的方式,這樣可以節省大量的CPU資源。例如你需要傳送100個8位的數據到外設,如果用CPU來做可能是
char num[100];
char i;
for(i = 0; i < 100; i++)
{
P0 = num[i];
}
這樣cpu要執行100次for循環,如果用DMA方式只要把數據的個數和數據的起始地址給DMA接CPU就不用理會了。
『肆』 如何高效的使用單片機的DMA
有DMA功能的單片機很少的,特別是8位單片機,基本來說是沒有DMA功能,PIC24系列部分單片機有DMA功能,可以選用。8位單片機,比如51,也可以藉助8237實現DMA功能。
『伍』 51單片機syc89c52rc有沒有DMA
51單片機是沒有DMA的,不僅僅你說的這個型號,所有的51單片機都沒有,當然增強型的C8051除外。要想是普通51單片機具有DMA功能,可以用8237來擴展,8237是一款比較老的DMA擴展晶元了,典型電路很多,可以直接從網上找到。
『陸』 STM32F103 同一DMA的各個通道之間是並行的嗎
數據量較大, 執行時刻確定, 執行完之前所運行的程序不會修改源和目標數據區。
t為時間軸。
t0: start_DMA(); 執行完成需要 Tx 時間
t1: other();
t2: DMA_src_dst_op(); 下一次操作DMA相關數據區 ,也許是程序修改,也許是硬體功能。 為了保證數據正確,所以 t2 -t0 >= Tx
『柒』 單片機中DMA是甚麼意思
DMA是1種不需要CPU參與傳送數據的方式,這樣可以節省大量的CPU資源。例如你需要傳送100個8位的數據到外設,如果用CPU來做多是charnum
;chari;for(i=0;i100;i++)
這樣cpu要履行100次for循環,如果用DMA方式只要把數據的個數和數據的起始地址給DMA接CPU就不用理睬了。
『捌』 STM32 DMA時spi是並行嗎
只要不是同一個SPI就可以同時工作,什麼情況是使用同一個SPI呢,就是這個SPI的默認埠和它的復用埠只能選擇其中之一來使用這個SPI
『玖』 單片機DMA傳輸完成後會把目標地址清零嗎急!!
當然不會自動清零,你應當在進入DMA中斷後對目標數組進行處理,防止後續傳輸覆蓋掉原先的目標數組。
『拾』 arm stm32單片機dma傳輸數據時m3內核可以訪問內存嗎
應該是可以的,DMA就是解放CPU但是DMA傳輸數據時,CPU不能訪問DMA傳輸的那部分內存,有可能會造成傳輸出錯
具體也說不清,但是在播放音樂的常式中,用兩個緩沖區,這就是2個DMA各佔一塊內存互不幹涉