
1.為什么需要DMA
首先看串口來傳遞信息:發(fā)送字符串。
發(fā)送函數(shù):在uart.c里增加下面發(fā)送函數(shù):

接下來在main.c里調(diào)用:


編譯make,

燒寫到開發(fā)板:
制作SD卡,設(shè)置開發(fā)板從SD卡啟動,設(shè)置好minicom后給開發(fā)板上電,緊接著按著空格鍵:

選擇[1]格式化NandFlash:


按照上面,選擇從USB燒寫image,然后選擇1,燒寫uboot。然后把USB線拉到虛擬機(jī),會顯示USB按著成功了。接下來就可以燒寫編譯好的.bin文件了。

在Linux里按著USB驅(qū)動:

接下來燒寫:


串口信息:

設(shè)置開發(fā)板從NandFlash啟動:

可以看到我們串口的信息已經(jīng)打印出來了。說明串口發(fā)送信息成功了。
接下來看原始數(shù)據(jù)的傳輸:

上面就是原始數(shù)據(jù)的傳輸機(jī)制,輸出的傳輸需要CPU全程參與,當(dāng)buf里的數(shù)據(jù)很大的時候,這機(jī)制就浪費了CPU的大部分資源。
所以DMA機(jī)制就出現(xiàn)了,有DMA的機(jī)制如下:

該機(jī)制里,當(dāng)需要傳輸數(shù)據(jù)的時候,CPU給DMA控制器命令,告訴DMA要去源地址拿數(shù)據(jù),送到目的地址,然后就可以去干別的事了。DMA控制器接受到CPU的命令后,通過內(nèi)存與串口的數(shù)據(jù)通道,會不停從源地址獲取數(shù)據(jù),送到目的地址,知道結(jié)束。這就是DMADirect Memory Access機(jī)制。
接下來看看2440的DMA:

可以看到2440的DMA是四通道的。
每一個通道的請求源:

DMA的基本時序:
例如UART0的請求源,對應(yīng)的是通道0(Ch-0),UART2對應(yīng)的是通道3.
DMA請求到啟動的過程時序圖:

首先是DREQ,DMA請求信號生效,當(dāng)請求信號生效兩個時鐘之后,響應(yīng)信號DACK生效,生效的時間是3個時鐘。DMA控制器正式接管了總線,就可以實現(xiàn)Read and Write了。
DMA的兩種工作模式:

6410的DMA:

可以看到6410有四個DMA控制器,每一個控制器有8個通道,就是說6410支持的是32DMA通道。
32通道支持的DMA源:

第一行的意思是:在DMA0或者SDMA0控制器的0通道上面,可以使用的是UART0源。依此類推。
四個控制器是DMA0,DMA1和SDMA0和SDMA1。在默認(rèn)的情況使用的是SDMA控制器,默認(rèn)值是0.
基本工作時序:

原理跟2440一樣的。
210的DMA:


上面可以看到210支持兩種類型的DMA:一種是內(nèi)存到內(nèi)存的,另一種是內(nèi)存到外設(shè)的。
210有三個控制器:DMA(內(nèi)存)、DMA0、DMA1.
三個控制器對應(yīng)的DMA源:



