主頁 > 作業系統 > STM32 DMA詳解

STM32 DMA詳解

2021-02-03 06:08:46 作業系統

本文是根據STM32F207的用戶手冊翻譯整理而來

1、綜述

DMA(Direct memory access)直接記憶體訪問,被用于記憶體和記憶體之間或記憶體和外設之間的高速資料傳輸,資料傳輸可以在沒有CPU的干預下快速移動,這樣可以保持CPU資源處理其他事情

DMA 控制器基于復雜的總線矩陣架構,將功能強大的雙 AHB 主總線架構與獨立的 FIFO 結

合在一起,優化了系統帶寬,下圖①處,可以看出雙 AHB 主總線架構與獨立的 FIFO的結構

注意看英文備注:

DMA1控制器AHB外設埠沒有像DMA2一樣連接到總線矩陣,所以只有DMA2資料流可以執行存盤器到存盤器的傳輸

我們對上圖的②處,(DMA1和DMA2結構一樣,我們就選擇DMA1)詳細看

 

①每個資料流總共可以有多達 8 個通道(或稱請求)

②DMA1共有8個資料資料流(兩個DMA共有16個資料流)

③每個DMA都有資料流仲裁器,用于處理 DMA 請求間的優先級

④DMA的資料流又有獨立的FIFO

⑤DMA采用雙 AHB 主總線架構

備注:

①處是選擇器,配置完成只能選擇一個通道,而③處是仲裁器,也就是說,配置完成,可能8個資料流全部存在,由仲裁器判斷優先級

2、DMA事務

DMA從傳輸事務包含一系列的給定數目的資料傳輸序列,傳輸的數目可以通過軟體編程,8位,16位或32位,

每一次DMA傳輸包含3個操作

  • 通過 DMA_SxPAR 或 DMA_SxM0AR 暫存器尋址,從外設資料暫存器或存盤器單元中加載資料,
  • 通過 DMA_SxPAR 或 DMA_SxM0AR 暫存器尋址,將加載的資料存盤到外設資料暫存器或存盤器單元
  • DMA_SxNDTR 計數器在資料存盤結束后遞減,該計數器中包含仍需執行的事務數

在產生事件后,外設會向 DMA 控制器發送請求信號, DMA 控制器根據通道優先級處理該請求,只要 DMA 控制器訪問外設, DMA 控制器就會向外設發送確認信號,外設獲得 DMA 控制器的確認信號后,便會立即釋放其請求,一旦外設使請求失效, DMA 控制器就會釋放確認信號,如果有更多請求,外設可以啟動下一個事務

3、通道選擇

每個資料流可以有8個通道

 

通過上圖①可以看出,通道選擇仲裁器可以通過DMA_SxCR暫存器的CHSEL[2:0]配置

DMA的請求可以來自TIM,ADC,SPI等外設

DMA1的請求通道

 

DMA2的請求通道

 

4、仲裁器

仲裁器為兩個 AHB 主埠(存盤器和外設埠)提供基于請求優先級的 8 個 DMA 資料流請求管理,并啟動外設/存盤器訪問序列,

優先級管理分為兩個階段

  • 軟體:每個資料流優先級都可以在 DMA_SxCR 暫存器中配置,分為四個級別:非常高優先級、高優先級、中優先級、低優先級
  • 硬體:如果兩個請求具有相同的軟體優先級,則編號低的資料流優先于編號高的資料流,例如,資料流 2 的優先級高于資料流 4

5、DMA資料流

8個DMA控制器資料流都能夠提供源和目標之間的單向傳輸鏈路

每個資料流配置后都可以執行

  • 常規型別事務:存盤器到外設、外設到存盤器或存盤器到存盤器的傳輸
  • 雙緩沖區型別事務:使用存盤器的兩個存盤器指標的雙緩沖區傳輸(當 DMA 正在進行自/至緩沖區的讀/寫操作時,應用程式可以進行至/自其它緩沖區的寫/讀操作)

要傳輸的資料量(多達 65535)可以編程,并與連接到外設 AHB 埠的外設(請求 DMA 傳輸)的源寬度相關,每個事務完成后,包含要傳輸的資料項總量的暫存器都會遞減,

6、源、目標和傳輸模式

