dsp EDMA學習與疑問

2021-06-27 07:33:08 字數 2523 閱讀 9853

edma是一種資料傳輸模式,用edma建立無需cpu干預的外部裝置與記憶體之間的直接資料傳輸通道,節省cpu工作時間。

edma控制器主要包含傳輸控制器和通道控制器兩部分。傳輸控制器包含了將要傳輸的資料,而通道控制器是通過乙個觸發事件或者它接收到乙個傳輸請求tr,從而實現進入傳輸入口的。注意它的傳輸主要是事件觸發的特點。

edma有三種觸發方法:

1、最主要的通過外部事件來觸發一次tr;

2、通過某個指定的傳輸完成後觸發另乙個的連鎖觸發方式;

3、cpu觸發,通過往事件設定暫存器esr中寫數,一般除錯用。

edma有1d和2d兩種傳輸模式。1d的資料組成為塊-》幀-》元素,2d的資料組成為塊-》陣列-》元素。

每個外設都有暫存器,edma的暫存器如下:

esel:設定edma事件與通道的對映關係(有些dsp型號是固定對映的);

pqsr:表示狀態,表示傳輸暫存器在每個優先順序水平上是否為空;

cipr:表示通道中斷待定狀態;

cier:使能或遮蔽通道中斷;

ccer:使能或遮蔽通道連鎖;

er:表示狀態,表示捕獲的事件;

eer:使能或遮蔽er中的每乙個事件;

ecr:清除已觸發的事件;

esr:觸發傳輸請求。

另外有個很重要的通道引數ram,通常稱param,包括opt通道選項引數、src源位址引數、dst目的位址引數、cnt、idx、rld等等引數。這個暫存器在程式中是顯式配置的,不像前面那些,應該都寫成csl函式了。

程式的流程我通過乙個例項來解釋了。這個例項將實現,當fifo滿了,觸發edma把fifo資料經emif-》edma讀入記憶體。

硬體上,注意fifo和dsp emif介面的連線,尤其讓fifo的滿訊號和dsp外部中斷引腳相連,這樣滿訊號就能作為外部gpio觸發中斷。

軟體程式設計分為以下幾部分:

1、初始化部分:

(1)csl的初始化;

(2)中斷暫存器的初始化,例如設定中斷向量、先禁止所有中斷源等等;

(3)emif的初始化,即函式emif_config(&myconfig),其中要對myconfig結構體根據emif知識點進行配置。

2、設定edma中斷:

void irq_map(uint32 eventid,int intnumber);//將中斷事件和中斷號繫結

對於edma中斷號為8,那麼應該寫成(中斷號依型號而定):

irq_map(edmaint,8);

3、配置並開啟edma通道:

(1)配置前應該清空暫存器並禁止中斷:

edma_clearpram(0x00000000);

emda_intdisable(7);//gpio外部觸發事件,所以事件號可以為7,對應gpio事件7/外部中斷7

(2)開啟通道返回控制代碼:edma_handle edma_open(int chanum,uint32 flags);

第乙個引數是通道設定的事件號,第二個引數統一為edma_open_reset,一系列的初始化工作。

因為這裡是gpio外部觸發事件,事件號為7,因此寫成:

hedma7 = edma_open(edma_cha_extint7,edma_open_reset);

(3)配置edma,通過結構體。

注意這個配置函式需要控制代碼和結構體兩個引數:void edma_config(edma_handle hedma,edma_config *config);

那麼就需要對該結構體進行配置,共有opt、src、dst、cnt、idx、rld六個暫存器,格式同emif的配置格式。

(4)使能edma傳輸結束中斷,允許一次傳輸結束後產生中斷。

edma_intenable(7);

(5)使能edma事件號的傳輸通道及使能edma傳輸。

edma_enablechannel(hedma7);

irq_enable(edmaint);

4、可以編寫中斷服務程式,表示中斷發生的時候幹什麼。

edma_inthandler edma_inthook(int tccnum,edma_inthandler funcaddr);

例如本例可以寫為:edma_inthook(7,myled){}

注意這個程式實現的是中斷處理函式,即edma傳輸完成後做什麼事情,而傳輸的過程經過事件觸發自動完成,不用顯示的讀寫。

注意edma整個程式流程的順序是很講究的,對中斷的設定流程來講,都是先初始化-》禁止大中斷-》禁止小中斷-》設定對映等等-》開啟小中斷-》開啟大中斷的順序。以後也要注意中斷的寫法。

目前對於edma還是有很多疑問,比如:

1、在實際配置edma時候只顯式配置了param,而其他的沒有看到。雖然很明顯的一些csl函式肯定是對某個暫存器某位進行設定,但不確定真的是這樣嗎?

等等。

擴充套件:當需要多組edma傳輸的時候,需要定義多組param,每組的最後引數linkaddress指向另乙個param,就像乙個鍊錶的結構。整個程式多用陣列的形式和for迴圈,參考文件《edma使用詳解》。

補充:在另乙個地方看到軟體觸發edma的函式:edma_setchannel(...)

JAVA API 學習疑問記錄

string類 為什麼要設計contentequals?明明有equals這個方法 網上資料 string的這2個方法都是自己實現的,contentequals就是用來比較內容相同就行了,charsequence,stringbuffer 都可以進行比較,只要內部char 相同排序相同就算一樣。eq...

學習easyui疑問(三)

今天我學習easyui中碰到的另一問題是 如何建立乙個 首先,在easyui中文官網上提供的這樣一種定義方式 id tt table script tt datagrid 需要特別注意這裡沒有所謂的單位 這種方式只能用於建立如圖所示的datagrid 也就是我們所說的table 而不能達到我所想要打...

高效學習的疑問與思路 軟技能

如何像企業一樣思考?把職業當成乙個企業,將會影響你的 工作的方式 處理自己的財務的方式 尋求新工作或新客戶的方式。你的目標是什麼 1 設定長期目標和短期目標?2 了解目前的行業現狀?3 如何設定目標?為了設定正確的目標,他需要思考一系列問題 1 公司的業務戰略是什麼?2 當前專案的使命是什麼?它如何...