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

標題: STM32的DMA [打印本頁]

作者: 51黑黑黑    時間: 2016-2-12 21:12
標題: STM32的DMA
  什么是DMA?其全稱是:Direct MemoryAccess;根據ST公司提供的相關信息,DMA是STM32中一個獨立與Cortex-M3內核的模塊,有點類似與ADC、PWM、TIMER等模塊;主要功能是通信“橋梁”的作用,可以將所有外設映射的寄存器“連接”起來,這樣就可以高速問各寄存器,其傳輸不受CPU的支配,傳輸還是雙向的;例如,從“表面”上看,它可以將flash中的數據與儲存器中變量建立通訊,還可以將一外設的積存器或緩沖器與另外設的寄存器或緩沖器建立雙向通訊,有點像把外設硬件之間用“導線”連接在一起了。其間的通訊不占CPU資源,訪問速度高,對于實時性強的應用將是一個很好的選擇;就像我們人一樣,我們平常習慣性的動作是不用經過大腦思考的,比如說眨眼睛,呼吸等。DMA就是負責這些工作的,但它沒人這么智能,需要將它設置好了它才會正常工作。當然,對于實時性非常強的,建議還是采用專用的DSP芯片。
怎樣啟用DMA?首先,眾所周知的是初始化,任何設備啟用前都要對其進行初始化,要對模塊初始化,還要先了解該模塊相應的結構及其函數,以便正確的設置;由于DMA較為復雜,我就只談談DMA的基本結構和和常用函數,這些都是ST公司提供在庫函數中的。在一個重要的條件就是觸發源是什么,就是說什么時候進行DMA數據傳輸呢?這叫觸發信號。也可以通過軟件編程設置具體時間,具體條件來觸發DMA數據傳輸,DMA的觸發源是事件,下面代碼是一個標準DMA設置,當然實際應用中可根據實際情況進行裁減,當然這之前得開啟DMA時鐘:

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//開啟DMA1時鐘

結構體(DMA_InitTypeDef)說明:
  PeripheralBaseAddr:外設地址 CPAR
  MemoryBaseAddr: 存儲器地址 CMAR
  DIR:        傳輸方向(從外設讀/從存儲器讀)
  BufferSize:     傳輸數量
  PeripheralInc:    外設地址增量模式(傳完一個數后地址是否+1)
  MemoryInc:     存儲器地址增量模式
  PeripheralDataSize: 外設數據寬度(Byte / Half Word /Word)
  MemoryDataSize:  存儲器數據寬度
  Mode:        循環/正常
  Priority:       優先級
  M2M:        存儲器到存儲器模式

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占16bits。
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_Cmd(DMA_Channel1,ENABLE);
這一句我想我就不羅嗦了,大家一看就明白。









作者: 愛學習的朋友    時間: 2017-1-7 22:02
受教了




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 久久人| 国产极品粉嫩美女呻吟在线看人 | 成人在线电影网站 | 中文字幕第49页 | 久久精品亚洲成在人线av网址 | 九九色综合 | 欧美视频免费在线 | 久久一区二区av | 成人视屏在线观看 | 精品国产乱码久久久久久88av | 亚洲在线免费观看 | 国产精品久久久免费 | 日本久久网 | 日韩精品一区二区三区在线播放 | 久久精品男人的天堂 | 精品亚洲一区二区 | 国产亚洲一区二区精品 | 日韩精品一区在线 | 国产精品久久久久久久7电影 | 美国一级片在线观看 | 99久久久久| 性高湖久久久久久久久3小时 | av毛片在线免费观看 | 国产在线a | 国产精品一二三区在线观看 | 亚洲成人av | 色999日韩 | 999观看免费高清www | 欧美日韩不卡合集视频 | 亚洲码欧美码一区二区三区 | 久久人人国产 | 在线观看黄色大片 | 一区二区三 | 自拍偷拍亚洲一区 | 1000部精品久久久久久久久 | 影音先锋中文字幕在线观看 | 日韩一区二区三区在线 | 一区二区三区高清不卡 | 精品视频在线一区 | av黄色免费在线观看 | 欧美一级久久 |