源地址和目標地址可以在整個4G地址空間,在0x00000000和0xFFFFFFFF之間

在DNA_SxCR寄存求的DIR[1:0]配置DMA的傳輸方式

 

源地址和目標地址的關系

 

當資料寬度是半字或字時,外設地址或存盤器地址必須是半字或字對齊

6.1、外設到存盤器模式

當配置成外設到存盤器的DMA傳輸模式時,兩種模式

  • FIFO模式:外設有DMA請求(TIM溢位,PWM下降沿等)時,DMA會搬運源資料(外設資料)到FIFO,當FIFO滿時,將數傳輸給目標地址(記憶體)
  • 直連模式:配置直連模式,DMA_SxFCR 暫存器中的 DMDIS 值為“0”,不使用 FIFO 的閾值級別控制:每完成一次從外設到 FIFO 的資料傳輸后,相應的資料立即就會移出并存盤到目標中,

 

傳輸開始條件,使能資料流(DMA_SxCR 暫存器中的位 EN 置 1),然后外設發出請求,再然后該請求贏得了資料流仲裁,才會開始傳輸,

 

傳輸停止條件,下列滿足一條即可

  • DMA_SxNDTR 暫存器達到零
  • 外設請求傳輸終止
  • DMA_SxCR 暫存器中的 EN 位由軟體清零

6.2 存盤器到外設模式

FIFO模式

這種模式,只要使能資料流(DMA_SxCR 暫存器中的位 EN 置 1),存盤器資料就會傳輸到FIFO中,發生外設請求,FIFO資料會移出并存盤到目標地址,當FIFO小于閾值,存盤器的資料會多載FIFO,

 

直連模式

使能資料流時,DMA傳輸存盤器的第一個資料到內部FIFO,發生外設請求時,DMA把預裝在值發送的目標地址,然后進行下一個資料的傳輸,預裝載的資料大小為 DMA_SxCR 暫存器中 PSIZE 位欄位的值

 

傳輸停止條件,下列滿足一條即可

  • DMA_SxNDTR 暫存器達到零
  • 外設請求傳輸終止
  • DMA_SxCR 暫存器中的 EN 位由軟體清零

存盤器到外設模式和外設到存盤器模式一樣,同樣需要對應資料流贏得仲裁,才會啟動傳輸

 

6.3 存盤器到存盤器模式

這種模式較為簡單,沒有外設請求

啟動傳輸

DMA_SxCR 暫存器中的使能位 (EN) 置 1 來使能資料流時,資料就會從源地址傳輸到FIFO,到達FIFO閾值時,FIFO資料移出到目標地址

 

停止傳輸,下列滿足一條即可

  • DMA_SxNDTR 暫存器達到零
  • DMA_SxCR 暫存器中的 EN 位由軟體清零

當然,同樣該資料流需要贏得仲裁

 

7、指標遞增

外設和存盤器指標在每次傳輸后自動向后遞增或保持常量,根據DMA_SxCR暫存器的PINC和MINC位,

禁止遞增模式時非常有用的,當外設源和目標資料是通過單個暫存器訪問的

如果使能了遞增模式,則根據在 DMA_SxCR 暫存器 PSIZE 或 MSIZE 位中編程的資料寬度,下一次傳輸的地址將是前一次傳輸的地址遞增 1(對于位元組)、 2(對于半字)或 4(對于字)

為了優化封裝操作,可以不管 AHB 外設埠上傳輸的資料的大小,將外設地址的增量偏移大小固定下來, DMA_SxCR 暫存器中的 PINCOS 位用于將增量偏移大小與外設 AHB 埠或32 位地址(此時地址遞增 4)上的資料大小對齊, PINCOS 位僅對 AHB 外設埠有影響,

如果將 PINCOS 位置 1,則不論 PSIZE 值是多少,下一次傳輸的地址總是前一次傳輸的地址遞增 4(自動與 32 位地址對齊) ,但是, AHB 存盤器埠不受此操作影響,

如果 AHB 外設埠或 AHB 存盤器埠分別請求突發事務,為了滿足 AMBA 協議(在固定地址模式下不允許突發事務),則需要將 PINC 或 MINC 位置 1,

8、回圈模式

