亚洲欧美国产动漫综合_91久久夜色精品国产免费_日韩国产精品亚洲经典_茄子人成年短视频_女教师的一级毛片_亞洲高清毛片一區二區_黄色三级视频午夜_日韩欧美成人大片中文字幕

登錄 | 注冊 退出

英飛凌Aurix2G TC3XX DMA模塊詳解

TechLink汽車軟件 2024-07-18

英飛凌Aurix2G TC3XX DMA模塊詳解

本文主要介紹Infineon Aurix2G TC3XX系列芯片DMA模塊硬件原理,以及MCAL相關配置,和部分代碼實現。

1 模塊介紹

直接存儲器訪問(Direct Memory Access,DMA)是計算機系統中的一種機制,允許外部設備(如硬盤驅動器、網絡適配器等)直接訪問系統內存,而無需通過中央處理器(CPU)的干預。這可以提高數據傳輸的效率,因為數據可以直接在設備和內存之間傳輸,而不必通過CPU來中轉。 DMA通常用于大容量數據傳輸,如文件傳輸、網絡數據包處理等。
Aurix2G TC3XX系列中DMA模塊不僅能夠實現內存之間的數據搬運,還能支持外設數據的搬運,比如利用DMA進行SPI數據的異步發送。

2 功能介紹

2.1 模塊總覽

我們來通過框圖看DMA整體結構。

DMA的整體結構還是比較簡單的,首先看左下角的Configuration Interface,我們通過訪問外設寄存器完成對DMA的配置;然后是上面的DMA Channels,里面存放所有DMA通道的屬性;當存在軟硬件搬運請求時,DMA模塊會對請求隊列進行仲裁,然后通過右邊的Move Engine與內存總線進行交互,完成搬運。

DMA模塊同樣也會產生不同類型的中斷,發送到中斷路由模塊。而中斷路由模塊可以將所有其他模塊的中斷信號路由到DMA作為硬件觸發信號。

這里我們需要先了解一些縮寫

CH:Channel,DMA通道;

ME:Move Engine,搬運引擎,負責與總線交互進行數據搬運;

RP:Resource Partition,資源分區,DMA支持分區權限管理,每個RP有指定的權限和內存區域,每個RP有自己的錯誤中斷;

TCS:Transaction Control Set,交換控制集;

和一些術語

DMA Hardware Request:由中斷路由模塊發起的搬運請求稱為硬件請求;

DMA Move:DMA數據搬運,一次Move包含從源地址讀數據,和往目的地址寫數據;

DMA Transfer:一個Transfer包含1, 2, 3, 4, 5, 8, 9或16個Move;

DMA Transaction:一個DMA Transaction包含至少一個Transfer;

Linked List:一個鏈表包含同一個通道的多個Transaction;

所以DMA的一般結果是Transaction包含Transfer,Transfer包含Move,Move是數據處理的最小顆粒度;而Transfer是觸發的最小顆粒度,也就是說你可以選擇一次請求觸發一次Transaction,或者只觸發一個Transfer。如果你想搬運的數據并非連續或者規則的,比如有兩塊比較遠的內存,需要在一次操作中處理,這個時候你就需要配置Linked List,一個Linked List包含多個Transaction。

2.2DMA通道

DMA通道的請求有4種:

DMA Software Request:軟件請求,顧名思義就是軟件寫寄存器請求一次DMA搬運;

DMA Hardware Request:硬件請求,其他外設的中斷信號發送至中斷路由模塊IR,IR將信號路由至DMA模塊,請求一次DMA搬運;

DMA Daisy Chain Request:Daisy鏈請求,比如通道5使能了Daisy鏈配置,那它在完成之后會觸發通道4的搬運請求;

DMA Auto Start Request:用于Linked List,同一通道配置了多個TCS,第一個TCS完成之后會觸發下一個TCS的搬運請求;

然后根據請求和執行的情況,DMA通道有不同的狀態:

Idle State:當前通道空閑,TSR.CH=0;

Reset State:當前通道處于Reset狀態,TSR.CH=0;

Halt State:通道處于Halt狀態,不工作,TSR.HLTACK = 1;

Pending State:通道已經被請求,但是沒有被服務,TSR.CH=1;

Active State:通道的搬運正在執行;

前面提到DMA搬運觸發的最小顆粒度是Transfer,通過CHCFGR.RROAT寄存器來配置:

