【DSP开发】C6000非多核非KeyStone系列DSP中断系统
C6000系列DSP的中斷系統
上一篇介紹了C6455的GPIO系統,最后把GPIO4配置成了中斷/事件模式,本文將介紹C6455的中斷系統,介紹完基本概念后,給出把GPIO4映射到INT4的代碼。
完成了GPIO和中斷的配置,我們就可以開始著手DSP與FPGA之間的通訊了。廢話不多說,下面開始介紹C6455的中斷系統。
----------------------------------------------------華麗分割------------------------------------------------------
中斷模塊框圖
仔細觀察上圖,可以看出C6455有一下幾種中斷:
- 1.???Reset
- 2.???NMI 不可屏蔽中斷
- 3.???EXCEP 硬件異常
- 4. ? 12個普通中斷INT[15:4]
----------------------------------------------------華麗分割------------------------------------------------------
接下來,沿著INT[15:4]往后退,看到的是Interrupt Selector,它的功能好比一個篩子(shuffle),對所有中斷事件進行選擇性映射。如下圖示:
看了這個圖,我們又不難發現,中斷選擇器是一個128-->12的映射,這也就意味著,有116個系統事件被過濾掉了。
接著往回走,可以看到,中斷選擇器有三個輸入,分別是:
- RESET
- Event[3:0]
- Event[127:4]
??????
RESET不看了,硬件重啟。
EVENT[127:4]是系統事件,這個事件的編號根據芯片的不同而不同,拿6455來說,部分映射情況如下面兩個圖片所示:
不難看出,這些編號都是固定的,基本囊括了芯片上所有模塊的事件。
?
最后,比較特別的是Event[3:0],它是組合事件,通過下圖的介紹應該就一目了然了。
可見,Event0對應 4-31號事件的組合事件,Event2對應32-63號事件的組合事件,以此類推。
?
----------------------------------------------------華麗分割------------------------------------------------------
那么,怎么組合呢?
這就不得不從寄存器開始說起了。首先,先看如下3個寄存器組:
(注:每組都是4個32位寄存器,每一組的EVTxxx0[3:0]都不使用,故這里不涉及到組合事件)
????? 系統事件發生時(124個),它們在事件標志寄存器中(EVTFLAGx)的對應位會被置1,此時可以通過向EVTCLR寄存器中對應位寫入1來清除中斷標志,然后執行中斷服務程序。若不清除,那么相同事件再次發生時會產生問題。故,手動清除中斷標志是必須的!且只能通過向EVTCLR寄存器中寫入1來清除,不能直接向EVTFLAG寄存器寫入0,因為EVTFLAG寄存器是Read Only的。
? ? ? 另外,EVTSET寄存器的存在意義就是我們可以手動產生中斷,這一點可以讓我們測試中斷服務程序的功能。
?
????? 介紹完上面三個基本的寄存器組,我們可以開始討論組合事件的機制了。先看下圖:
可以明顯的看出,124個事件被分成了4組。然后經過兩個寄存器的運算,產生組合事件。
下面介紹EVTMASK和MEVT FLAG兩個寄存器組。
- ? ? ??EVT MASK寄存器組用于決定每一個組中的哪些事件被屏蔽掉。默認情況下,沒有事件被屏蔽(全0)。
- ? ? ??鑒于最終的組合事件EVTx的發生機制是對Group中所有事件進行或運算,即只要Group中有一個事件發生,就代表組合事件發生。
?
舉個例子:
假如EVTMASK3=0x0FFFFFFF,那么代表只有事件124,125,126,127參與組合。其他事件96-123都被忽略。
- ? ? ??MEVT FLAG寄存器同EVT FLAG寄存器的值相同,表示事件是否發生。這樣一旦知道了EVTMASK和MEVT FLAG兩個寄存器的值就可以斷定組合事件EVTx(0<=x<=3)是否發生了。
----------------------------------------------------華麗分割-----------------------------------------------------?
通過上面的介紹,應該已經很清楚C6455的中斷機制了,再貼一張圖來鞏固一下上面所說的內容:
說到這里,我們對上圖中紅色框以及它之前的東西了解的很清楚了,下面就是Interrupt Selector的機制了。
其實很簡單,為12個中斷分別配置對應的事件編號即可。只需要3個寄存器就OK啦。
分別是INTMUX1,INTMUX2,INTMUX3。貼一個圖就應該很明了了。
舉個例子:
假設我要讓INT4映射到GPIO4,那么通過查找前面的圖,發現GPINT4的事件編號是55,那么只要把INTMUX1的低7位設置成0x37即可。
?
此外,官方文檔里還說了下面一段話:
可見,INT4優先級最高,INT15優先級最低
----------------------------------------------------華麗分割------------------------------------------------------
中斷模塊CSL庫使用
上面介紹了很多,其實就是想說清楚C6455的中斷機制。實際使用還是CSL比較方便。????? 使用CSL配置中斷需要如下幾個步驟:
- 1.???初始化中斷模塊
- 2.???使能NMI
- 3.???全局中斷使能
- 4.???打開中斷模塊
- 5.???綁定中斷服務程序
- 6.???使能相應事件
?
完整中斷配置例子----把GPIO4事件映射到INT4
[cpp]?view plaincopy
- CSL_Status??????????????????intStat;??
- CSL_IntcContext?????????????gpiocontext;??
- CSL_IntcEventHandlerRecord??isr_gpio;??
- CSL_IntcEventHandlerRecord??record[1];??
- CSL_IntcGlobalEnableState???state;??
- CSL_IntcParam???????????????vectId;??
- CSL_IntcHandle??????????????gpioIntcHandle;??
- CSL_IntcObj?????????????????gpioIntcObj;??
- ??
- ??
- static?void?HANDLE_INTR4(void?*arg)??
- {??
- ????//中斷服務程序??
- }??
- /*-----------------------------------------------------------------------------------?
- ?*??
- ?*??????????????????初始化外部中斷4?????
- ?*??
- ?-----------------------------------------------------------------------------------*/??
- void?InitAndEnableIntc4(void)??
- {??????
- ????//初始化??
- ????gpiocontext.numEvtEntries?=?1;??
- ????gpiocontext.eventhandlerRecord?=?record;??
- ????intStat?=?CSL_intcInit(&gpiocontext);?????
- ??????
- ????//使能NMI(不可屏蔽中斷)??
- ????intStat?=?CSL_intcGlobalNmiEnable();??
- ??????
- ????//全局中斷使能??
- ????intStat?=?CSL_intcGlobalEnable(&state);???
- ??????
- ????//打開中斷模塊(把GPIO4中斷事件映射到系統中斷INT4)??
- ????vectId?=?CSL_INTC_VECTID_4;??
- ????gpioIntcHandle?=?CSL_intcOpen(&gpioIntcObj,?CSL_INTC_EVENTID_GPINT4,?&vectId,?&intStat);??????
- ????????
- ????//綁定中斷服務程序??
- ????isr_gpio.handler?=?(CSL_IntcEventHandler)&HANDLE_INTR4;??
- ????CSL_intcPlugEventHandler(gpioIntcHandle,?&isr_gpio);?//綁定??
- ??????
- ????//使能該事件(開始監聽)??
- ????CSL_intcHwControl(gpioIntcHandle,?CSL_INTC_CMD_EVTENABLE,?NULL);??
- }??
通過本文以及上一篇文章,我們應該對DSP6000系列的GPIO和中斷系統有了一定的了解。(注,本文只是基本的介紹C6000的中斷系統,有不少部分沒有涉及,若要了解更多,請參考TI官方文檔)
接下來將介紹:
- DSP的EDMA系統與EMIFA接口
- FPGA的乒乓RAM應用
- CCIR656視頻標準(PAL)
- FPGA與DSP實現的視頻采集與傳輸實驗
最后,給出一些資源下載:
- 1.C6000系列的GPIO與中斷系統筆記(即兩篇文章的PDF版本)
- 2.C6455CSL庫文檔
- 3.C6455的GPIO與中斷系統官方文檔
點此下載
轉載于:https://www.cnblogs.com/huty/p/8518522.html
總結
以上是生活随笔為你收集整理的【DSP开发】C6000非多核非KeyStone系列DSP中断系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一个有气质的个性签名。
- 下一篇: 后保险杠喷漆多少钱啊?