回圈模式可用于處理回圈緩沖區和連續資料流(例如 ADC 掃描模式),可以使用 DMA_SxCR?暫存器中的 CIRC 位使能此特性,

當激活回圈模式時,要傳輸的資料項的數目在資料流配置階段自動用設定的初始值進行加載,并繼續回應 DMA 請求,

也就是說,比如我們要從記憶體中采集 64 個位元組發送到串口,如果設定為重復采集,那么它會在 64 個位元組采集完成之后繼續從記憶體的第一個地址采集,如此回圈,這里我們設定為一次連續采集完成之后不回圈,所以設定值為 DMA_Mode_Normal,在我們下面的實驗中,如果設定此引數為回圈采集,那么你會看到串口不停的列印資料,不會中斷,

9、雙緩沖模式

此模式可用于所有 DMA1 和 DMA2 資料流,

通過將 DMA_SxCR 暫存器中的 DBM 位置 1,即可使能雙緩沖區模式,

除了有兩個存盤器指標之外,雙緩沖區資料流的作業方式與常規(單緩沖區)資料流的一樣,使能雙緩沖區模式時,將自動使能回圈模式( DMA_SxCR 中的 CIRC 位的狀態是“無關”),并在每次事務結束時交換存盤器指標,

在此模式下,每次事務結束時, DMA 控制器都從一個存盤器目標交換為另一個存盤器目標,這樣,軟體在處理一個存盤器區域的同時, DMA 傳輸還可以填充/使用第二個存盤器區域

基于DMA雙緩沖模式的的特點,應用中必須開辟兩個存盤區以及存放兩個存盤區首地址的存盤暫存器,DMA_SxM0AR和DMA_SxM1AR,

1:DMA_SxM0AR:指向存盤區0(DMA_Memory_0),單緩沖模式下默認使用該暫存器做存盤區指標,

2:DMA_SxM1AR:指向存盤區1(DMA_Memory_1),僅在DMA雙緩沖模式下才能使用,

3:DMA正在訪問的當前存盤區由DMA_SxCR表示

CT:當前目標

CT = 0:DMA正在訪問存盤區0,CPU可以訪問存盤區1

CT = 1:DMA正在訪問存盤區1,CPU可以訪問存盤區0

 

優點:

使用DMA雙緩沖傳輸,既可以減少CPU的負荷,又能最大程度地實作DMA資料傳輸和CPU資料處理互不打擾又互不耽擱,DMA雙緩沖模式的回圈特性,使用它對存盤區的空間容量要求也會大大降低,尤其在大批量資料傳送時,你只需開辟兩個合適大小的存盤區,能滿足DMA在切換存盤區時的當前新存盤區空出來就好,并不一定要開辟多大多深的存盤空間,單純一味地加大雙緩沖區的深度并不明顯改善資料傳輸狀況

 

10、可編程資料寬度、封裝/解封、位元組順序

要傳輸的資料項數目必須在使能資料流之前編程到 DMA_SxNDTR(要傳輸資料項數目位,NDT)中,當流控制器是外設且 DMA_SxCR 中的 PFCTRL 位置為 1 時除外,

當使用內部 FIFO 時,源和目標資料的資料寬度可以通過 DMA_SxCR 暫存器的 PSIZE 和MSIZE 位(可以是 8、 16 或32 位)編程

 

11、單次傳輸和突發傳輸

DMA控制器可以產生一個單次傳輸或者4、8或16節拍的突發傳輸

突發大小通過軟體針對兩個 AHB 埠獨立配置,配置時使用 DMA_SxCR 暫存器中的MBURST[1:0] 和 PBURST[1:0] 位

突發大小指示突發中的節拍數,而不是傳輸的位元組數,

為確保資料一致性,形成突發的每一組傳輸都不可分割:在突發傳輸序列期間, AHB 傳輸會鎖定,并且 AHB 總線矩陣的仲裁器不解除對 DMA 主總線的授權,