CHCFGR.RROAT=0:每個Transfer搬運完成之后請求即被清除;

CHCFGR.RROAT=1:Transaction中的最后一個Transfer搬運完成之后請求被清除;

2.2.1 DMA Software Request軟件請求

用戶可以通過寫寄存器進行軟件搬運請求,在進行軟件請求的時候需要通過將TSR.DCH寫1關閉硬件請求。

軟件請求的搬運流程如下圖所示,圖中有兩個部分,區別在于CHCFGR.RROAT。

我們可以看到,圖中上部分的搬運流程中,CHCFGR.RROAT=1,當軟件進行一次請求后,硬件會裝載Transfer Count寄存器的值CHSR.TCOUT,然后開始搬運,每搬運一個Transfer之后CHSR.TCOUNT的值便會減一,當TCOUT的值為0之后搬運完成,會向中斷路由模塊發送DMA通道搬運完成中斷。

下部分的搬運流程中CHCFGR.RROAT=0,這里僅有的區別是每次請求只執行一次Transfer的搬運。

2.2.2 DMA Hardware Request硬件請求

硬件請求相對于軟件請求多了一個硬件使能的相關配置,我們可以設置TSR.ECH=1來使能硬件請求,或者設置TSR.DCH=1來關閉硬件請求,通過只讀寄存器TSR.HTRE查看中斷使能狀態。

另外還有一個重要的配置是CHCFGR.CHMODE,當CHMODE=0時,為單次模式,每次Transaction完成之后硬件使能會被自動關掉,需要手動再打開,否則硬件請求不會被處理;當CHMODE=1時,則為連續模式,不會關閉硬件請求使能。

關于硬件請求,需要在中斷模塊中進行配置,把其他外設的中斷信號路由到DMA(SRC.TOS選擇DMA),優先級SRC.SRPN設置為對應的DMA通道號即可。

其他方面就和軟件請求一樣了,我們來看搬運流程圖。

圖中的兩個轉換流程都是單次模式,在上面的搬運流程中CHCFGR.RROAT=1,需要先使能硬件請求,然后一個硬件搬運請求觸發后,會完成整個Transaction,同樣的TCOUNT會自動遞減,歸零后觸發DMA通道完成中斷。

下面的搬運流程中CHCFGR.RROAT=0,每次硬件請求只會完成一次Transfer,需要不停地觸發;一個Transaction中的所有的Transfer完成之后硬件請求使能會被關閉。

連續模式下與上面的描述只有一個區別,就是硬件請求使能不會被硬件關閉,后續的硬件請求能夠連續執行。

2.2.3 DMA Daisy Chain Request Daisy鏈請求

用戶可以通過設置CHCFGR.PRSEL來配置Daisy鏈。當一個通道配置了Daisy鏈使能,在它的Transaction完成之后,會自動請求相鄰的低優先級的通道搬運(DMA通道號即優先級,越高優先級越高)。所以我們可以通過對多個相鄰的DMA通道配置使能Daisy鏈,完成多個DMA通道搬運的鏈式觸發。

另外在配置Daisy過程中,除了最低優先級的通道以外,其他通道需要關閉中斷使能,僅最后一個通道使能中斷,也就是說,中斷需要在Daisy鏈全部完成之后觸發。

2.2.4 通道請求丟失中斷

在以下兩種情況下,會發生中斷請求丟失(DMA Channel Transaction/Transfer Request Lost,TRL)事件:

當一個通道處于Pending狀態(TSR.CH=1)時收到了通道請求;

當一個通道未使能硬件請求,但是收到了硬件搬運請求;

發生TRL之后TSR.TRL會置位,如果此時使能了所在RP的錯誤中斷(TSR.ETRL=1),則會觸發所在RP的錯誤中斷。

2.2.5 請求仲裁

DMA仲裁單元會對所有處于Pending狀態的通道進行仲裁,然后選擇其中通道號最高的通道處理。如果有當前正在搬運的Transaction,而出現了高優先級的通道的Transaction,則會打斷低優先級的,但是打斷的最小顆粒度是Transfer,也就是正在處理的Transfer會完成。

Aurix2G的DMA模塊有兩個Move Engine,它們和通道的關系不是綁定的,而是選擇空閑的使用,仲裁勝出的通道會優先送往Engine1,如果非空閑則選擇Engine0。

