




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 TI C54xx DSP 十天速成講義本節選自為HK-DSP實驗箱寫的實驗指導書,有待整理實驗一 新手上路初學者編寫的第一個程序通常是控制XF引腳的變化,然后用示波器測量XF腳波形或觀察與相接的LED。這個程序也常常用來測度一下DSP能否正常工作。實驗1.1 最簡單的程序:控制XF引腳周期性變化實驗目的:通過簡單的程序了解DSP程序的結構,熟悉CCS開發環境。*最簡單的程序:TestXF1.asm*循環對XF位置1和清0,用示波器可以在XF腳檢測到電平高低周期性變化*常用于檢測DSP是否工作。*.mmregs ;預定義的寄存器.def CodeStart ;定義程序入口標記.text ;程序
2、區CodeStart: ;程序入口SSBX XF ;XF置1RPT #999 ;重復執行1000次空指令產生延時NOPRSBX XF ;XF清0RPT #999 ;重復執行1000次空指令產生延時NOP B CodeStart ;跳轉到程序開頭循環執行.end NOP指令執行時間為一個時鐘周期,設DSP工作頻率是50MHz,可以估算出XF引腳電平的變化頻率約為:50M/2000=25kHz在沒有示波器的情況下,就要將程序1.1稍作改進,增加延時,用一個延時子程序將XF腳電平變化頻率降到肉眼可分辨的程度,就可以用LED來顯示電平的變化,程序如下:實驗1.2 子程序調用實驗目的:學習子程序的調用*
3、TestXF2.asm*對TestXF1.asm稍作改進,用延時子程序設置較長的延時,*可以用試驗板上的LED看到XF引腳電平的變化*.mmregs ;預定義的寄存器.def CodeStart ;定義程序入口標記.text ;程序區CodeStart: ;程序入口SSBX XF ;XF置1CALL Delay ;調用延時程序RSBX XF ;XF清0CALL Delay ;調用延時程序B CodeStart ;跳轉到程序開頭循環執行*延時子程序:Delay*用兩級減一計數器來延時。調整AR1和AR2的大小LED閃爍的頻率不同*Delay: STM #999,AR1 ;循環次數1000LOOP
4、1: STM #4999, AR2 ;循環次數5000LOOP2: BANZ LOOP2,*AR2- ;如果AR2不等于0,AR2減1,再判斷BANZ LOOP1,*AR1- ;如果AR1不等于0,AR1減1,跳轉到LOOP1RET.end*注意這種延時方法并不精確,需要精確定時必須用定時器。*按此法延時的近似公式為:4*(AR2+1)*(AR1+1)*時鐘周期*當DSP工作在50MHz(時鐘周期20ns),AR1=999, AR2=4999時*延時約為400ms,則LED閃爍的周期為800ms,頻率1.25Hz*設計指導:1源代碼書寫格式源代碼的書寫有一定的格式,初學者往往容易忽視。簡單歸納
5、如下:1每一行代碼分為三個區:標號區、指令區和注釋區。標號區必須頂格寫,主要是定義變量、常量、程序標簽時的名稱。指令區位于標號區之后,以空格或TAB格開。如果沒有標號,也必須在指令前面加上空格或TAB,不能頂格。注釋區在標號區、程序區之后,以分號開始。注釋區前面可以沒有標號區或程序區。另外還有專門的注釋行,以*打頭,必須頂格開始。2一般區分大小寫,除非加編譯參數忽略大小寫。3標點符號有時不注意會打成中文全角字符導致錯誤。書寫格式的要求在很多DSP書里都沒有提,初學者往往只把書上的代碼輸入進去,編譯時得到錯誤的提示,而不知所措。其中最容易犯的錯誤指令頂格寫,不過一般經提示后不會犯第二次。有些格式
6、CCS并沒有做要求,但注意養成良好的代碼書寫風格,增加代碼的可讀性。以上兩個例子的書寫風格可作參考,但不是硬性規定:1標號區占3個TAB的間隔,即12個字符2指令中的指令碼占兩個TAB間隔,然后是操作數。3每一行的尾注能對齊的盡量對齊4標明一段程序功能的注釋以*號打頭頂格寫,如果功能說明的注釋較多,用分格線框起來。此外其它編程語言的編程風格也可以借用過來,比如標示符命名規則、程序說明的要求等。如果項目組有規定,則按規定執行。本書的代碼盡量保持一定的風格,不過讀者可以發現前面的代碼注釋較多,后面隨著學習的深入,一般不會對每一條指令加注釋,只注明程序段的功能。另外代碼貼到word里后,格式有些錯位
7、,無法一一糾正。2鏈接配置文件一個完整的DSP程序至少包含三個部分:程序代碼、中斷向量表、鏈接配置文件(*.cmd)。這里介紹一下鏈接配置文件文件,對本次試驗影響不大的中斷向量表將在后文介紹。連接配置文件的確定了程序鏈接成最終可執行代碼時的選項,其中有很多條目,實現不同方面的選項,其中最常用的也是必須的有兩條:1.存貯器的分配 2.標明程序入口。以本次實驗為例,下面的簡單的鏈接配置文件就夠用了:/* TestXF.cmd */-e CodeStart /*程序入口,必須在程序中定義相應的標號*/MEMORY page 0:PRAM: org=0100h len=0F00h /*定義程序存貯區,
8、起始0100H,長度0F00H*/SECTIONS.text:>PRAM page 0 /*將.text段映射到page0的param區*/由于每個程序都需要一個鏈接配置文件,可以編寫一個滿足通常需要的鏈接配置文件。作為本手冊通用的鏈接配置文件如下,可以滿足本書大部分程序的需要。在未特別指明的情況下使用這個通用的鏈接配置文件:/* 5402.cmd */-e CodeStart /*程序入口,必須在程序中定義相應的標號*/-m map.map /*生成存儲器映射報告文件 */MEMORY PAGE 0:VECT: org=0080h len=0080h /*中斷向量表*/PARAM: o
9、rg=100h len=0F00h /*代碼區*/PAGE 1:DARAM: org=1000h len=1000h /*數據區*/SECTIONS .text :> PARAM PAGE 0 /*代碼段*/.vectors :> VECT PAGE 0 /*中斷向量表*/STACK :> DARAM PAGE 1 /*堆棧*/.bss :> DARAM PAGE 1 /*未命名段*/.data :> DARAM PAGE 1 /*數據段*/實驗二 基本運算本節選自為HK-DSP實驗箱寫的實驗指導書,有待整理DSP指令數量最多的是:算術指令、邏輯指令和數據加載與傳
10、送指令。數據加載與傳送指令由于處處要用,所以不單獨列為實驗。算術與邏輯指令也是數量繁多,無法一一舉例,這里簡單舉一個加法和除法的例子,乘法和乘加指令在FIR用得比較多,稍后一并介紹。其它指令有興趣可以對照指令表的說明,試驗一下各指令運行的結果。實驗2.1 加減法計算 *計算z=x+y-w。*.mmregs.def CodeStartData_DP: ;數據段指針x: .word 10 ;初始化變量y: .word 26w: .word 23z: .word 0.textCodeStart:LD #Data_DP,DP ;裝載數據指針DPSTM #STACK+10H,SPSUMB: LD x,A
11、 ;A=xADD y,A ;A=A+ySUB w,A ;A=A-wSTL A,z ;z=AEND: B END計算結果數據存儲器地址存儲內容十進制x1010H000aH10y1011H001aH26w1012H0017H23z1013H000dH13技巧提示:試驗算術指令由于不需要外部資源,可以不需要仿真器和實驗箱。同學們可以平時自己用軟件仿真,多多實驗。但是復雜的算法最好還是在線仿真,因為程序是流水線執行,軟件仿真有時與實際硬件執行結果有所不同。實驗2.2 除法計算 DSP并沒有除法指令,回想一下我們用在稿紙上演算除法列的豎式,實際是一種移位減法,DSP中也是通過做多次減法的辦法來做除法。下
12、面例子是把用除以10的辦法二進制數轉成BCD碼例子:*16進制轉BCD碼*.mmregs.global CodeStart.datax: .word 1234 ;待轉換的數字y: .word 10 ;除數z: .word 0Fh,0Fh,0Fh,0Fh,0Fh;結果區,每位BCD存一個字,;初始化為F因為實驗板的數碼管不顯示F.textCodeStart:LD #x,DP ;設置DPLD x,A ;被除數STM #z,AR1 ;結果區指針loop: RPT #15 ;執行完16次減法后,A的高16位是余數SUBC y,A ;低16位是商STH A,*AR1+ ;余數保存到ZAND #0FFFF
13、H,A ;掩蓋掉高16位,保留商值BC loop,ANEQ ;繼續做除法直到商為0 end: B end練習:練習其他算術指令其它參考:spru172c:TMS320C54x DSP Reference Set Volume 2: Mnemonic Instruction Set,2.1 Arithmetic Operations這個資料對每個指令都有詳細說明。也可以在Help中的TMS320C54x DSP Mnemonic Instruction Set中查詢或搜索相關指令。實驗三 中斷中斷的概念應該不陌生,指的是當某個事件發生時,暫停當前的操作,轉向中斷服務程序,執行完后再返回繼續原來的
14、操作。這使得DSP能夠處理多個任務。DSP有許多中斷源,可以設置中斷控制寄存器來確定響應哪些中斷而不理會哪些中斷。本實驗介紹最常用的定時器中斷和外部中斷的使用方法,并介紹中斷向量表和中斷向量指針。實驗3.1 定時器中斷:方波發生器實驗目的:學習定時器中斷的設計方法回顧一下實驗一控制LED的閃爍實際就是一個簡單的方波發生器。但不足的是延時的方法定時不精確,另外還有一個缺點是在執行延時的過程中DSP就無法執行其它指令,這時就可以用定時器來改進。使用定時器首先要對它初始化,基本步驟如下:1關掉中斷2停止定時器運行。3設定時器的定時長度4允許定時器中斷5運行定時器6打開中斷現以簡單的方波程序為例:;=
15、; fangbo1.asm; 利用定時器Timer0在XF腳產生周期2ms的的方波;=.title "fangbo1.asm".mmregs.def codestart ;程序入口.def TINT0_ISR ;Timer0中斷服務程序STACK .usect "STACK",10H ;分配堆棧空間 ;設定定時器0控制寄存器的內容K_TCR_SOFT .set 0B<<11 ;TCR第11位soft=0K_TCR_FREE .set 0B<<10 ;TCR第10位free=0K_TCR_PSC .set 0B<<6 ;
16、TCR第9-6位,可設TDDR一樣,也可不設自動加載K_TCR_TRB .set 1B<<5 ;TCR第5位TRB=1此位置1,PSC會自動加載的K_TCR_TSS .set 0B<<4 ;TCR第4位TSS=0K_TCR_TDDR .set 1001B<<0 ;TCR第3-0位TDDR=1001BK_TCR .set K_TCR_SOFT|K_TCR_FREE|K_TCR_PSC|K_TCR_TRB|K_TCR_TSS|K_TCR_TDDRK_TCR_STOP .set 1B<<4 ;TSS=1時計數器停止.dataDATA_DP: ;數據區指
17、針XF_Flag: .word 1 ;當前XF的電平標志,如果XF_Flag=1,則XF=1;=;主程序:;=.textCodeStart:STM #STACK+10H,SP ;設堆棧指針SPLD #DATA_DP,DP ;設數據地址DPSTM #XF_Flag,AR2 ;AR指向XF標志;改變中斷向量表位置K_IPTR .set 0080h ;指向0080H,默認是FF80LDM PMST,AAND #7FH,A ;保留低7位,清掉高位OR #K_IPTR,A ;STLM A,PMST*初始化定時器0*f=50MHz,定時2ms時:*根據定時器長度計算公式:Tt=T*(1+TDDR)*(1+
18、PRD)*給定TDDR=9,PRD=9999,CLKOUT主頻f=40MHz,T=25ns*Tt=20ns*(1+9)*(1+9999)=2000us=2ms*f=100Mhz,定時最大是:10ns*24*216=10ms,PERIOD .set 9999 ;定義計數周期STM K_TCR_STOP,TCR ;停止計數器0; STM #PERIOD,TIM ;可設成跟PRD一樣,也可不設自動加載STM #PERIOD,PRD ;設定計數周期STM #K_TCR,TCR ;開始Timer0stm #0008h,IMR ;允許Timer0中斷STM #0008h,IFR ;清除掛起的中斷rsbx
19、intm ;開中斷end: nopB end ;=;Timer0中斷服務程序:TIN0_ISR;=TINT0_ISR: PSHM ST0 ;本中斷程序影響TC,位于ST0中;判斷當前XF狀態并作電平變化BITF *AR2,#1 ;IF XF_Flag=1 then TC=1 else TC=0BC ResetXF,TC ;IF TC=1 then XF=0 else XF=1setXF: SSBX XF ;置XF為高電平ST #1,*AR2 ;相應修改標志B NextResetXF:RSBX XF ;置XF為高電平ST #0,*AR2 ;相應修改標志Next:POPM ST0RETE .end
20、 有時定時的長度不能滿足需要,比如DSP工作頻率50Mhz時,定時最大值是:20ns*24*216=20ms。如果需要更長的定時,就要在定時器中斷子程序中再加一個計數器,直到產生一定次數的定時中斷后再執行相應的操作。程序只需要稍作修改,見附盤的fangbo2.asm技巧提示:寄存器的不同位通常有不同的含義,初始化時單獨設定寄存器的每一位可以增加程序可讀性,容易讓其它人看懂具體每一位設置的含義,并且易于修改。如果代碼太長可以自己寫一個初始化的子程序,需要時修改一下調定時再調用。當然如果對寄存器各個位的含義相當熟悉,直接整個初始化也行。可以自行選擇這些不同的編程風格。設計指導:1中斷向量表中斷向量
21、表是DSP程序的重要組成部分,當有中斷發生并且處于允許狀態時,程序指針跳轉到中斷向量表中對應的中斷地址。由于中斷服務程序一般較長,通常中斷向量表存放的是一個跳轉指令,指向實際的中斷服務程序。下面是5402中斷向量表的一個范例,可以作為模板,使用時稍作修改就行:*5402Vectors.asm*完整的5402中斷向量表示例*5402共有30個中斷向量,每個向量占4個字的空間。*使用向量一般用一條跳轉指令轉到相應中斷服務子程序,其余空位用NOP填充*未使用的向量直接用RETE返回,是為了防止意外進入未用中斷。*.sect ".vectors" ;開始命名段.vecotrs.gl
22、obal CodeStart ;引用程序入口的全局符號定義;。引用其它中斷程序入口的全局符號定義.align 0x80 ; 中斷向量表必須對齊128字的頁邊界RESET: B CodeStart ; Reset中斷向量,跳轉到程序入口NOP ;用NOP填充表中其余空字NOP ;B指令占了兩個字,所以要填兩個NOPNMI: RETE ;不可屏蔽中斷NOPNOPNOP ; 軟件中斷SINT17 .space 4*16 ;軟件中斷使用較少,簡單起見用0填充SINT18 .space 4*16SINT19 .space 4*16SINT20 .space 4*16SINT21 .space 4*16S
23、INT22 .space 4*16SINT23 .space 4*16SINT24 .space 4*16SINT25 .space 4*16SINT26 .space 4*16SINT27 .space 4*16SINT28 .space 4*16SINT29 .space 4*16SINT30 .space 4*16INT0: RETE ;外部中斷INT0NOPNOPNOPINT1: RETE ;外部中斷INT1NOP NOPNOPINT2: RETE ;外部中斷INT2NOPNOPNOPTINT: RETE ;Timer0中斷NOPNOPNOPBRINT0: RETE ;McBSP #0
24、 接收中斷NOPNOPNOPBXINT0: RETE ;McBSP #0 發送中斷NOPNOPNOPDMAC0: RETE ;無定義(默認)DMA0中斷NOPNOPNOPTINT1: RETE ;Timer1中斷(默認)或DMA1中斷.NOPNOPNOPINT3: RETE ;外部中斷3NOPNOPNOPHPINT: RETE ;HPI中斷NOPNOPNOPBRINT1: RETE ;McBSP #1接收中斷(默認)或DMA2中斷NOPNOPNOPBXINT1: RETE ;McBSP #1發送中斷(默認)或DMA3中斷NOPNOPNOPDMAC4: RETE ;DMA4中斷NOPNOPNOP
25、DMAC5: RETE ;DMA5中斷.end在本實驗中只要把在開頭加上中斷子程序標號的引用,并在中斷表的TINT部分換成跳轉指令就行了:*vectors.asm for 方波發生器*.sect ".vectors" ;開始命名段.vecotrs.global CodeStart ;引用程序入口的全局符號定義.global TINT0_ISR ;引用Timer0中斷子程序節省篇幅,中間省略TINT: B TINT0_ISR ;Timer0中斷NOPNOPBRINT0: RETE ;McBSP #0 receive interrupt<節省篇幅,下略>技巧提示:只
26、有第一個中斷(Reset中斷)是每個程序都應該有的,在不需要其它中斷的情況下,可以只用這一部分,后面可以省略。如果只需要部分中斷也可以按需設置,但必須保證所用中斷在中斷向量表的位置不變。不熟悉中斷向量表的情況下最好還是用這個完整中斷向量表樣例。另外C5400系列中不同型號DSP的中斷向量數量和在中斷向量表中的位置有所不同,程序移植時需要查相應datasheet確認。2中斷向量指針中斷向量表的位置并沒有強制的位置,可以在內部存貯器,也可以在外部存貯器。但有一個要求:中斷量表必須放在80H字長存貯塊的起始處,即中斷向量表的首地址的低7位必須全為0。DSP 的寄存器PMST的高9位是中斷向量表的指針
27、IPTR。其上電時默認是在FF80H處,這是為了運行固化在內部ROM的上電加載程序(見實驗八的程序加載部分)。由于FF80H是只讀的,加載用戶自定義的中斷向量表時會報錯。這樣需要重新設置IPTR的值,本書一般把它重定義到0080H(也可以用自定義的地址),并在程序開頭重新設置一下IPTR的值:;改變中斷向量表位置K_IPTR .set 0080h ;指向0080H,默認是FF80LDM PMST,AAND #7FH,A ;保留低7位,清掉高位OR #K_IPTR,A ;將新值傳到高9位STLM A,PMST ;修改PMST寄存器技巧指示:由于這段代碼幾乎每個程序都需要,可以單獨存成一個文件:I
28、PTR0080H.asm,然后在程序需要的地方用.copy或.include指令:.copy “IPTR0080H.asm”或: .include “IPTR0080H.asm”編譯時就會自動把這段代碼嵌到相應位置。稍微要注意的是由于這一小段代碼要用到累加器A,所以最好保證執行這段代碼之前不要使用累加器A。其它還有一些經常重復的代碼,如初始化SP、DP、IPTR的代碼都可以寫在一個文件里include/copy進來。注1:.copy和.inlucde指令效果是一樣的,只是在生成程序列表時,.copy會把代碼復制過來,而.include不會。注2:文件名可以用路徑,如果不用,則編譯器會按下面的循
29、序搜索:當前目錄、編譯選項指定的目錄、環境變量指定的目錄。更多參考:1關于中斷:SPRU131 TMS320C54x DSP Reference Set, Volume 1: CPU and Peripherals,6.10 Interrupts2關于定時器:SPRU131 TMS320C54x DSP Reference Set, Volume 1: CPU and Peripherals,8.4 Timer實驗3.2 外部中斷:頻率計DSP有4個外部中斷INT0-INT3,下降沿觸發,實驗箱的頻率計使用的是INT3。頻率計的設計原理是:在設定時間下計外部中斷INT3的次數,除以定時器的定時
30、周期(也就是乘以定時器中斷的觸發頻率),就得到外部脈沖頻率。實驗箱上配有1.024k-262.144k共8檔頻率源,也可以外接頻率源。用跳線冒選擇頻率源,并接到INT3上。下面的例程是定時器定時1s,在INT3中斷服務子程序中計脈沖個數,到時則關閉中斷。脈沖計數結果顯示到數碼管上,即為以單位為Hz的頻率值*頻率計*.mmregs.global CodeStart.global TINT1_ISR.global INT3_ISR.include "./DefineIO.asm" .dataDATA_DP:PulseCounter: .word 0 ;脈沖計數器Display:
31、 .word 0FH,0FH,0FH,0FH,0FH,0FH;存放數據管顯示值,值F在數碼管上不顯示DotData: .word 000000B ;數碼管的dot pointNumber10: .word 10 ;十六進制轉BCD所除的10.textCodeStart:.copy "./SP_DP_IPTR.asm" ;初始化SP、DP和IPTR的代碼段STM #99,AR1 ;10ms計數后再100分頻STM #Display,AR3 ;定義數據管顯示存貯區指針LD #0,A ;A用來計脈沖數SSBX INTM ;關中斷CALL Timer1Init ;初始化Timer1
32、 STM #110000000B,IMR ;允許Timer1和INT3中斷STM #0FFH,IFR ;清除掛起的中斷RSBX INTM ;開中斷wait: B wait;*外部中斷子程序*INT3_ISR:ADD #1,A ;計中斷次數RETE*定時器中斷子程序*TINT1_ISR:BANZ GoOnCount,*AR1- ;測量次數計數器減1,次數為0就中止計數數,;結束計數STM #0,IMR ;取消所有中斷HEX2BCD: ;把計數結果轉成BCD碼RPT #15SUBC Number10,ASTH A,*AR3+AND #0FFFFH,ABC HEX2BCD,ANEQ ;在數碼管上顯示
33、結果STM #Display,AR3PORTW *AR3+,Digital0PORTW *AR3+,Digital1PORTW *AR3+,Digital2PORTW *AR3+,Digital3PORTW *AR3+,Digital4PORTW *AR3+,Digital5PORTW DotData,DotPoint RETEGoOnCount: ;繼續計數STM #1100001B,IFR ;清除掛起的中斷RETE*定時器初始化*Timer1Init: ;定時器1的寄存器地址TIM1 .set 0030h ;減計數器PRD1 .set 0031h ;存放定時時間常數TCR1 .set 00
34、32h ;定時器狀態及控制寄存器;F=50MHz, T=20ns*(1+15)*(1+3124)=20ns*16*31250=10msSTM #010,TCR1 ;TSS置位停止TimerSTM #31249,PRD1STM #2FH,TCR1RET.end 簡單起見本例只能測一次,可以做一些改進,比如每隔1-2S自動重新測量,或者用按鍵來觸發測量。實驗4.1 數碼管及LED顯示接口實驗實驗箱說明部分已經介紹了數碼管的控制原理,下面的程序DigitalLED.asm簡單的演示了對數碼管和LED控制的指令,可以在顯示預設的數字和LED狀態。復雜的程序可以見附盤的流水燈程序,DigitalLED2
35、.asm;=;DigitalLED.asm;實驗用DSP控制實驗板數碼管;DSP用I/O指令對CPLD地址1000-10005寫數據,分別對應Digtal0-5;=.mmregs.def main ;主程序入口.ref Timer0Init ;Timer0初始化子程序;數據管地址Digital0 .set 1000H ;數據管1Digital1 .set 1001H ;數據管2Digital2 .set 1002H ;數據管3Digital3 .set 1003H ;數據管4Digital4 .set 1004H ;數據管5Digital5 .set 1005H ;數據管6 DotPoint
36、.set 1006H ;小數點LED .set 1007H ;LEDSTACK .usect "STACK",10H ;分配堆棧空間.dataDATA: .word 1,2,3,4,5,6 ;測試數據Dot_DATA: .word 010101b;LED_DATA: .word 0101010b.textmain:STM #STACK+10H,SP ;設堆棧指針SPSTM #K_SWWSR,SWWSRSSBX INTM ;關中斷LD #DATA,DP ;設數據地址DPSTM #DATA,AR1*寫數據PORTW *AR1+,Digital0PORTW *AR1+,Digit
37、al1PORTW *AR1+,Digital2PORTW *AR1+,Digital3PORTW *AR1+,Digital4PORTW *AR1+,Digital5PORTW Dot_DATA,DotPointPORTW LED_DATA,LEDEND: B END .end 技巧提示:數碼管、LED的IO地址的定義也可以單獨存到一個文件中,在需要它的程序中用.include/.copy指令。練習:修改預設值重新運行觀察結果。實驗4.2 鍵盤接口實驗實驗板上有四個按鍵,當有鍵按下時,會觸發DSP的INT1中斷,在INT1的中斷服務程序中讀入鍵碼,判斷哪一個鍵被按下,然后執行相應的操作。各鍵對
38、應的二進制和十六進制鍵碼分別為:按鍵1: 0001B 1H按鍵2: 0010B 2H按鍵3: 0100B 4H按鍵4: 1000B 8H下面有一個小例子:*keyboardTest.asm*測試按鍵的功能,響應按鍵中斷,讀取鍵值,*并對不同鍵按鍵次數計數*.mmregs.global CodeStart.global INT1_ISR.include "./DefineIO.asm".dataDATA_DP:Counter1: .word 0 ;按鍵1計數器Counter2: .word 0 ;按鍵2計數器Counter3: .word 0 ;按鍵3計數器Counter4:
39、 .word 0 ;按鍵4計數器 KeyValue: .space 30H*16 ;按鍵歷史緩沖區.textCodeStart:.copy "./SP_DP_IPTR.asm" ;初始化SP、DP和IPTR代碼段;初始化變量STM #KeyValue,AR2ST #0,Counter1ST #0,Counter2ST #0,Counter3ST #0,Counter4SSBX INTM ;關中斷STM #00000010B,IMR ;允許INT1中斷STM #0FFH,IFR ;清除掛起的中斷RSBX INTM ;開中斷wait: B wait;*鍵盤中斷子程序* INT1
40、_ISR: PORTR #Keyboard,*AR2 ;讀取鍵碼ANDM #0FH,*AR2 ;Keyvalue只有低四位有效BITF *AR2,#01H ;如果鍵碼為1,跳轉到FuncKey1 BC FuncKey1,TC BITF *AR2,#02H ;如果鍵碼為2,跳轉到FuncKey2BC FuncKey2,TCBITF *AR2,#04H ;如果鍵碼為3,跳轉到FuncKey3BC FuncKey3,TCBITF *AR2,#08H ;如果鍵碼為4,跳轉到FuncKey4BC FuncKey4,TCB FuncKeyEnd ;FuncKey1: ADDM #1,Counter1 ;按
41、鍵1計數器+1B FuncKeyEndFuncKey2: ADDM #1,Counter2 ;按鍵2計數器+1B FuncKeyEndFuncKey3: ADDM #1,Counter3 ;按鍵3計數器+1B FuncKeyEndFuncKey4: ADDM #1,Counter4 ;按鍵4計數器+1B FuncKeyEnd FuncKeyEnd: PORTW *AR2+,Digital0 ;當前鍵碼顯示到數碼管上STM #0FFH,IFR ;清除掛起的中斷RETE實驗六 DMA實驗實驗目的:學習DMA的原理的使用方法實驗內容:用DMA方法接收McBSP接口語音芯片的數據DMA是直接存儲器存取
42、,是一種傳送不占用CPU處理時間的大批量數據傳送的有效方式。我們用以下實例來說明它的應用:如果我們要做一個音頻處理系統,需要連續用McBSP接口的語音芯片采集若干個樣本進行處理,比如頻譜分析、音頻壓縮等。本例假設要每采集256個樣本進行一次處理。上例用的是查詢方式,占用了所有CPU資源。可以用中斷方式,結合前面的實驗不難做到,請同學們自行完成。在這個實驗中我們將介紹一個更有效的DMA傳送方式。我們比較一下用中斷方式和DMA方式的效率有何不同:一、中斷方式:每當中緩沖串口接收一個16bit樣本的數據,觸發一次串口接收中斷,將數據轉移到一個256 word的數據接收緩沖區并計數。當計數達到256個
43、,即緩沖區滿時,將256個數據轉移到數據處理存儲區,并通知主程序進行處理。二、DMA方式:我們使用一個通道自動接收McBSP傳來的數據并存入接收緩沖區,當緩沖區滿時觸發DMA中斷,將256個數據傳送到數據處理存儲區,傳送完畢觸發通知主程序進行處理。由上比較可見,每接收一批樣本,用中斷方式將觸發256次中斷,也就是主程被打斷256次去接收數據。而用DMA方式,只在全部256個樣本全部接收完畢時發生一次中斷,這時主程序應該已經處理完上一批的數據。進一步考慮,當數據處理完畢后還需要將數據送走,這時又可以采用另一個DMA通道完成這個任務,將CPU釋放出來等待進行下一批樣本的處理。事實上DMA傳送并非比
44、用CPU直接處理快,例如在內部存貯器之間傳送時,用CPU需要2cycle/word,而用DMA要4cycle/word。DMA的優勢在是把CPU解放出來做其它的事。以下是兩個DMA通道與CPU協調工作的情況(陰影部分表示空閑)。DMA0CPU DMA1 從McBSP接收數據DMA中斷,將數據從接收緩沖區轉移到數據處理存儲區對對數據進行處理將處理完的數據送走估計一下各步的時間,設采樣頻率是8kHz,CPU時鐘頻率100MHz。因此一個處理周期為1/8kHz*256=32ms。傳送256個點至少需要256word*2cycle/word=512cycle=5.12us。假設處理完后數據量不變,需要
45、256word*4cycle/word=1024 cycle=10.24us。所需要的時鐘周期取決于算法的復雜度了。計算好各步所需要的時鐘周期,就可以根據情況靈活選擇如何使用DMA,例如如果CPU有足夠的空閑時間送走數據就不必要;如果CPU仍然不足,就需要再增加個一個DMA來做的任務。如果數據的輸出也是從McBSP輸出,還要用一個DMA通道進行McBSP的發送。總之要合適地使用DMA通道,使用不當也會使程序變得更加復雜,例如多個DMA通道優先級的問題等等。C54x系列有6個DMA通道,但不同型號C54x系列DSP DMA通道的使用不全相同,如C5402只能將DMA通道用于內部數據存貯器之間傳送
46、、McBSP和HPI接口,而C5410可用于內部、外部數據、程序存貯器之間傳送。詳細介紹請參閱SPRU302 TMS320C54x DSP Reference Set, Volume 5: Enhanced Peripherals和各DSP的數據手冊。實驗7.1 FIR;=; fir4.asm;用用循環緩沖區和雙操作數尋址方法實現FIR濾波器;先用matlab,選擇80點漢明窗設計一個截止頻率為0.2的低通濾波器; 本例與前不同的是系數直接引用程序存儲器的系數表;N=5 y(n)=h0*x(n)+h1*x(n-1)+h2*x(n-2)+h3*x(n-3)+h4*x(n-4);=.title &
47、quot;fir4.asm".mmregs .def start;分配數據存儲區.bss y,1 ;yxn .usect "xn",80 ;xnh .usect "h",80 ;hPA0 .set 0000H ;數據輸出端口PA1 .set 0001H ;數據輸入端口;參數表.datatable: .word -7,-18,-24,-22,-9,11,33,48 ;已在Matlab中轉成十六進制的小數.word 46,20,-24,-73,-104,-97,-43,49.word 146,204,187,81,-91,-268,-371,-33
48、7.word -144,162,476,661,603,261,-297,-894.word -1283,-1222,-562,697,2373,4142,5618,6456.word 6456,5618,4142,2373,697,-562,-1222,-1283.word -894,-297,261,603,661,476,162,-144.word -337,-371,-268,-91,81,187,204,146.word 49,-43,-97,-104,-73,-24,20,46.word 48,33,11,-9,-22,-24,-18,-7start: SSBX FRCT ;小數乘
49、法;把參數表復制到數據存儲區STM #h,AR1 RPT #79MVPD #table,*AR1+;把x(n)-x(n-79)賦始值0STM #xn,AR1RPT #79ST #0,*AR1+STM #xn+79,AR3 ;x(n-79)-AR3STM #h+79,AR4 ;h(n-79)-AR4STM #80,BK ;循環緩沖區大小80 STM #-1,AR0 ;指針調整值-1LD #xn,DP ;DP指向xn所在頁PORTR PA1,xn ;輸入數據LD #y,DP ;DP指向y所在頁FIR: RPTZ A,#79 ;進行一次FIR運算MAC *AR3+0%,*AR4+0%,A;A=(AR3)*(AR4)+A,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 存儲場地租賃服務合同
- 校園保安合同的補充協議
- 網約租車合同協議書
- 和合同解協議
- 光伏項目協議書合同模板
- 婚前彩禮合同協議
- 房地產中介合同協議
- 智慧旅游合同協議
- 股東投資協議合同
- 合同出借協議
- 國內反向保理業務協議書
- 北師大版小學三年級數學下冊《有多重》練習
- YYT 1579-2018體外診斷醫療器械體外診斷試劑穩定性評價
- Q∕SY 1671-2014 長輸油氣管道維搶修設備及機具配置規范
- 七版教材中藥學教學內容
- 實驗報告3(PN結工藝制備)
- DB44∕T 1988-2017 廣東終身教育資歷框架等級標準
- 巧用EXCEL建立合同管理臺帳并動態管理合同
- 汽車吊接地比壓計算
- 基于單片機的環境監測系統PPT演講
- 三相異步電動機
評論
0/150
提交評論