根據單次或突發配置的情況,每個 DMA 請求在 AHB 外設埠上相應地啟動不同數量的傳輸

  • 當 AHB 外設埠被配置為單次傳輸時,根據 DMA_SxCR 暫存器 PSIZE[1:0] 位的值,每個 DMA 請求產生一次位元組、半字或字的資料傳輸
  • 當 AHB 外設埠被配置為突發傳輸時,根據 DMA_SxCR 暫存器 PBURST[1:0] 和PSIZE[1:0] 位的值,每個 DMA 請求相應地生成 4 個、 8 個或 16 個節拍的位元組、半字或字的傳輸

對于需要配置 MBURST 和 MSIZE 位的 AHB 存盤器埠,必須考慮與上述相同的內容,在直接模式下,資料流只能生成單次傳輸,而 MBURST[1:0] 和 PBURST[1:0] 位由硬體強制配置,

必須選擇地址指標(DMA_SxPAR 或 DMA_SxM0AR 暫存器),以確保一個突發塊內的所有傳輸在等于傳輸大小的地址邊界對齊

選擇突發配置必須要遵守 AHB 協議,即突發傳輸不得越過 1 KB 地址邊界,因為可以分配給單個從設備的最小地址空間是 1 KB,這意味著突發塊傳輸不應越過 1 KB 地址邊界,否則就會產生一個 AHB 錯誤,并且 DMA 暫存器不會報告這個錯誤,

 

12、FIFO

FIFO結構

FIFO是用來臨時存盤從源地址傳來的資料,在這些資料被發送到目的地市之前,

每個資料流都有獨立的4字FIFO,他們可以被軟體配置為1/4、1/2、3/4或滿

使用FIFO閾值,必須禁止直接模式

下圖是FIFO結構和資料源、閾值關系的示意圖

 

FIFO閾值和突發設定

警告被要求,選擇 FIFO 閾值(DMA_SxFCR 暫存器的位 FTH[1:0])和存盤器突發大(DMA_SxCR 暫存器的 MBURST[1:0] 位):FIFO 閾值指向的內容必須與整數個存盤器突發傳輸完全匹配,如果不是這樣,當使能資料流時將生成一個 FIFO 錯誤( DMA_HISR 或 DMA_LISR暫存器的標志 FEIFx),然后將自動禁止資料流

 

FIFO更新

FIFO可以被更新,當資料流被禁止通過寫入DMA_SxCR暫存器的EN位和當資料被配置成外設到存盤器或存盤區到存盤區模式:如果禁止資料流時仍有某些資料存留在FIFO 中, DMA 控制器會將剩余的資料繼續傳輸到目標(即使已經有效禁止了資料流),重繪完成時,會將 DMA_LISR 或 DMA_HISR 暫存器中的傳輸完成狀態位 (TCIFx) 置 1,

在這種情況下,剩余資料計數器 DMA_SxNDTR 保持的值指示在目標存盤器現有多少可用資料項,

直接模式

默認情況下, FIFO 以直接模式操作(將 DMA_SxFCR 中的 DMDIS 位置 1),不使用 FIFO閾值級別,如果在每次 DMA 請求之后,系統需要至/自存盤器的立即和單獨傳輸,這種模式非常有用,

當在直接模式(禁止 FIFO)下將 DMA 配置為以存盤器到外設模式傳輸資料時, DMA 會將一個資料從存盤器預加載到內部 FIFO,從而確保一旦外設觸發 DMA 請求時則立即傳輸資料

 

13、DMA傳輸完成

以下各種事件均可以結束傳輸程序,并將 DMA_LISR 或 DMA_HISR 狀態暫存器中的 TCIFx位置 1

  • 在 DMA 流控制器模式下:①在存盤器到外設模式下, DMA_SxNDTR 計數器已達到零,②傳輸結束前禁止了資料流(通過將 DMA_SxCR 暫存器中的 EN 位清零),并在傳輸是外設到存盤器或存盤器到存盤器的模式時,所有的剩余資料均已從 FIFO 重繪到存盤器
  • 在外設流控制器模式下:①已從外設生成最后的外部突發請求或單獨請求,并當 DMA 在外設到存盤器模式下作業時,剩余資料已從 FIFO 傳輸到存盤器②資料流由軟體禁止,并當 DMA 在外設到存盤器模式下作業時,剩余資料已從 FIFO傳輸到存盤器

14、DMA傳輸暫停