2.3 搬運流程

當仲裁完成之后,DMA通道請求就會送到Move Engine去進行數據搬運,前面我們提到,Transaction包含多個Transfer,Transfer包含多個Move,而Move是搬運的最小顆粒度,也就是說,ME是按照Move逐個操作的,Move中定義源地址、目的地址,地址偏移等信息。

DMA的搬運源地址通過CHx.SADR寄存器設置,目的地是通過CHx.DADR設置。DMA每個Move在完成之后,源地址和目的地址都可以進行偏移,以支持我們搬運連續的內存空間,當然也可以原地保持不變,循環搬運。源地址和目的地址的偏移都是獨立計算的。

地址的偏移有兩種,一種是遞增或遞減,每次以固定的偏移值進行調節;另一種就是循環Buffer。

2.3.1 地址偏移模式

如果我們需要搬運的數據,它的地址是不連續的,比如ADC采樣的結果寄存器,每個結果寄存器我們只需要前16個Bit,而我們可能需要多個通道的采樣結果,那我們就需要通過設置Move的地址偏移,來進行搬運。

我們需要通過CHCFGR.CHDW設置Move的搬運寬度,數據寬度DataWidth=8*2^CHDW,單位是Bit,最大支持256Bit。在地址偏移模式中,每次Move完成之后偏移的地址值,是數據寬度的整倍數。

通道地址控制寄存器ADICR中包含了源地址、目的地址的偏移參數:

SMF:Source Address Modification Factor,源地址偏移參數;

INCS:Increment of Source Address,源地址偏移方向,遞增或遞減;

DMF:Destination Address Modification Factor,目的地址偏移參數;

INCD:Increment of Destination Address,目的地址偏移方向,遞增或遞減;

在地址偏移模式中,以上4個參數定義了地址偏移的格式。它的算法是這樣的,偏移值=2^SMF*DataWidth,INCS為1就是增加,INCS為0就是減(源地址和目的地址相同算法相同)。我們可以看下面這個實例:

在這個示例中,搬運Move的數據寬度為16Bit,源地址的SMF=3,INCS=1,則每次搬運之后地址增加2^3*16=128Bit。而目的地址DMF=2,INCD=0,那每次搬運之后地址減少2^2*16=64Bit。

我們再來看下一個示例,它將一段連續地址空間的數據搬運到帶間隙的地址空間上去。

這個示例中的數據寬度同樣也是16bit,源地址的SMF=0,INCS=1,所以每次搬運之后地址增加2^0*16=16Bit,也就是沒有間隙,依次讀取數據。而目的地址的DMF=1,INCD=1,所以每次搬運之后地址增加2^1*16=32Bit,實現了間隙式搬運。

這里需要注意的是,在一個Transaction搬運完成之后,源地址和目的地址并不會重置,而是停留在最后一次搬運所指向的地址,如果要開啟新一輪的搬運,則需要重新再設置地址。

2.3.2 循環Buffer模式

循環Buffer模式,和地址偏移模式的區別,就是增加了一個地址空間的上下限,超過這個限制就會按照設定的方向滾動。

同樣我們需要在ADICR寄存器中設置相關參數,除了地址偏移模式的位域以外,還有以下位域:

CBLS:Circular Buffer Length Source,源地址循環Buffer尺寸;

CBLD:Destination Circular Buffer Enable,目的地址循環Buffer尺寸;

SCBE:Source Circular Buffer Enable,源地址循環Buffer使能;

DCBE:Destination Circular Buffer Enable,目的地址循環Buffer使能;

首先我們按照需求來使能源地址或者目的地址的循環Buffer,然后和偏移地址模式一樣設置我們的偏移參數,最后通過CBLS或CBLD設置我們的Buffer尺寸。Buffer尺寸為2^CBLS,單位為Byte,最大為64kByte。

舉個例子,比如我源地址為0x7000CC40,CBLS=4,則循環Buffer尺寸為2^4=16Byte,在搬運完0x7000CC4C~0x7000CC4F的4字節之后(每個Move4字節),源地址回到0x7000CC40。

另外如果想要地址保持不變,則設置CBLS為0即可。

這里有一個需要注意的地方是,Buffer的上下限必須是按Buffer尺寸字節對齊的,比如Buffer尺寸為16字節,則源地址必須為16字節對齊,如果源地址為0x7000CC44,則前4個字節不會被搬運。