可以看到DMA源的后面都的是by only DMA0或DMA1,說明這種的DMA源只能給對應(yīng)的DMA控制器處理,如果是空白的則兩個都可以處理。
關(guān)鍵字:DMA 字符串
引用地址:
16.6410DMA簡述
推薦閱讀最新更新時間:2025-06-07 23:47
一個字符串,將里面的數(shù)字字符和其他字符分開存放的程序
C++編程從鍵盤上輸入一個字符串,將里面的數(shù)字字符轉(zhuǎn)變成數(shù)值儲存到數(shù)組中并輸出 程序1: #include iostream #include string using namespace std; int main() { char *ch=new char ;//定義一個動態(tài)char數(shù)組 int *num=new int ;//定義一個動態(tài)int數(shù)組 cout 請輸入一串字符: endl; cin ch;//輸入字符串 cout 這串字符串里數(shù)字有: endl; int a=0; for(int i=0;i strlen(ch);i++) { if(ch ='0'
[單片機(jī)]
OK6410A 開發(fā)板 (八) 118 linux-5.11 OK6410A linux對arm異常處理的相同部分解析
.section .vectors, ax , %progbits .L__vectors_start: W(b) vector_rst W(b) vector_und W(ldr) pc, .L__vectors_start + 0x1000 W(b) vector_pabt W(b) vector_dabt W(b) vector_addrexcptn W(b) vector_irq W(b) vector_fiq 每種處理方式中相同的部分 // 8個入口 1. 直接定義 2個 vector_rst: ARM( swi SYS_ERROR0 )
[單片機(jī)]
Linux下s3c6410的GPIO操作(2)
1、還接著看上一篇的這個函數(shù) arch_initcall(s3c64xx_gpiolib_init); static __init int s3c64xx_gpiolib_init(void) { s3c64xx_gpiolib_add(gpio_4bit, ARRAY_SIZE(gpio_4bit), s3c64xx_gpiolib_add_4bit); s3c64xx_gpiolib_add(gpio_4bit2, ARRAY_SIZE(gpio_4bit2), s3c64xx_gpiolib_add_4bit2); s3c64xx_gpiolib_add(gpio_2bit, ARRAY_SI
[單片機(jī)]
STM32 DMA傳輸?shù)膯栴}分析
問題1、 用戶使用STM32G473RET6芯片,開發(fā)環(huán)境STM32CubeMX+Keil(LL庫)。使用DMA1通道1,在半傳輸中斷和完全傳輸中斷里,拷貝ADC采集的數(shù)據(jù)。在應(yīng)用過程中發(fā)現(xiàn)DMA半傳輸中斷和完全傳輸中斷不能獨立使用。 具體體現(xiàn): 1、在DMA1初始化時,打開了半傳輸中斷,關(guān)閉完全傳輸中斷,照樣能觸發(fā)完全傳輸中斷 LL_DMA_EnableIT_HT(DMA1,LL_DMA_CHANNEL_1);//打開DMA1半傳輸中斷 LL_DMA_DisableIT_TC(DMA1,LL_DMA_CHANNEL_1);//關(guān)閉DMA1完全傳輸中斷 2、在DMA1初始化時,關(guān)閉了半傳輸中斷,打開完全傳輸中斷,照樣能觸發(fā)半傳
[單片機(jī)]
STM32F0使用LL庫實現(xiàn)DMA方式AD采集
在本次項目中,限于空間要求我們選用了STM32F030F4作為控制芯片。這款MCU不但封裝緊湊,而且自帶的Flash空間也非常有限,所以我們選擇了LL庫實現(xiàn)。在本文中我們將介紹基于LL庫的ADC的DMA采集方式。 1、概述 這次我們使用DMA方式實現(xiàn)對AD的采集,在遺忘我們使用HAL庫和標(biāo)準(zhǔn)庫都做過,這次我們使用LL庫來實現(xiàn)。接下來我們簡單了解一下STM32F030F4中的ADC和DMA。 首先看一看ADC,STM32F030F4是12位的ADC。它有多達(dá)19個多路復(fù)用通道,允許它測量來自16個外部和2個內(nèi)部源的信號。各種通道的A/D轉(zhuǎn)換可采用單通道、連續(xù)通道、掃描通道或不連續(xù)通道進(jìn)行。ADC的結(jié)果存儲在左對齊或右對齊的1
[單片機(jī)]
基于S3C6410的ARM11學(xué)習(xí)(五) 核心初始化之關(guān)閉看門狗
之前已經(jīng)完成了設(shè)置中斷向量表和設(shè)置處理器模式。下一步,就是要關(guān)閉看門狗。 看門狗,這個東西,在嵌入式系統(tǒng)里面是很常見的一個東西。這個是芯片預(yù)先做好的硬件,軟件可以對硬件進(jìn)行配置。說白了,這個東西就是一個定時器,定時器溢出的時候,如果設(shè)置開啟看門狗的話,就會強制CPU復(fù)位。這樣,好處就是防止程序跑飛。因為程序正常執(zhí)行的時候,我們肯定是要對看門狗計數(shù)清零的,這樣才能保證看門狗不會溢出,不會使CPU復(fù)位。 S3C6410的看門狗有兩個功能: 作為常規(guī)定時器,并且可以產(chǎn)生中斷 作為看門狗定時器,當(dāng)計數(shù)器遞減為0,產(chǎn)生復(fù)位信號。 下面是看門狗的框圖
[單片機(jī)]
STM32F103單片機(jī)使用DMA功能讀取ADC采樣數(shù)據(jù)
使用DMA功能操作外設(shè)時,可以極大的簡化代碼,提高程序的執(zhí)行效率。特別是在需要頻繁操作的外設(shè)上。比如現(xiàn)在要采集單片機(jī)16個ADC通道的電壓值,就可以使用DMA功能,直接將ADC通道轉(zhuǎn)換好的值,傳輸?shù)綌?shù)組中。需要操縱ADC的值時,直接去數(shù)組中拿數(shù)據(jù)就行。不需要再去判斷ADC數(shù)據(jù)轉(zhuǎn)換是否結(jié)束。下面直接通過代碼來實現(xiàn)。 首先初始化ADC,這里將ADC的16個采樣通道全部開啟。 void ADC1_Init ( void ) { GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphCloc
[單片機(jī)]
STM32HAL庫DMA模式串口收發(fā)
一.簡單了解 串口模式實現(xiàn)有三種 1.普通模式:在主函數(shù)中接收函數(shù) 2.中斷模式:產(chǎn)生的不影響主程序運行 3. DMA模式:與主函數(shù)互不影響,獨立運行 本文記錄第一種普通模式。 學(xué)習(xí)目標(biāo)是:實現(xiàn)DMA串口的數(shù)據(jù)收發(fā),發(fā)送數(shù)據(jù)時LED燈電平翻轉(zhuǎn)。 二.步驟 1-在原來工程基礎(chǔ)上,在stm32cubemx中增加dma,usart1中的DMA Settings,ADD USART1_RX循環(huán)接收和USART1_TX單次發(fā)送 2-添加MDA宏定義代碼 #define UART1_DMA uint8_t TdataDMA ={ welcome to uart DMA!rn }; uint8_t Rdata; 3-在主函數(shù)添加
[單片機(jī)]