可以隨時暫停 DMA 傳輸以供稍后重新開始;也可以在 DMA 傳輸結束前明確禁止暫停功能,分兩種情況

  • 資料流禁止傳輸,以后不從停止點重新開始暫停,這種情況下,只需將 DMA_SxCR 暫存器中的 EN 位清零來禁止資料流,除此之外不需要任何其他操作,禁止資料流可能要花費一些時間(需要首先完成正在進行的傳輸),需要將傳輸完成中斷標志(DMA_LISR 或DMA_HISR 暫存器中的 TCIF)置 1 來指示傳輸結束,現在 DMA_SxCR 中的 EN 位的值是“0”,借此確認資料流已經終止傳輸, DMA_SxNDTR 暫存器包含資料流停止時剩余資料項的數目,這樣軟體便可以確定資料流中斷前已傳輸了多少資料項,
  • 資料流在 DMA_SxNDTR 暫存器中要傳輸的剩余資料項數目達到 0 之前暫停傳輸,目的是以后通過重新使能資料流重新開始傳輸,為了在傳輸停止點重新開始傳輸,軟體必須在通過寫入 DMA_SxCR 暫存器中的 EN 位(然后檢查確認該位為‘0’)禁止資料流之后,首先讀寫入DMA_SxNDTR 暫存器來了解已經收集的資料項的數目,然后①必須更新外設和/或存盤器地址以調整地址指標②必須使用要傳輸的剩余資料項的數目(禁止資料流時讀取的值)更新 SxNDTR 暫存器③然后可以重新使能資料流,從停止點重新開始傳輸

15、流控制器

控制要傳輸的資料數目的物體稱為流控制器,此流控制器使用 DMA_SxCR 暫存器中的PFCTRL 位針對每個資料流獨立配置

流控制器可以是:

  • DMA 控制器:在這種情況下,要傳輸的資料項的數目在使能 DMA 資料流之前由軟體編程到 DMA_SxNDTR 暫存器
  • 外設源或目標:當要傳輸的資料項的數目未知時屬于這種情況,當所傳輸的是最后的資料時,外設通過硬體向 DMA 控制器發出指示,僅限能夠發出傳輸結束信號的外設支持此功能,也就是SDIO

16、流配置程序

配置 DMA 資料流 x(其中 x 是資料流編號)時應遵守下面的順序

  1. 如果使能了資料流,通過重置 DMA_SxCR 暫存器中的 EN 位將其禁止,然后讀取此位以確認沒有正在進行的資料流操作,將此位寫為 0 不會立即生效,因為實際上只有所有當前傳輸都已完成時才會將其寫為 0, 當所讀取 EN 位的值為 0 時,才表示可以配置資料流,因此在開始任何資料流配置之前,需要等待 EN 位置 0,應將先前的資料塊 DMA傳輸中在狀態暫存器(DMA_LISR 和 DMA_HISR)中置 1 的所有資料流專用的位置 0,然后才可重新使能資料流
  2. 在 DMA_SxPAR 暫存器中設定外設埠暫存器地址,外設事件發生后,資料會從此地址移動到外設埠或從外設埠移動到此地址
  3. 在 DMA_SxMA0R 暫存器(在雙緩沖區模式的情況下還有 DMA_SxMA1R 暫存器)中設定存盤器地址,外設事件發生后,將從此存盤器讀取資料或將資料寫入此存盤器
  4. 在 DMA_SxNDTR 暫存器中配置要傳輸的資料項的總數,每出現一次外設事件或每出現一個節拍的突發傳輸,該值都會遞減
  5. 使用 DMA_SxCR 暫存器中的 CHSEL[2:0] 選擇 DMA 通道(請求)
  6. 如果外設用作流控制器而且支持此功能,請將 DMA_SxCR 暫存器中的 PFCTRL 位置 1
  7. 使用 DMA_SxCR 暫存器中的 PL[1:0] 位配置資料流優先級
  8. 配置 FIFO 的使用情況(使能或禁止,發送和接收閾值)
  9. 配置資料傳輸方向、外設和存盤器增量 / 固定模式、單獨或突發事務、外設和存盤器資料寬度、回圈模式、雙緩沖區模式和傳輸完成一半和/或全部完成,和/或 DMA_SxCR暫存器中錯誤的中斷
  10. 通過將 DMA_SxCR 暫存器中的 EN 位置 1 激活資料流