3 MCAL配置示例

下面我們結合示例來說明DMA模塊的原理,以及在MCAL中的相關配置。本實例是通過軟件觸發,把一塊內存的數據搬運到另一塊內存中。

3.1 DMA General

General界面沒有什么特別的配置,一般都是軟件相關接口使能。

3.2 Channel General

我們來到Channel之后,首先是一頁General配置,這里配置通道的基本屬性,比如通道ID等。

用戶也可以配置Notification函數,在DMA完成中斷中會觸發該函數。

3.3 DmaChannelTransactionSet

TransactionSet這里是通道的詳細配置,包括剛才提到的轉換配置,地址偏移等,我們一個個介紹。


DmaTcsIndex:這個參數是Transaction的Id,如果通道中只有一個,就是0就可以,如果有Linked List,存在多個Transaction,就需要依次排序;

DmaTcsSourceAddress & DmaTcsDestinationAddress:搬運的源地址和目的地址,這里可以使用地址值,也可以使用變量、寄存器名等,但是前提是下面的頭文件引用能夠包含該信息;

DmaUserHeaderFileWithExternDeclarations:引用頭文件;

DmaTcsMoveLength:Move搬運的數據寬度,這里我們一次搬運32bit;

DmaPatternMode:數據匹配模式,能夠進行數據匹配,這里未使用;

DmaTcsTransferLength:一個Transfer中Move的數量;這里我們選擇1;

DmaTcsTransactionLength:一個Transaction中Transfer的數量,這里我們配置4;

DmaTcsCircularBufferSourceEnable:源地址循環Buffer使能;

DmaTcsCircularBufferDestinationEnable:目的地址循環Buffer使能;

DmaTcsCircularBufferSourceLength:源地址循環Buffer尺寸,這里我們配置16字節循環;

DmaTcsCircularBufferDestinationLength:目的地址循環Buffer尺寸,這里我們配置16字節循環;

DmaTcsSourceAddressModificationFactor:源地址偏移值,這里我們配置1個Move寬度,不留間隙;

DmaTcsDestinationAddressModificationFactor:目的地址偏移值,這里我們配置1個Move寬度,不留間隙;

DmaTcsAppendTimeStamp:時間戳功能,不使用;

DmaTcsSourceAddressMovement:源地址偏移方向,這里配置為增加;

DmaTcsDestinationAddressMovement:目的地址偏移方向,這里配置為增加;

DmaTcsShadowRegisterConfiguration:影子寄存器配置,未使用;

DmaTcsTriggerFrequency:Transaction觸發頻率,也就是選擇一次觸發是完成一個Transfer還是完成一個Transaction,這里配置為Transaction;

DmaTcsHardwareTrigger:是否使用硬件觸發,單次還是連續;

DmaTcsDaisyChaining:是否配置為Daisy鏈,如果勾選則完成后觸發相鄰的低通道的請求,這里不使用;

3.4 示例代碼

示例代碼這里我們還是使用Infineon原廠MCAL代碼,首先是模塊初始化:

Dma_Init(&Dma_Config);

然后我們聲明轉換需要的源數據和目的數據,這里Buffer為16字節,所以我加了對齊:

#pragma align 16
uint32 DmaTestSrc[DMATEST_BUFFERLEN];
uint32 DmaTestDes[DMATEST_BUFFERLEN];
#pragma align restore

然后就在運行過程中請求轉換就可以了:

Dma_ChStartTransfer(19);    /* 入參為通道號 */

然后我們調試看結果,我這里DmaTestSrc源地址為0x7000CC40,目的地址DmaTestDes為0x7000CC30。啟動后將源數據進行了初始化:

然后我們啟動一次轉換,可以看到執行了4個Transfer,16字節數據全部搬運:

4 小結

本文介紹了Infineon Aurix2G DMA模塊的硬件原理和搬運流程,對搬運的數據結構和地址邏輯進行了說明,最后通過實例展示了DMA模塊的MCAL配置和使用方法,為讀者進行實操提供了參考。

0.png

下一篇: 英飛凌Aurix2G TC3XX GTM模塊詳解
上一篇: 英飛凌Aurix2G TC3XX EVADC模塊詳解
相關文章
返回頂部小火箭