




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、DSP原理及應用實 驗 指 導 書楊宣兵 編 寫適用專業:電子信息工程 _電子科學與技術 信息工程 通信工程 信息與通信工程學院2011 年 5 月前 言DSP原理與應用是電子信息類專業信號與信息處理方向的一門專業必修課,同時也是其他電類專業的一門重要的選修課。課程以DSP芯片原理及基于DSP芯片的應用系統開發為主要內容,介紹了DSP芯片原理與開發工具及軟硬件開發方法。開設必要的課程實驗,使學生加深對DSP原理與片上資源應用的掌握,掌握DSP項目開發流程、開發方法、開發平臺CCS的基本使用、DSP對外設控制方法以及經典數字信號處理算法的DSP工程實現等。培養學生將數字信號處理理論應用到實際項目
2、中的工程意識與工程開發能力。通過本課程實驗,提高學生分析問題、解決問題的能力和基于DSP的嵌入式系統開發的實際動手能力,為學生步入社會奠定工程開發基礎。對不同專業根據實驗教學大綱進行實驗項目選擇。實驗項目設置與內容提要序號實驗項目實驗學時每組人數實驗類型實驗要求內 容 提 要1基本算術運算的DSP實現41驗證必修1、CCS基本操作;2、DSP應用程序結構和開發流程;3、基于DSP開發環境(Simulator)完成16位定點加、減、乘、除運算。2數字振蕩器的設計與實現41設計必修1、CCS圖形工具使用;2、基于C語言和匯編語言混合程序設計;3、定時器等外設資源的應用;4、簡單算法(迭代)的實現。
3、3BSP串口通信實現42綜合必修1、McBSP串口操作;2、VC54XX片上ROM資源的使用;4FIR數字濾波器設計與實現實現42設計選修1、McBSP串口操作與串口中斷服務程序編寫;2、AD/DA操作;3、FIR濾波器實現的特殊指令應用;4、CCS高級調試工具使用。5TMS320VC5402的Bootloader設計與實現4510設計必修1、編程完成對外設I/O端口的控制,實現流水燈功能;2、完成從COFF文件到啟動表的轉換;3、完成程序的固化與脫離上位機控制的獨立運行。6快速傅立葉變換實現42綜合選修1、輔助寄存器使用,位倒序尋址方式應用等;2、FFT算法的編程實現;3、CCS探針和圖形工
4、具使用。7外部設備控制實驗41綜合任選1、熟悉外部中斷使用與中斷服務程序編寫方法;2、掌握對外設端口的操作方法;3、掌握外設的控制方法(包括鍵盤、LED、步進電機、LCD等);8雙音多頻信號編碼器設計22設計選修掌握DTMF信號的產生原理;掌握DTMF信號產生的DSP實現方法;9雙音多頻信號解碼器設計42設計選修掌握DTMF信號的解碼算法原理;掌握DTMF信號解碼算法的DSP實現方法;目 錄實驗一 基本算術運算的DSP實現1實驗二 數字振蕩器的設計與實現.9實驗三 BSP 串口通信實現16實驗四 FIR 數字濾波器設計與實現.25實驗五 TMS320VC5402 的Bootloader設計與實
5、現.34實驗六 快速傅立葉變換(FFT)的實現.45實驗七 外部中斷、按鍵、LED控制實驗.67實驗八 雙音多頻DTMF信號產生.70實驗九 雙音多頻DTMF信號解碼.76附錄一 DES5402PP-U性能介紹82附錄二CCS驅動程序的安裝83附錄三DES5402PP-U功能詳細介紹87附錄四 DES5402PP-U板上設置、狀態顯示、跳線一覽表93實驗一: 基本算術運算的DSP實現 實驗學時:4實驗類型:驗證實驗要求:必修一、實驗目的1、掌握CCS的配置與基本使用方法;2、掌握C54X匯編語言程序結構,掌握基于CCS開發平臺Simulator采用匯編指令完成16位定點加減乘除運算程序設計并對
6、運算結果進行評價;二、實驗內容本實驗學習使用定點DSP實現16位定點加、減、乘、除運算的基本方法和編程技巧。三、實驗原理、方法和手段1定點DSP中數據表示方法 C54X是16位的定點DSP。一個16位的二進制數既可以表示一個整數,也可以表示一個小數。當它表示一個整數時,其最低位(D0)表示,D1位表示,次高位(D14)表示。如果表示一個有符號數時,最高位(D15)為符號位,0表示正數,1表示負數。例如,07FFFH表示最大的正數32767(十進制),而0FFFFH表示最大的負數-1(負數用2的補碼方式顯示)。當需要表示小數時,小數點的位置始終在最高位后,而最高位(D15)表示符號位。這樣次高位
7、(D14)表示,然后是,最低位(D0)表示。所以04000H表示小數0.5,01000H表示小數,而0001H表示16位定點DSP能表示的最小的小數(有符號)=0.000030517578125。在后面的實驗中,除非有特別說明,我們指的都是有符號數。在C54X中,將一個小數用16位定點格式來表示的方法是用乘以該小數,然后取整。從上面的分析可以看出,在DSP中一個16進制的數可以表示不同的十進制數,或者是整數,或者是小數(如果表示小數,必定小于1),但僅僅是在做整數乘除或小數乘除時,系統對它們的處理才是有所區別的,而在加減運算時,系統都當成整數來處理。 2實現16定點加法 C54X中提供了多條用
8、于加法的指令,如ADD,ADDC,ADDM和ADDS。其中ADDS用于無符號數的加法運算,ADDC用于帶進位的加法運算(如32位擴展精度加法),而ADDM專用于立即數的加法。在本實驗中,我們可以使用下列代碼來說明加法運算:ldtemp1,a;將變量temp1裝入寄存器Aaddtemp2,a;將變量temp2與寄存器A相加,結果放入A中stla,add_result ;將結果(低16位)存入變量add_result中。注意,這里完成計算temp3=temp1+temp2,我們沒有特意考慮temp1和temp2是整數還是小數,在加法和下面的減法中整數運算和定點的小數運算都是一樣的。3實現16位定點
9、減法C54X中提供了多條用于減法的指令,如SUB,SUBB,SUBC和SUBS。其中SUBS用于無符號數的減法運算,SUBB用于帶進位的減法運算(如32位擴展精度的減法),而SUBC為移位減,DSP中的除法就是用該指令來實現的。SUB指令與ADD指令一樣,有許多的尋址方式,其詳細使用說明請查閱TI文檔。在本實驗中,我們可以使用下列代碼來說明減法運算:stm#temp1,ar3;將變量temp1的地址裝入ar3寄存器stm#temp3,ar2;將變量temp3的地址裝入ar3寄存器sub*ar2+, *ar3,b ;將變量temp3左移16位同時變量temp1也左移;16位,然后相減,結果放入寄
10、存器B(高16位)中,;同時ar2加1。sthb,sub_result;將相減的結果(高16位)存入變量sub_result。4實現16定點整數乘法 在C54X中提供了大量的乘法運算指令,其結果都是32位,放在A或B寄存器中。乘數在C54X的乘法指令很靈活,可以是T寄存器、立即數、存貯單元和A或B寄存器的高16位。在C54X中,一般對數據的處理都當做有符號數,如果是無符號數乘時,請使用MPYU指令。這是一條專用于無符號數乘法運算的指令,而其它指令都是有符號數的乘法。在本實驗中,我們使用下列代碼來說明整數乘法運算:rsbx FRCT;清FRCT標志,準備整數乘ldtemp1,T;將變量temp1
11、裝入T寄存器mpytemp2,a;完成temp2*temp1,結果放入A寄存器(32位)例如,當temp1=1234H(十進制的4660),temp2=9876H(十進制的-26506),乘法的結果在A寄存器中為0F8A343F8H(十進制的-123517960)。這是一個32位的結果,需要兩個內存單元來存放結果:stha,mpy_I_h;將結果(高16位)存入變量mpy_I_hstla,mpy_I_l;將結果(低16位)存入變量mpy_I_l當temp1=10H(十進制的16),temp2=05H(十進制的5),乘法結果在A寄存器中為00000050H(十進制的80)。對于這種情況,僅僅需要
12、保存低16位即可:stla,mpy_I_l;將結果(低16位)存入變量mpy_I_l5實現16定點小數乘法 在C54X中,小數的乘法與整數乘法基本一致,只是由于兩個有符號的小數相乘,其結果的小數點的位置在次高的后面,所以必須左移一位,才能得到正確的結果。C54X中提供了一個狀態位FRCT,將其設置為1時,系統自動將乘積結果左移移位。但注意整數乘法時不能這樣處理,所以上面的實驗中一開始便將FRCT清除。兩個小數(16位)相乘后結果為32位,如果精度允許的話,可以只存高16位,將低16位丟棄,這樣仍可得到16位的結果。在本實驗中,我們使用下列代碼來說明小數乘法運算:ssbxFRCT;FRCT=1,
13、準備小數乘法ldtemp1,16,a;將變量temp1裝入寄存器A的高16位mpyatemp2;完成temp2乘寄存器A的高16位,結果在B中;同時將temp2裝入T寄存器sthb,mpy_f;將乘積結果的高16位存入變量mpy_f例如,temp1=temp2=4000H(十進制的0.5),兩數相乘后結果為20000000(十進制的=0.25)。再如,temp1=0ccdH(十進制的0.1),temp2=0599aH(十進制的0.7),兩數相乘后B寄存器的內容為08f5f0a4H(十進制的0.07000549323857)。如果僅保存結果的高16位08f5H(十進制的0.06997680664
14、063)。有時為了提高精度,可以使用RND或使用MPYR指令對低16位做四舍五入的處理。6實現16定點整數除法 在C54X中沒有提供專門的除法指令,一般有兩種方法來完成除法。一種是用乘法來代替,除以某個數相當于乘以其倒數,所以先求出其倒數,然后相乘。這種方法對于除以常數特別適用。另一種方法是使用SUBC指令,重復16次減法完成除法運算。下面我們以temp1/temp2為例,說明如何使用SUBC指令實現整數除法。其中變量temp1為被除數,temp2為除數,結果即商存放在變量temp3中。在完成整數除法時,先判斷結果的符號。方法是將兩數相乘,保存A或B的高16位以便判斷結果的符號。然后只做兩個正
15、數的除法,最后修正結果的符號。為了實現兩個數相除,先將被除數裝入A或B的低16位,接著重復執行SUBC指令,用除數重復減16次后,除法運算的商在累加器的低16位,余數在高16位。詳細代碼如下:ldtemp1,T;將被除數裝入T寄存器mpytemp2,A;除數與被除數相乘,結果放入A寄存器ldtemp2,B;將除數temp2裝入B寄存器的低16位absB;求絕對值stlB,temp2;將B寄存器的低16位存回temp2ldtemp1,B;將被除數temp1裝入B寄存器的低16位absB;求絕對值rpt#15;重復SUBC指令16次subctemp2,b;使用SUBC指令完成除法運算bcddiv_
16、end,agt;延時跳轉,先執行下面兩條指令,然后判斷A,;若A0,則跳轉到標號div_end,結束除法運算stlB,quot_i;將商(B寄存器的低16位)存入變量quot_isthB,remain_i;將余數(B寄存器的高16位)存入變量remain_ixorB;若兩數相乘的結果為負,則商也應為負。先;將B寄存器清0subquot_i,B;將商反號stlB,quot_i;存回變量quot_i中div_end:上面給出的是整數除法的通用程序,在實際應用中可以根據具體情況做簡化。如正數除法可以直接將被除數temp1裝入B寄存器的低16位,然后用SUBC指令循環減除數temp2,減完后B寄存器中
17、低16位為商,高16位為余數,不用判斷符號,從而節省時間。例如temp1=10H(十進制的16),temp2=5,兩數相除后商為3(在B寄存器的低16位),余數為1(在B寄存器的高16位)。7實現16定點小數除法 在C54X中實現16位的小數除法與前面的整數除法基本一致,也是使用循環的SUBC指令來完成。但有兩點需要注意:第一,小數除法的結果一定是小數(小于1),所以被除數一定小于除數。這與整數除法正好相反。所以在執行SUBC指令前,應將被除數裝入A或B寄存器的高16位,而不是低16位。其結果的格式與整數除法一樣,A或B寄存器的高16位為余數,低16位為商。第二,與小數乘法一樣,應考慮符號位對
18、結果小數點的影響。所以應對商右移一位,得到正確的有符號數。其詳細代碼如下:ldtemp1,T;將被除數裝入T寄存器mpytemp2,A;除數與被除數相乘,結果放入A寄存器ldtemp2,B;將除數temp2裝入B寄存器的低16位absB;求絕對值stlB,temp2;將B寄存器的低16位存回temp2ldtemp1,16,B;將被除數temp1裝入B寄存器的高16位absB;求絕對值rpt#15;重復SUBC指令16次subctemp2,b;使用SUBC指令完成除法運算and#0ffffh,B;將B寄存器的高16位清為0。這時余數被;丟棄,僅保留商bcddiv_end,agt;延時跳轉,先執行
19、下面兩條指令,然后判斷A,; 若A0,則跳轉到標號div_end,結束除法運算stlB,-1,quot_f;將商右移一位后存入變量quot_f,右移是為了;修正符號位xorB;若兩數相乘的結果為負,則商也應為負。先將B;寄存器清0subquot_f,B;將商反號stlB,quot_f;存回變量quot_f中div_end: 注意,上面的C54X的16位定點有符號小數除法通用程序沒有保留余數,商保存在變量temp3中。舉一個例子,當temp1=2cccH(十進制的0.35),temp2=55c2H(十進制的0.67),兩數相除的結果為temp3=42dcH(十進制的0 x42dc0.52233)
20、。四、實驗條件PC機, DES5402PP-U實驗系統(若使用,需要將CCS配置為硬件仿真器)五、實驗步驟本實驗需要使用C54X匯編語言實現加、減、乘、除的基本運算,并通過DES的存貯器顯示窗口觀察結果。實驗分兩步完成:(1).編寫實驗程序代碼本實驗的匯編源程序代碼主要分為六個部分:加法、減法、整數乘法、小數乘法、整數除法和小數除法。每個部分后面都有一條需要加斷點的標志語句:nop 當執行到這條加了斷點的語句時,程序將自動暫停。這時你可以通過“存貯器窗口”檢查計算結果。當然你看到的結果都是十六進制的數。 (2).在simulator上調試運行,并觀察結果 在完成實驗程序代碼的輸入,并在CCS集
21、成開發環境采用編譯器對各模塊進行編譯并連接后,就可以在simulator上調試運行。步驟如下:將CCS配置為C5402 simulator,啟動CCS。新建工程exer1.prj,將編寫的主程序文件、CMD文件、中斷向量表添加到工程,對各模塊進行編譯,然后rebuild,生成.out輸出文件。c.在CCS界面單擊菜單欄File下面的“Load”選項,并在彈出的File Name對話框中選擇Debug文件夾下面的exer1.out裝入基本算術運算實驗程序,這時應能在“反匯編”窗口看到程序代碼。d. 用鼠標選中“Memory”窗口,并在其中選擇要查看的存貯器地址段:0 x0800 x08e。e.
22、在反匯編窗口中在每個“nop”指令處都設一個斷點,方法有兩種:1.用鼠標單擊該指令將其點亮即可。2.在菜單欄中選擇“Break”Add”,然后在彈出的對話框中鍵入欲加斷點的地址即可。f. 單擊菜單欄下的“Run=F5”按鈕,啟動執行基本算術運算程序,程序在執行完加法運算后自動暫停。通過“CPU”窗口可以看到寄存器AHL的內容為0 x46,這正是加法運算的結果。同樣,在“Memory”窗口中,可以看到0 x81,0 x82,0 x88的內容為分別為0012,0034,0 x46。執行加法運算后,將0 x81和0 x82的內容相加,結果放在0 x88單元。g. 在“Memory”窗口中用鼠標左鍵雙
23、擊0 x81單元,這時可以修改該內存單元的內容。輸入新的數據0 x0ffee(十進制的-18),編輯內容時請直接輸入FFEE(十六進制),然后回車確認,便完成對0 x81單元的修改。h. 在“CPU” 窗口中修改PC值,方法也是鼠標左鍵雙擊PC寄存器的內容,輸入新的PC值0 x1805(編輯內容時直接輸入1805),并用回車鍵確認。i. 單擊菜單欄下的“Run=F5”按鈕,程序從當前PC繼續運行,重新計算0 x81和0 x82的和,結果在0 x88中。當程序再次暫停時,可以看到AHL寄存器和0 x88的內容為0 x22(十進制的34),這正是我們希望的結果:-18+52=34。 j. 單擊“R
24、un=F5”按鈕,程序從當前PC繼續運行,完成減法運算。當程序再次暫時(斷點位于0 x1813),可以看到0 x83和0 x84單元的內容分別為FFEE和0012,B寄存器的內容為ffdc0000,而0 x89的內容為ffdc(十進制-36),這正是我們希望的結果:。注意,該減法操作使用了輔助寄存器尋址,所以計算結果在B寄存器的高16位。 k. 單擊“Run=F5”按鈕,程序從當前PC繼續運行,完成整數乘法運算。當程序再次暫時(斷點位于0 x181d),可以看到0 x81和0 x82單元的內容分別為0012和0034,A寄存器的內容為000003A8,這正是我們希望的結果:18*52=936(
25、0 x3a8)。這時我們可以用1個16位的內容單元來保存結果,如將A寄存器的低16位存入0 x8b單元。但如果將0 x81的內容修改為0 x2000(十進制的8192),在“CPU窗口”中將PC修改為1818,然后繼續運行,重新計算乘法。當程序完成乘法暫停時,可以看到A寄存器的內容為00068000,這也是一個正確的結果:8192*52=425984(0 x68000)。此時將無法用一個16位的存貯單元來保存A寄存器中的結果。l. 單擊“Run=F5”按鈕,程序從當前PC繼續運行,完成小數乘法運算。當程序再次暫停時(斷點位于0 x1826),可以看到0 x83和0 x84單元的內容分別為400
26、0和b548,A寄存器的內容為40000000,乘法的結果在B寄存器中為daa40000,這正是我們希望的結果:0.5*(-0.58374)=-0.29187(0 x0daa4)。對于小數乘法,一般情況都可以用1個16位的內容單元將B寄存器的高16保存(如存入0 x8c單元)。m. 單擊“Run=F5”按鈕,程序從當前PC繼續運行,完成整數除法運算。當程序再次暫時(斷點位于0 x183b),可以看到0 x81,0 x82,0 x8d和0 x8e單元的內容分別為0034,0012,FFFE和0010,這正是我們希望的結果:52除以-18,商為-2(0 xfffe) ,余數為16(0 x10)。n
27、. 單擊“Run=F5”按鈕,程序從當前PC繼續運行,完成小數除法運算。當程序再次暫停時(斷點位于0 x1852),可以看到0 x81,0 x82和0 x8f單元的內容分別為4000,4ab8和6da3,這正是我們希望的結果:0.5/0.58374=0.8565457(0 x6da3)。o. 如果以上程序運行不正確,請檢查代碼是否輸入正確,還可以在源代碼中插入斷點調試,注意對中間結果的觀察。六、實驗報告要求1、實驗前進行預習,初步編寫相應實驗程序代碼2實驗時對實驗代碼進行調試,并不斷修改達到正確結果;3寫出本次實驗的心得體會。七、思考題1、對直接尋址用法有什么體會?如果在直接尋址前遺漏對DP初
28、始化,對結果有什么影響?2、在小數乘法中使用了置FRCT標志為1的指令。如果將該語句取消,那么B寄存器的結果是多少?想想什么時候應該設置FRCT標志?實驗_2_:數字振蕩器的設計與實現實驗學時: 4實驗類型:設計實驗要求:必修一、實驗目的通過本實驗的學習,讓學生掌握多模塊程序設計方法,掌握定時器使用,掌握簡單算法的DSP實現以及CCS環境下圖形工具的簡單應用。二、預習和參考(1)數字振蕩器原理設一個傳遞函數為正弦序列sinkT,其z變換為 H(z)=其中,A=2cosT, B=-1, C=sinT。設初始條件為0,求出上式的反Z變換得: yk=Ayk-1+Byk-2+Cxk-1這是一個二階差分
29、方程,其單位沖擊響應即為sinkT。利用單位沖擊函數xk-1的性質,即僅當k=1時,xk-1=1,代入上式得: k=0 y0 = Ay-1 + By-2 + 0 = 0 k=1 y1 = Ay0 + By-2 + c = c k=2 y2 = Ay1 + By0 + 0 = Ay1 k=3 y3 = Ay2 + By1 . k=n yn= Ayn-1 + Byn-2在k2以后,yk能用yk-1和yk-2算出,這是一個遞歸的差分方程。 根據上面的說明,我們可以開始數字振蕩器的設計。設該振蕩器的頻率為2kHz,采樣率為40kHz(通過定時器設置,每隔25us中斷一次,即產生一個yn),則遞歸的差分
30、方程系數為: A=2cosT=2cos (2 x PI x 2000 / 40000)=2 x 0.95105652 B=-1 C=sinT=sin (2 x PI x 2000 / 40000)=0.30901699為了便于定點DSP處理,我們將所有的系數除以2,然后用16位定點格式表示為:這便是本實驗中產生2KHz正弦信號的三個系數。在本實驗中,主程序在初始化時先計算出y1和y2,然后開放定時器中斷。以后每次進入定時器中斷服務程序時,利用前面的y1和y2,計算出新的有y0,通過CCS提供的圖形顯示工具,我們將在圖形窗口中看到一個正弦信號波形。下面是初始化和中斷服務程序代碼片段:初始化y1和
31、y2:ssbxFRCT;置FRCT=1,準備進行小數乘法運算st#INIT_A,AA;將常數A裝入變量AAst#INIT_B,BB;將常數B裝入變量BBst#INIT_C,CC;將常數C裝入變量CCpshdCC;將變量CC壓入堆棧popdy2;初始化y2=CCldAA,T;裝AA到T寄存器mpyy2,a;y2乘系數A,結果放入A寄存器stha,y1;將A寄存器的高16位存入變量Y1中斷服務程序片段:ldBB,T;將系數B裝入T寄存器mpyy2,a;y2乘系數B,結果放入A寄存器ltdy1;將y1裝入T寄存器,同時復制到y2macAA,a;完成新正弦數據的計算,a寄存器中為; y1*AA+y2*
32、BBstha,1,y1;將新數據存入y1,因所有系數都除過2,;所以在保存結果時轉移一位,恢復數據正常大小。stha,1,y0;將新正弦數據存入y0 (2)C54X的定時器操作 C54X的片內定時器利用CLKOUT時鐘計數,用戶使用三個寄存器(TIM,PRD,TCR)來控制定時器,參見表2-1。在表2-2中列出了定時器控制寄存器的各個比特位的具體定義。VC5402的另一個定時器(定時器1)的控制寄存器分別為:0 x30(TIM1),0 x31(PRD1),0 x32(TCR1)。 表2-1 VC5402定時器0的相關寄存器寄存器地址名稱用途0024hTIM定時器寄存器,每計數一次自動減1002
33、5hPRD定時器周期寄存器,當TIM減為0后,CPU自動將PRD的值裝入TIM0026hTCR定時器控制寄存器表2-2 定時器控制寄存器(TCR)bit概要比特 名稱 功 能15-12 保留 讀出時為011 Soft 該比特位與10位配合使用以決定定時器在使用仿真調試時狀態。 Soft=0 當進入仿真調試時,定時器立即停止工作。 Soft=1 當計數器被減為0后,停止工作。10 Free 該位與11位配合使用以決定定時器在使用仿真調試時狀態。 Free=0 根據11比特位決定定時器狀態。 Free=1 忽略11比特位,定時器不受影響。9-6 PSC 定時器預置計數器。當PSC減為0后,CPU自
34、動將TDDR裝入,然后TIM開始減1。5 TRB 定時器復位。當TRB=1時,CPU將PRD寄存器的值裝入TIM寄存器,將TDDR的值裝入PSC4 TSS 定時器啟停控制位。當系統復位時,TSS被清除,定時器立刻開始工作。 TSS=0 表示啟動定時器 TSS=1 表示停止定時器0-3 TDDR 定時器擴展周期。當PSC減到0后,CPU自動將TDDR的值裝入PSC,然后TIM減 1。所以整個定時器的周期寄存器可以有20個比特(PRD+TDDR)。 從上面的介紹可以看到定時器實際上可以有20個比特的周期寄存器。它對CLKOUT信號計數,先將PSC減1,直到PSC為0,然后用TDDR重新裝入PSC,
35、同時將TIM減1,直到TIM減為0。這時CPU發出TINT中斷,同時在TOUT引腳輸出一個脈沖信號,脈沖寬度為CLKOUT一致。然后用PRD重新裝入TIM,重復下去直到系統或定時器復位。因而定時器中斷的頻率由下面的公式決定: TINT的頻率= 其中tc表示CLKOUT的周期。定時器當前的值可以通過讀取TIM寄存器和TCR寄存器的PSC比特位得到。下面是本實驗中初始化定時器的程序片段: stm#10h,TCR;停止定時器stm#2499,PRD;設置PRD寄存器值為2499,TINT中斷頻率為 ; Foutclk /(2499+1)= 100MHz/2500 = 40 KHzstm#20h,TC
36、R; 重新裝入TIM和PSC,然后啟動定時器 (3)C54X中斷的使用 在C54X中用戶可以通過中斷屏蔽寄存器IMR來決定開放或關閉一個中斷請求。圖2-1給出了C5402的IMR寄存器的各個比特位的定義。 圖2-1 C5402的IMR寄存器其中,HPINT表示HPI接口中斷,INT3-INT0為外部引腳產生的中斷,TXINT和TRINT為TDM串口的發送和接收中斷,BXINT0和BRINT0為BSP串口的發送和接收中斷,TINT0為定時器0中斷。在中斷屏蔽寄存器IMR中,1表示允許CPU響應對應的中斷,0表示禁止。當然要CPU響應中斷,ST1寄存器中的INTM還應該為0(允許所有的中斷)。當D
37、SP響應中斷時,PC指針指向中斷向量表中對應中斷的地址,進入中斷服務子程序。中斷向量表是C54X存放中斷服務程序的一段內存區域,大小為80H。在中斷向量表中,每一個中斷占用4個字的空間,一般情況是將一條跳轉或延時跳轉指令存放于此。當然,如果中斷服務程序很短(小于或等于4個字),可以直接放入該向量表。中斷向量表的位置可以通過修改基地址來改變,其基地址由PMST寄存器中的IPTR(15-7 bits)決定。中斷向量表的各中斷的偏移說明以及中斷向量地址的形成請參考教材以及教材附錄部分。例如C54x復位后其IPTR全為1,復位中斷的偏移量為0,所以中斷向量表起始位置在0FF80H,因而復位后程序從0F
38、F80H開始運行。本實驗的初始化程序讀取中斷向量表的啟始地址,然后設置PMST的高9位,以便DSP能正確響應中斷,代碼如下: ld #0,dp;設置DP頁指針 ssbx intm;關閉所有中斷 ld #vector, a;讀出中斷向量(地址vector在中斷向量表程序中定義) and #0FF80h, a;保留高9位(IPTR) andm #007Fh, pmst;保留PMST的低7位 or pmst, a; stlm a, pmst;設置PMST(其中包括IPTR)三、實驗要求基于DSP的定時器產生2KHz正弦波(采樣率為40KHz或者自定義,但必須滿足采樣定理),采樣CCS圖形查看工具查看
39、產生波形及其頻譜圖。四、實驗條件PC機, DES5402PP-U實驗系統五、調試及結果測試本實驗需要使用C54X匯編語言或C語言實現數字振蕩器,并通過CCS提供的圖形顯示窗口觀察輸出信號波形以及頻譜。實驗分下面幾步完成: (1).根據確定數字振蕩器的頻率,計算并確定系數。 (2)啟動CCS,新建工程文件,如文件名為sinewave.prj。選擇Project菜單中的Add File to Project選項,將所編寫的匯編源程序exer2.asm、vec_table.asm和連接命令sinewave.cmd文件依次添加到工程文件中。注意,你可以在添加文件對話框中選擇顯示不同的文件類型來加快文件
40、選擇速度。你也可以使用鼠標右鍵單擊工程文件名(如sinewave.prj)并選擇Add Files項來添加需要的文件。其中,exer2.asm包括初始化代碼和中斷服務程序,而vec_talbe.asm包含中斷向量表。 (3)選擇Project菜單中的Options選項,或使用鼠標右鍵單擊工程文件名(如sinewave.prj)并選擇Options項來修改或添加編譯、連接中使用的參數。例如,選擇Assembler窗口,選擇“Enable Symbolic Debug Infomation”以便使用匯編源代碼級調試(你可以在匯編源程序設置斷點等等)。選擇Linker窗口,在“Output File
41、name”欄中寫入輸出OUT文件的名字,如sine.out,你還可以設置生成的MAP文件名。 (4)完成編譯、連接,正確生成OUT文件。然后使用File菜單的“Load Program”選項,將生成的OUT文件(如sine.out)裝入DSP的片內存儲器。這時CCS將顯示程序的啟始地址_c_int00。 (5)選ViewGraphTime/Frequency打開圖形顯示設置窗口。在彈出的對話框中按圖2-2設置所示,主要修改“Start Address”為y0(y0為生成的正弦波輸出變量);“Acquisition Buffer Size”為1,“DSP Data Type”為“16-bit s
42、igned integer”。圖2-2 CCS圖形查看工具設置(6)在匯編源程序的中斷服務程序(_tint)中的“nop”語句處設置斷點。該行被加亮為洋紅色。選擇DebugAnimate,運行程序,觀察輸出波形。數一數一個周期的正弦波有多少個點?算算頻率是否是2kHz?另外,想想Run和Animate兩種運行方式的區別? (7)用右鍵單擊圖形顯示窗口,并選擇“Proporties”項以便修改顯示屬性。將“Display Type”項改為“FFT Magnitude”以便顯示信號頻譜。修改“Sampling Rate(Hz)”項為40000,然后退出。注意觀察生成的正弦波頻率。 (8)清除所有斷
43、點,關閉除波形顯示窗口外的所有窗口,并關閉工程文件。(9)下面我們使用C語言完成本實驗。新建一個工程文件,如sinewave_c.prj,并添加所編寫的timer.c,vec_table.asm源程序,再添加timer.cmd,再添加C使用的標準庫rts.lib。該文件應該在CCS安裝目錄中。例如,若CCS安裝在d:ti下,則rts.lib應該在d:tic5400cgtoolslib下。修改編譯、連接選項,加入符號調試選項,修改生成的OUT文件名,如timer.out。 (10).完成編譯、連接,正確生成OUT文件。然后使用File菜單的“Load Program”選項,將生成的OUT文件(如
44、timer.out)裝入DSP的片內存儲器。這時CCS將顯示程序的啟始地址_c_int00。 (11). 打開C源程序(timer.c)窗口,在中斷服務程序(函數tint())的“con_buf=0;”語句處增加一個斷點。同樣打開圖形顯示窗口,并將“Start Address”改為buf;“Acquisition Buffer Size”改為128,“Display Data Size”改為128,“DSP Data Type”為“32-bit floating point”。(12)選擇DebugAnimate,運行程序,觀察輸出波形。數一數一個周期的正弦波有多少個點?算算頻率是否是2kHz
45、?同樣用右鍵單擊圖形顯示窗口,顯示信號頻譜。注意修改“Sampling Rate(Hz)”項為40000,然后退出。注意觀察生成的正弦波頻率。六、實驗報告要求1、預習報告分析采用數字信號處理方法產生正弦波原理,復習定時器工作原理及中斷控制方法,考慮主程序、中斷向量表以及CMD模塊的編寫。2、實習記錄根據實習步驟,記錄實驗結果圖形,考慮顯示圖形的設置。3、實驗報告(1)匯出實驗結果信號曲線圖及其頻譜圖。(2)進行本次實驗總結。七、思考題(1)本實驗程序產生了一個2kHz的正弦信號,請修改程序,產生一個頻率相同的余弦信號。為了驗證產生的COS信號,可以同時生成SIN和COS信號,然后在兩個圖形窗口
46、中顯示波形。它們應該正好相差/2相位。重新設計和實現一個數字振蕩器,采樣頻率改為為20KHz,輸出正弦信號的頻率為4KHz。使用探針工具,用文件保存產生的正弦波數據。(4)在(1)題的基礎上,新建一個工程文件,使用VC5402的定時器1產生COS信號,同時使用定時器0產生SIN信號。(5)在CCS中打開連接定位文件sinewave.cmd,看看中斷向量表是如何安排的?并使用MAP文件驗證中斷向量表的具體地址。實驗三: BSP串口通信實現 實驗學時: 4實驗類型:綜合實驗要求:必修一、實驗目的1、本實驗的主要目的是學習C54xx的McBSP串口的控制和使用,并利用VC5402的McBSP1串口實
47、現數據的收發。2、學會編寫串口通信程序,包括串口的初始化和發、送中斷服務程序的編寫。二、相關知識點串口結構與工作原理、包括串口的初始化和發、送中斷服務程序的編寫三、實驗原理、方法和手段(1)McBSP概述 McBSP與外設進行數據傳輸是通過(DX)腳來發送,(RX)腳來接收,通信的時鐘與幀信號是由CLKX, CLKR, FSX, and FSR腳來控制。DSP的CPU或DMA從數據接收寄存器(DRR1,2)讀取接收數據,發送時向數據發送寄存器(DXR1,2)寫數據。數據寫入(DXR1,2)后通過傳輸移位寄存器(XSR1,2) 移位輸出到DX上,同樣,從DR上接收的數據移位存儲到接收移位寄存器(
48、RSR1,2) 并拷貝到接收緩存寄存器(RBR1,2) ,然后,再由(RBR1,2)拷貝到DRR1,2,DRR1,2就可以由CPU或DMA來讀出。多級寄存器允許在通信時內部和外部數據同時傳輸。C54XX對McBSP的控制由16位的控制寄存器實現。(2) McBSP控制寄存器 在圖3-1中給出了McBSP串口的所有控制寄存器。本實驗使用VC5402的McBSP1串口,下面的說明以McBSP1為例。McBSP每個串口實際占用6個物理地址空間,例如McBSP1串口中數據發送寄存器為兩個(32bit),地址分別為0 x42和0 x43。本實驗通過0 x43發送數據(16bit)。數據接收寄存器為兩個(
49、32bit),地址分別為0 x40和0 x41。本實驗通過0 x41讀取串口接收數據(16bit)。控制寄存器占用兩個地址:0 x48和0 x49,而McBSP串口控制寄存器總共有14個,所以在訪問這些控制寄存器時,先將要訪問的寄存器編號(子地址)寫入地址寄存器寄存器0 x48,然后在將數據寫入0 x49或從0 x49讀出相應的數據。若要訪問另一個控制寄存器,又得些修改地址寄存器。串口控制寄存器1的詳細說明(SPCR1):子地址 - 0 x0 SPCR1設置McBSP串口的數字環回模式、 接收符號擴展和校驗模式、Clock Stop模式、DX是否允許、A-bis 模式、接收中斷模式等,并給出接
50、收同步錯誤、接收移位寄存器(RSR1,2)空、接收準備好等狀態。本實驗RJUST = 01 ,即接收數據不足16BIT時采用右對齊且符號位擴展方式,另外接收中斷由RRDY信號RINTM=00。DLB = 0表示不使用數字環路。CLKSTP = 0X 表示時鐘停止模式,用于非SPI模式。DXENA = 0 表示禁止延時發送。ABIS = 0表示不使用A-bis模式。RSYNCERR = 0 表示不檢測同步錯誤。該寄存器初始化值為0 x2000。在啟動串口接收工作前應將RRST為置1,即該寄存器為0 x2001。圖3-1 McBSP串口控制寄存器圖3-2 串口控制寄存器1串口控制寄存器2的詳細說明
51、(SPCR2):子地址 - 0 x1 SPCR2設置McBSP自由運行模式、SOFT 模式、發送中斷模式,并給出發送同步錯誤、發送移位寄存器(XSR1,2)空、發送準備好等狀態。此外可以進行發送復位、采樣率發生器復位、幀同步發生電路復位。本實驗中FREE = 0 ,SOFT = 1 表示若使用仿真器調試時串口在發送完當前字后暫停工作。若連續運行,這兩個BIT位沒有影響。FRST = 0表示幀同步發生器復位,該BIT位工作時應設為1。GRST =0表示采樣率發生器(即串口工作的時鐘)電路復位,工作中若該串口需要提供時鐘信號時,應設置為1。XINTM = 00表示串口的發送中斷由XRDY產生。XS
52、YNCERR = 0表示不檢測同步錯。該寄存器初始化值為0 x100。當串口工作時,應將XRST為置1,即該寄存器為0 x1c1。圖3-3 串口控制寄存器2(5) 引腳控制寄存器的詳細說明(PCR):子地址 - 0 x0e PCR設置McBSP傳輸幀同步模式、接收幀同步模式、發送時鐘模式、接收時鐘模式、發送幀同步信號的極性、接收幀同步信號的極性、發送時鐘極性、接收時鐘極性,并給出CLKS、DX、DR腳的狀態。此外PCR還定義發送和接收部分在復位時相應引腳是否配置為通用 I/O。本實驗中,XIOEN和RIOEN = 0表示DX,FSX,CLKX,DR,FSR,CLKR,CLKS都配置為串口而非通
53、用I/O引腳。FSXM = 1表示發送幀同步由采樣率發生器產生(請參考SRGR2寄存器的FSGM位)。FSRM = 0 表示接收幀同步由外部提供,因為DES5402PP實驗板的FSXM與FSRM相連。CLKXM = 1 表示發送時鐘由內部采樣率發生器產生。CLKRM = 0 表示接收時鐘由外部提供,同樣因為CLKRM與CLKXM連在一起。FSXP = 1 表示發送幀同步低有效。FSRP = 1 表示接收幀同步低有效。CLKXP = 1 表示CLKX的上升沿發送數據, CLKRP = 0 表示CLKR的下降沿接收數據。該寄存器初始化值為0 x0a0e。圖3-4 串口引腳控制寄存器PCR(6) 接
54、收控制寄存器1(RCR1)說明:子地址 - 0 x02RCR1設置McBSP接收時第一相(FIRST PHASE)的接收幀長度(從1個字到128個字、接收字長度(8、12、16、20、24、32bits)。本實驗中設置位每幀1個字,字長16 bits。初始值為0 x0040。圖3-5 串口接收控制寄存器1(7) 接收控制寄存器2(RCR2)說明:子地址 - 0 x03 RCR2設置McBSP接收時是否允許第二相(RPHASE=1)。如果允許,設置McBSP接收時第二相的接收幀長度(從1個字到128個字、接收字長度(8、12、16、20、24、32bits)。此外, RCR2設置McBSP接收時
55、的接收壓縮模式、接收同步幀忽略模式、接收數據延遲。在本實驗中,RPHASE = 0 表示只使用單相幀,RCOMPAND = 00表示接收數據不壓擴,且高位在前,RFIG = 0 表示不忽略接收幀同步信號。該寄存器初始化設置為0 x0040或0 x0。圖3-6 串口接收控制寄存器2 (8) 發送控制寄存器1(XCR1)說明:子地址 - 0 x04 XCR1設置McBSP發送時第一相(FIRST PHASE)的發送幀長度(從1個字到128個字、發送字長度(8、12、16、20、24、32bits)。本實驗中設置位每幀1個字,字長16 bits。初始值為0 x0040。圖3-7 串口發送控制寄存器1
56、(9) 發送控制寄存器2(XCR2)說明:子地址 - 0 x05 XCR2設置McBSP發送時是否允許第二相(XPHASE=1)。如果允許,設置McBSP時第二相的發送幀長度(從1個字到128個字、發送字長度(8、12、16、20、24、32bits)。此外, XCR2設置McBSP發送時的發送壓縮模式、發送同步幀忽略模式、發送數據延遲。本實驗不允許使用第二相(XPHASE=0),初始設置為 0 x0。圖3-8 串口發送控制寄存器2(10)采樣率發生器(串口時鐘產生)寄存器SRGR1:子地址 - 0 x06 采樣率發生器寄存器1(SRGR1)設置幀正脈沖寬度和數據位時鐘分頻( CLKG與輸入C
57、LK頻率之比,約定值為1)。本實驗中雖然將FWID設置為1,即幀同步脈沖寬度=2,但被忽略了(參見后面幀同步發生控制寄存器設置)。時鐘分頻寄存器=200(0 xC8),表示設置串口時鐘為CLKG=100M /200=500K Hz。本實驗中設置為0 x1c8。圖3-9 串口采樣率控制寄存器1(11) 采樣率發生器(幀同步信號產生)控制寄存器SRGR2:子地址 - 0 x07 采樣率發生器寄存器2(SRGR2)設置采樣率發生器時鐘同步模式、CLKS的極性、采樣率發生器輸入時鐘選擇、幀周期分頻。本實驗中,GSYNC=0 表示采樣率發生器是否同步,因CLKSM=1,固該bit不用。CLKSP = 0
58、表示 CLKS的上升沿產生CLKG和FSG。因CLKSM=1該BIT也不用。CLKSM = 1表示采樣率發生器由CPU時鐘驅動。FSGM = 0表示幀同步信號由發送位移寄存器自動產生,忽略FPER和FWID,固FPER =0。所以該寄存器初始化值為0 x2000。圖3-10 串口采樣率控制寄存器2(12)串口的初始化 本實驗的串口初始化包括兩個部分:串口收發中斷的設置和串口寄存器的初始化。根據前面的介紹,DES5402PP實驗板的串口1設置為單相幀,字長為16bit,發送CLOCK由內部CPU時鐘產生,頻率為500KHz,并輸出。同時串口接收時鐘也使用該信號。發送幀同步信號由發送位移寄存器自動
59、產生,同時也提供給串口接收電路。具體設置參見下面的代碼:;*; The following codes are used to initalize McBSP1 !; When Transmit, this DES5402PP makes CLK,FS ! the other; DES5402PP receives the CLK,FS ! ;* stm #0,MCBSP1_SPSA ; choose SPCR11 stm #2000h,MCBSP1_SPSD; receive sign_extend in DRR stm #1,MCBSP1_SPSA ; choose SPCR20 stm
60、#100h,MCBSP1_SPSD ; stm #2,MCBSP1_SPSA ; choose RCR10 stm #40h,MCBSP1_SPSD ; 16 bits each word stm #3,MCBSP1_SPSA ; choose RCR20 stm #40h,MCBSP1_SPSD stm #4,MCBSP1_SPSA ; choose XCR10 stm #40h,MCBSP1_SPSD ; 16 bits each word stm #5,MCBSP1_SPSA ; choose XCR20 stm #0,MCBSP1_SPSD stm #6,MCBSP1_SPSA ; c
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 四川雅安中學2025屆高三下學期期末學習能力診斷數學試題含解析
- 內蒙巴彥淖爾市2025年高三畢業班3月教學質量檢查語文試題含解析
- 山東省日照市五蓮二中學2025屆初三化學試題下學期期末考試試題含解析
- 武夷山職業學院《建筑與裝飾工程計量與計價課程設計》2023-2024學年第二學期期末試卷
- 山東省濟南市歷城區2025屆初三4月模擬(二模)考試生物試題理試題含解析
- 遼寧中醫藥大學《藥學綜合實驗》2023-2024學年第二學期期末試卷
- 六盤水幼兒師范高等專科學校《日語文學》2023-2024學年第二學期期末試卷
- 山西林業職業技術學院《遙感原理與方法》2023-2024學年第一學期期末試卷
- 二零二五房屋及土地租賃協議
- 智能駕駛之路
- 浦發銀行個人信用報告異議申請表
- 高考試卷命題設計的技巧 課件24張
- 施工進度計劃網絡圖-練習題知識講解
- 防孤島測試報告
- 按摩常用英語
- 食品公司規章制度
- midas NFX使用指南(八)
- 成都高新區小學數學五年級下冊半期考試數學試卷
- 2018年人教版九年級英語單詞表
- 蘋果中國授權經銷商協議
- 昆山市工業用地項目監管協議-蘇州市國有建設用地使用權網上出讓系統
評論
0/150
提交評論