一旦使能了流,即可回應連接到資料流的外設發出的任何 DMA 請求,

一旦在 AHB 目標埠上傳輸了一半資料,傳輸一半標志 (HTIF) 便會置 1,如果傳輸一半中斷使能位 (HTIE) 置 1,還會生成中斷,傳輸結束時,傳輸完成標志 (TCIF) 便會置 1,如果傳輸完成中斷使能位 (TCIE) 置 1,還會生成中斷,

 

17、中斷

對于每個 DMA 資料流,可在發生以下事件時產生中斷

  • 傳輸一半時
  • 傳輸完成時
  • 傳輸錯誤時
  • FIFO錯誤(溢位,下溢或FIFO等級錯誤)
  • 直接模式錯誤

中斷串列

18、代碼配置

配置代碼

/* Configure DMA Stream */
DMA_InitStructure.DMA_Channel = DMA_Channel_0;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SRC_Const_Buffer;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)DST_Buffer;
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToMemory;
DMA_InitStructure.DMA_BufferSize = (uint32_t)32;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;.          
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_Init(DMA2_Stream0, &DMA_InitStructure);

 

設定 DMA 資料流對應的通道,供每個資料流選擇的通道請求多達 8 個,取值有

#define DMA_Channel_0                     ((uint32_t)0x00000000)
#define DMA_Channel_1                     ((uint32_t)0x02000000)
#define DMA_Channel_2                     ((uint32_t)0x04000000)
#define DMA_Channel_3                     ((uint32_t)0x06000000)
#define DMA_Channel_4                     ((uint32_t)0x08000000)
#define DMA_Channel_5                     ((uint32_t)0x0A000000)
#define DMA_Channel_6                     ((uint32_t)0x0C000000)
#define DMA_Channel_7                     ((uint32_t)0x0E000000)

DMA 傳輸的外設基地址,假設進行uart1串口DMA 傳輸,我們可以按照暫存器的地址偏移直接設定地址:0x40011004,也可以直接使用ST提供庫的表示方法:&USART1->DR

 

DMA_Memory0BaseAddr :

DMA 傳輸的記憶體基地址

 

DMA_DIR:

設定資料傳輸方向,有存盤器到存盤器,存盤器到外設,外設到存盤器三種選擇,取值有:

#define DMA_DIR_PeripheralToMemory ((uint32_t)0x00000000)
#define DMA_DIR_MemoryToPeripheral ((uint32_t)0x00000040) 
#define DMA_DIR_MemoryToMemory ((uint32_t)0x00000080)

DMA_BufferSize:

設定一次傳輸資料量的大小

 

DMA_PeripheralInc:

設定傳輸資料的時候外設地址是不變還是遞增,如果設定為遞增,那么下一次傳輸的時候地址加 1,取值有:

#define DMA_PeripheralInc_Enable ((uint32_t)0x00000200)
#define DMA_PeripheralInc_Disable ((uint32_t)0x00000000)

 

DMA_MemoryInc:

設定傳輸資料時 候記憶體地址 是否遞增, 這個引數和DMA_PeripheralInc 意思接近,只不過針對的是記憶體(存盤器),取值有:

#define DMA_MemoryInc_Enable ((uint32_t)0x00000400)
#define DMA_MemoryInc_Disable ((uint32_t)0x00000000)

DMA_PeripheralDataSize:

設定外設的資料長度是為位元組傳輸(8bits),半字 傳 輸 (16bits) 還 是 字 傳 輸 (32bits),取值有:

#define DMA_PeripheralDataSize_Byte ((uint32_t)0x00000000)
#define DMA_PeripheralDataSize_HalfWord ((uint32_t)0x00000800)
#define DMA_PeripheralDataSize_Word ((uint32_t)0x00001000)

 

DMA_MemoryDataSize:

用來設定記憶體的資料長度

 

DMA_Mode:

設定 DMA 模式是否回圈采集,取值有:

#define DMA_Mode_Normal ((uint32_t)0x00000000)
#define DMA_Mode_Circular ((uint32_t)0x00000100)

 

DMA_Priority:

設定 DMA 通道的優先級,有低,中,高,超高三種模式,就是仲裁器仲裁的時候用的,當多個資料流同時開啟,DMA仲裁器優先處理優先級高的資料流,取值有:

#define DMA_Priority_Low ((uint32_t)0x00000000)
#define DMA_Priority_Medium ((uint32_t)0x00010000)
#define DMA_Priority_High ((uint32_t)0x00020000)
#define DMA_Priority_VeryHigh ((uint32_t)0x00030000)

 

DMA_FIFOMode:

設定是否開啟 FIFO 模式,取值有:

#define DMA_FIFOMode_Disable ((uint32_t)0x00000000)
#define DMA_FIFOMode_Enable ((uint32_t)0x00000004)

 

DMA_FIFOThreshold:

選擇 FIFO 閾值,只有上個引數選擇使能FIFO,這個引數才有用,取值有:

#define DMA_FIFOThreshold_1QuarterFull ((uint32_t)0x00000000)
#define DMA_FIFOThreshold_HalfFull ((uint32_t)0x00000001)
#define DMA_FIFOThreshold_3QuartersFull ((uint32_t)0x00000002)
#define DMA_FIFOThreshold_Full ((uint32_t)0x00000003)

 

DMA_MemoryBurst:

配置存盤器突發傳輸配置,可以選擇為 4 個節拍的增量突發傳輸 ,8 個節拍的增量突發傳輸 , 16 個街拍的增量突發傳輸以及單次傳輸,取值有:

#define DMA_MemoryBurst_Single ((uint32_t)0x00000000)
#define DMA_MemoryBurst_INC4 ((uint32_t)0x00800000)
#define DMA_MemoryBurst_INC8 ((uint32_t)0x01000000)
#define DMA_MemoryBurst_INC16 ((uint32_t)0x01800000)

 

DMA_PeripheralBurst:

配置外設突發傳輸配置,跟前面一個引數DMA_MemoryBurst 作用類似,只不過一個針對的是存盤器,取值有:

#define DMA_PeripheralBurst_Single ((uint32_t)0x00000000)
#define DMA_PeripheralBurst_INC4 ((uint32_t)0x00200000)
#define DMA_PeripheralBurst_INC8 ((uint32_t)0x00400000)
#define DMA_PeripheralBurst_INC16 ((uint32_t)0x00600000)

 

開源地址:

https://github.com/strongercjd/STM32F207VCT6

 

點擊查看本文所在的專輯,STM32F207教程

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/255813.html

標籤:其他

上一篇:Shell 腳本編程最佳實踐

下一篇:開啟了VMDHCP和VMNET,虛擬機網路連接采用NET模式,虛擬機mac以太網顯示已連接卻無法聯網

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • CA和證書

    1、在 CentOS7 中使用 gpg 創建 RSA 非對稱密鑰對 gpg --gen-key #Centos上生成公鑰/密鑰對(存放在家目錄.gnupg/) 2、將 CentOS7 匯出的公鑰,拷貝到 CentOS8 中,在 CentOS8 中使用 CentOS7 的公鑰加密一個檔案 gpg -a ......

    uj5u.com 2020-09-10 00:09:53 more
  • Kubernetes K8S之資源控制器Job和CronJob詳解

    Kubernetes的資源控制器Job和CronJob詳解與示例 ......

    uj5u.com 2020-09-10 00:10:45 more
  • VMware下安裝CentOS

    VMware下安裝CentOS 一、軟硬體準備 1 Centos鏡像準備 1.1 CentOS鏡像下載地址 下載地址 1.2 CentOS鏡像下載程序 點擊下載地址進入如下圖的網站,選擇需要下載的版本,這里選擇的是Centos8,點擊如圖所示。 決定選擇Centos8后,選擇想要的鏡像源進行下載,此 ......

    uj5u.com 2020-09-10 00:12:10 more
  • 如何使用Grep命令查找多個字串

    如何使用Grep 命令查找多個字串 大家好,我是良許! 今天向大家介紹一個非常有用的技巧,那就是使用 grep 命令查找多個字串。 簡單介紹一下,grep 命令可以理解為是一個功能強大的命令列工具,可以用它在一個或多個輸入檔案中搜索與正則運算式相匹配的文本,然后再將每個匹配的文本用標準輸出的格式 ......

    uj5u.com 2020-09-10 00:12:28 more
  • git配置http代理

    git配置http代理 經常遇到克隆 github 慢的問題,這里記錄一下幾種配置 git 代理的方法,解決 clone github 過慢。 目錄 git配置代理 git單獨配置github代理 git配置全域代理 配置終端環境變數 git配置代理 主要使用 git config 命令 git單獨 ......

    uj5u.com 2020-09-10 00:12:33 more
  • Linux npm install 裝包時提示Error EACCES permission denied解

    npm install 裝包時提示Error EACCES permission denied解決辦法 ......

    uj5u.com 2020-09-10 00:12:53 more
  • Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包

    Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包。 18 (flaskApi) [root@67 flaskDemo]# yum -y install nginx 19 已加載插件:fastestmirror, langpacks 20 Loading ......

    uj5u.com 2020-09-10 00:13:13 more
  • Linux查看服務器暴力破解ssh IP

    在公網的服務器上經常遇到別人爆破你服務器的22埠,用來挖礦或者干其他嘿嘿嘿的事情~ 這種情況下正確的做法是: 修改默認ssh的22埠 使用設定密鑰登錄或者白名單ip登錄 建議服務器密碼為復雜密碼 創建普通用戶登錄服務器(root權限過大) 建立堡壘機,實作統一管理服務器 統計爆破IP [root ......

    uj5u.com 2020-09-10 00:13:17 more
  • CentOS 7系統常見快捷鍵操作方式

    Linux系統中一些常見的快捷方式,可有效提高操作效率,在某些時刻也能避免操作失誤帶來的問題。 ......

    uj5u.com 2020-09-10 00:13:31 more
  • CentOS 7作業系統目錄結構介紹

    作業系統存在著大量的資料檔案資訊,相應檔案資訊會存在于系統相應目錄中,為了更好的管理資料資訊,會將系統進行一些目錄規劃,不同目錄存放不同的資源。 ......

    uj5u.com 2020-09-10 00:13:35 more
最新发布
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:43:21 more
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:42:36 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:26:53 more
  • 設定Windows主機的瀏覽器為wls2的默認瀏覽器

    這里以Chrome為例。 1. 準備作業 wsl是可以使用Windows主機上安裝的exe程式,出于安全考慮,默認情況下改功能是無法使用。要使用的話,終端需要以管理員權限啟動。 我這里以Windows Terminal為例,介紹如何默認使用管理員權限打開終端,具體操作如下圖所示: 2. 操作 wsl ......

    uj5u.com 2023-04-19 09:25:49 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:19:04 more
  • Linux學習筆記

    IP地址和主機名 IP地址 ifconfig可以用來查詢本機的IP地址,如果不能使用,可以通過install net-tools安裝。 Centos系統下ens33表示主網卡;inet后表示IP地址;lo表示本地回環網卡; 127.0.0.1表示代指本機;0.0.0.0可以用于代指本機,同時在放行設 ......

    uj5u.com 2023-04-18 06:52:01 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:50 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:01 more
  • 你是不是暴露了?

    作者:袁首京 原創文章,轉載時請保留此宣告,并給出原文連接。 如果您是計算機相關從業人員,那么應該經歷不止一次網路安全專項檢查了,你肯定是收到過資訊系統技術檢測報告,要求你加強風險監測,確保你提供的系統服務堅實可靠了。 沒檢測到問題還好,檢測到問題的話,有些處理起來還是挺麻煩的,尤其是線上正在運行的 ......

    uj5u.com 2023-04-05 16:52:56 more
  • 細節拉滿,80 張圖帶你一步一步推演 slab 記憶體池的設計與實作

    1. 前文回顧 在之前的幾篇記憶體管理系列文章中,筆者帶大家從宏觀角度完整地梳理了一遍 Linux 記憶體分配的整個鏈路,本文的主題依然是記憶體分配,這一次我們會從微觀的角度來探秘一下 Linux 內核中用于零散小記憶體塊分配的記憶體池 —— slab 分配器。 在本小節中,筆者還是按照以往的風格先帶大家簡單 ......

    uj5u.com 2023-04-05 16:44:11 more