第一篇:DSP實驗報告+心得體會
龍
巖
學
院
實 驗 報 告
班
級
07電本(1)班
學號
2007050344 姓
名 楊寶輝
同組人
獨立
實驗日期
2010-5-18
室溫
大氣壓
成 績
基礎實驗
一、實驗目的二、實驗設備
三、實驗原理 浮點數的表達和計算是進行數字信號處理的基本知識;產生正弦信號是數字信號處理1.一臺裝有CCS軟件的計算機; 2.DSP實驗箱的TMS320F2812主控板; 3.DSP硬件仿真器。1.掌握CCS實驗環境的使用;
2.掌握用C語言編寫DSP程序的方法。
中經常用到的運算;C語言是現代數字信號處理表達的基礎語言和通用語言。寫實現程序時需要注意兩點:(1)浮點數的范圍及存儲格式;(2)DSP的C語言與ANSI C語言的區別。
四、實驗步驟
1.打開CCS 并熟悉其界面;
2.在CCS環境中打開本實驗的工程(Example_base.pjt),編譯并重建.out 輸出文件,然后通過仿真器把執行代碼下載到DSP芯片中;
3. 把X0 , Y0 和Z0添加到Watch窗口中作為觀察對象(選中變量名,單擊鼠標右鍵,在彈出菜單中選擇“Add Watch Window”命令);
4. 選擇view->graph->time/frequency…。設置對話框中的參數: 其中“Start Address”設為“sin_value”,“Acquisition buffer size”和“Display Data size”都設為“100”,并且把“DSP Data Type”設為“32-bit floating point”,設置好后觀察信號序列的波形(sin函數,如圖);
5. 單擊運行;
6. 觀察三個變量從初始化到運算結束整個過程中的變化;觀察正弦波形從初始化到運算結束整個過程中的變化;
7. 修改輸入序列的長度或初始值,重復上述過程。
五、實驗心得體會
通過本次實驗,加深了我對DSP的認識,使我對DSP實驗的操作有了更進一步的理解。基本掌握了CCS實驗環境的使用,并能夠使用C語言進行簡單的DSP程序設計。從軟件的安裝到使用軟件進行程序設計與仿真,鍛煉了自己的動手能力,也遇到了不少的坎坷,例如芯片的選擇,不能因為麻煩而省略該步驟,否則將會運行出錯。
附錄實驗程序: #include “math.h” #include “stdio.h” #define N 100 #define pi 3.14159
float sin_value[100];float X0,Y0,Z0;
void main(void){
int i;
for(i=0;i sin_value[i]=0; X0=0.5; /* 0.100 0000 0000 0000 */ Y0=0.5; /* 0.100 0000 0000 0000 */ Z0=X0*Y0; /* 00.01 0000 0000 0000 0000 0000 0000 0000 */ for(i=0;i sin_value[i]=100*(sin(2*pi*i/N));} 龍 巖 學 院 實 驗 報 告 班 級 07電本(1)班 學號 2007050344姓 名 楊寶輝 同組人 獨立 實驗日期 2010-5-20 室溫 大氣壓 成 績 數碼管控制實驗 一、實驗目的 1.2.3.熟悉2812的指令系統; 熟悉74HC573的使用方法。熟悉DSP的IO操作使用方法。 二、實驗設備 1.一臺裝有CCS2000軟件的計算機; 2.插上2812主控板的DSP實驗箱; 3.DSP硬件仿真器。 三、實驗原理 此模塊由數碼管和四個鎖存器組成。數碼管為共陰極型的。數據由2812模塊的低八位輸入,鎖存器的控制信號由2812模塊輸出,但經由CPLD模塊譯碼后再控制對應的八個 四、實驗步驟 1.把2812模塊小板插到大板上; 2.在CCS2000環境中打開本實驗的工程編譯Example_7segled.prj,生成輸出文件,通過仿真器把執行代碼下載到DSP芯片; 3.運行程序;數碼管會顯示1~8的數字。 4.參考源代碼自行修改程序改變顯示樣式。 五、實驗心得體會 通過本次實驗中,基本掌握了2812的指令系統的特點,并能夠了解并熟悉74HC573的使用方法,進一步加深了對DSP的認識。同時,通過實驗操作DSP的IO操作使用方法,對于DSP的IO操作可以熟悉的運用,學到更多的知識。 程序見附錄: #include “include/DSP281x_Device.h” // DSP281x Headerfile Include File #include “include/DSP281x_Examples.h” // DSP281x Examples Include File // Prototype statements for functions found within this file.void delay_loop(void);void Gpio_select(void);// Global variable for this example short codetab[17]= {0x4020,0x6cc0,0x5800,0x4840,0x6440,0xC040,0xC000,0x4cc0, 0x4000,0x4040,0x4400,0xE000,0xD080,0xE800,0xD000,0xD400,0xffff};main(){ short i; // Step 1.Initialize System Control: // PLL, WatchDog, enable Peripheral Clocks // This example function is found in the DSP281x_SysCtrl.c file.InitSysCtrl(); // Specific clock setting for this example: EALLOW; EDIS;// Step 2.Initalize GPIO: // This example function is found in the DSP281x_Gpio.c file and // illustrates how to set the GPIO to it's default state.// InitGpio();// Skipped for this example // For this example use the following configuration: Gpio_select();// Step 3.Clear all interrupts and initialize PIE vector table: // Disable CPU interrupts DINT;// Initialize the PIE control registers to their default state.// The default state is all PIE interrupts disabled and flags // are cleared.// This function is found in the DSP281x_PieCtrl.c file.InitPieCtrl();// Disable CPU interrupts and clear all CPU interrupt flags: IER = 0x0000; IFR = 0x0000;// Initialize the PIE vector table with pointers to the shell Interrupt // Service Routines(ISR).// This will populate the entire table, even if the interrupt // is not used in this example.This is useful for debug purposes.// The shell ISR routines are found in DSP281x_DefaultIsr.c.// This function is found in DSP281x_PieVect.c.InitPieVectTable();// Step 4.Initialize all the Device Peripherals: // This function is found in DSP281x_InitPeripherals.c // InitPeripherals();// Not required for this example InitXintf();// For this example, init the Xintf // Step 5.User specific code, enable interrupts: GpioDataRegs.GPADAT.all=0; Reg01=0x00; GpioDataRegs.GPADAT.all=0; Reg02=0x00; GpioDataRegs.GPADAT.all=0; Reg03=0x00; GpioDataRegs.GPADAT.all=0; Reg04=0x00; while(1) { for(i=0;i<17;i++) { GpioDataRegs.GPADAT.all Reg01=0x00; delay_loop(); } for(i=0;i<17;i++) { GpioDataRegs.GPADAT.all Reg02=0x00; delay_loop(); } for(i=0;i<17;i++) { GpioDataRegs.GPADAT.all Reg03=0x00; delay_loop(); } for(i=0;i<17;i++) { GpioDataRegs.GPADAT.all Reg04=0x00; delay_loop(); } } } void delay_loop(){ =~codetab[i];=~codetab[i];=~codetab[i];=~codetab[i]; short i,j; for(i = 0;i < 32767;i++) {for(j = 0;j < 10;j++);} } void Gpio_select(void){ Uint16 var1; Uint16 var2; Uint16 var3; var1= 0x0000; var2= 0xFFFF; var3= 0x0000; EALLOW;GpioMuxRegs.GPAMUX.all=var1; // sets GPIO Muxs as I/Os // sets GPIO DIR as outputs // sets the Input qualifier values GpioMuxRegs.GPBMUX.all=var1; GpioMuxRegs.GPDMUX.all=var1; GpioMuxRegs.GPFMUX.all=var1; GpioMuxRegs.GPEMUX.all=var1; GpioMuxRegs.GPGMUX.all=var1; GpioMuxRegs.GPADIR.all=var2; // GPIO PORTs as output // GPIO DIR select GPIOs as output GpioMuxRegs.GPBDIR.all=var2; GpioMuxRegs.GPDDIR.all=var2; GpioMuxRegs.GPEDIR.all=var2; GpioMuxRegs.GPFDIR.all=var2; GpioMuxRegs.GPGDIR.all=var2; GpioMuxRegs.GPAQUAL.all=var3; GpioMuxRegs.GPBQUAL.all=var3; GpioMuxRegs.GPDQUAL.all=var3; GpioMuxRegs.GPEQUAL.all=var3; EDIS;} // No more.// Set GPIO input qualifier values 龍 巖 學 院 實 驗 報 告 班 級 07電本(1)班 學號 2007050344 姓 名 楊寶輝 同組人 獨立 實驗日期 2010-5-25 室溫 大氣壓 成 績 交通燈控制實驗 一、實驗目的 1.熟悉2812的指令系統; 2.熟悉74HC573的使用方法。3.熟悉DSP的IO操作使用方法。 二、實驗設備 1.一臺裝有CCS2000軟件的計算機; 2.插上2812主控板的DSP實驗箱; 3.DSP硬件仿真器。 三、實驗原理 此模塊由發光二極管和一個鎖存器組成。 數據由2812模塊的低八位輸入,鎖存器的控制信號由2812模塊輸出,但經由CPLD模塊譯碼后再控制鎖存器。 四、實驗步驟 1.把2812模塊小板插到大板上; 2.在CCS2000環境中打開本實驗的工程編譯Example_crossled.prj,生成輸出文件,通過仿真器把執行代碼下載到DSP芯片; 3.運行程序,發光二極管按交通燈方式點亮熄滅。 4.參考源代碼,自行修改程序,實現不同的交通燈控制方式。 五、實驗心得體會 通過次實驗中,使我掌握了 2812的指令系統和74HC573的使用方法。同時,使我掌握了DSP的IO操作使用方法。 實驗程序見附錄: 附錄: #include “include/DSP281x_Device.h” // DSP281x Headerfile Include File #include “include/DSP281x_Examples.h” // DSP281x Examples Include File // Prototype statements for functions found within this file.void delay_loop(void);void Gpio_select(void);// Global variable for this example main(){ // Step 1.Initialize System Control: // PLL, WatchDog, enable Peripheral Clocks // This example function is found in the DSP281x_SysCtrl.c file.InitSysCtrl(); // Specific clock setting for this example: EALLOW; EDIS;// Step 2.Initalize GPIO: // This example function is found in the DSP281x_Gpio.c file and // illustrates how to set the GPIO to it's default state.// InitGpio();// Skipped for this example // For this example use the following configuration: Gpio_select(); // Step 3.Clear all interrupts and initialize PIE vector table: // Disable CPU interrupts DINT;// Initialize the PIE control registers to their default state.// The default state is all PIE interrupts disabled and flags // are cleared.// This function is found in the DSP281x_PieCtrl.c file.InitPieCtrl();// Disable CPU interrupts and clear all CPU interrupt flags: IER = 0x0000; IFR = 0x0000;// Initialize the PIE vector table with pointers to the shell Interrupt // Service Routines(ISR).// This will populate the entire table, even if the interrupt // is not used in this example.This is useful for debug purposes.// The shell ISR routines are found in DSP281x_DefaultIsr.c.// This function is found in DSP281x_PieVect.c.InitPieVectTable();// Step 4.Initialize all the Device Peripherals: // This function is found in DSP281x_InitPeripherals.c // InitPeripherals();// Not required for this example InitXintf();// For this example, init the Xintf // Step 5.User specific code, enable interrupts: while(1) { GpioDataRegs.GPADAT.all =0xdc80; Reg00=0x00; delay_loop(); GpioDataRegs.GPADAT.all =0xec40; Reg00=0x00; delay_loop(); GpioDataRegs.GPADAT.all =0xf0c0; Reg00=0x00; delay_loop(); GpioDataRegs.GPADAT.all =0xec40; Reg00=0x00; delay_loop(); } } void delay_loop(){ short i,j; for(i = 0;i < 32767;i++) {for(j = 0;j < 50;j++);} } void Gpio_select(void){ Uint16 var1; Uint16 var2; Uint16 var3; var1= 0x0000; var2= 0xFFFF; var3= 0x0000; EALLOW;GpioMuxRegs.GPAMUX.all=var1; // sets GPIO Muxs as I/Os // sets GPIO DIR as outputs // sets the Input qualifier values GpioMuxRegs.GPBMUX.all=var1; GpioMuxRegs.GPDMUX.all=var1; GpioMuxRegs.GPFMUX.all=var1; GpioMuxRegs.GPEMUX.all=var1; GpioMuxRegs.GPGMUX.all=var1; GpioMuxRegs.GPADIR.all=var2;// GPIO PORTs as output // GPIO DIR select GPIOs as output GpioMuxRegs.GPBDIR.all=var2; GpioMuxRegs.GPDDIR.all=var2; GpioMuxRegs.GPEDIR.all=var2; GpioMuxRegs.GPFDIR.all=var2; GpioMuxRegs.GPGDIR.all=var2; GpioMuxRegs.GPAQUAL.all=var3; GpioMuxRegs.GPBQUAL.all=var3; GpioMuxRegs.GPDQUAL.all=var3; GpioMuxRegs.GPEQUAL.all=var3; EDIS; } // Set GPIO input qualifier values //============================= // No more.//============================= 龍 巖 學 院 實 驗 報 告 班 級 07電本(1)班 學號 2007050344 姓 名 楊寶輝 同組人 獨立 實驗日期 2010-05-27 室溫 大氣壓 成 績 步進電機控制實驗 一、實驗目的 1.2.二、實驗設備 1.一臺裝有CCS軟件的計算機; 2.DSP實驗箱(插上電機模塊); 3.DSP硬件仿真器; 4.示波器。 三、實驗原理 步進電機工作原理,給步進脈沖電機就轉,不給脈沖電機就不轉,步進脈沖的頻率越高,步進控制電機就轉的越快;改變各相的通電方式可以改變電機的運行方式;改變通電順序可以控制步進電機的運行方式;改變通電順序可以控制步進電機的正反轉。 步進電機的控制問題可以總結為兩點: 1.產生工作方式需要的時序脈沖; 2.控制步進電機的速度使它始終遵循加速-勻速-減速的規律工作。掌握2812通用IO口的使用方法; 掌握2812對步進電機的控制。 對于I/O口有二類寄存器: 1.控制寄存器和數據方向寄存器,使用方法如下:首先確定引腳的功能,即IO控制器寄存器,為1表示引腳功能是原模塊的功能,否則為IO功能。 2.如果引腳被配置為IO功能,就需要確定它的方向:輸入還是輸出。為1表示是輸出引腳,否則是輸入引腳。對于IO功能的輸入或輸出是通過讀寫相應的數據方向寄存器來實現。輸入引腳對應讀操作;輸出引腳對應寫操作。 四、實驗步驟 1.連接好DSP開發系統; 2.本實驗工程文件(Example_stepmotor.pjt),編譯,下載程序到DSP; 運行程序,用觀察步進電機運行方向和速度的變化; 五、實驗心得體會 通過本次實驗對于2812通用的IO口進一步熟悉實驗,使我基本掌握了2812通用的IO口的使用方法,加深了對IO口的認識。本次實驗的主要目的是通過2812對步進機的的控制,開始對于程序的設計沒有頭緒,通過查閱步進機控制的原理,結合有關資料才正式設計出程序,基本掌握了2812對步進機的控制,也更加熟悉了對DSP程序的設計,受益匪淺。 程序: #include “include/DSP281x_Device.h” // DSP281x Headerfile Include File #include “include/DSP281x_Examples.h” // DSP281x Examples Include File // Prototype statements for functions found within this file.void delay_loop(void);void Gpio_select(void);// Global variable for this example short codetab[17]= {0x0001,0x0002,0x0004,0x0008,0x0008,0x0004,0x0002,0x0001, 0x0001,0x0002,0x0004,0x0008,0x0001,0x0002,0x0004,0x0008,0x0000};main(){ short i,j;// Step 1.Initialize System Control: // PLL, WatchDog, enable Peripheral Clocks // This example function is found in the DSP281x_SysCtrl.c file.InitSysCtrl();// Specific clock setting for this example: EALLOW; EDIS;// Step 2.Initalize GPIO: // This example function is found in the DSP281x_Gpio.c file and // illustrates how to set the GPIO to it's default state.// InitGpio();// Skipped for this example // For this example use the following configuration: Gpio_select();// Step 3.Clear all interrupts and initialize PIE vector table: // Disable CPU interrupts DINT;// Initialize the PIE control registers to their default state.// The default state is all PIE interrupts disabled and flags // are cleared.// This function is found in the DSP281x_PieCtrl.c file.InitPieCtrl();// Disable CPU interrupts and clear all CPU interrupt flags: IER = 0x0000; IFR = 0x0000;// Initialize the PIE vector table with pointers to the shell Interrupt // Service Routines(ISR).// This will populate the entire table, even if the interrupt // is not used in this example.This is useful for debug purposes.// The shell ISR routines are found in DSP281x_DefaultIsr.c.// This function is found in DSP281x_PieVect.c.InitPieVectTable();// Step 4.Initialize all the Device Peripherals: // This function is found in DSP281x_InitPeripherals.c // InitPeripherals();// Not required for this example InitXintf();// For this example, init the Xintf // Step 5.User specific code, enable interrupts: GpioDataRegs.GPADAT.all=0; Reg06=0x00; while(1) { for(j=0;j<400;j++) { for(i=0;i<4;i++) { GpioDataRegs.GPADAT.all Reg06=0x00; delay_loop(); } } for(j=0;j<400;j++) { for(i=4;i<8;i++) { GpioDataRegs.GPADAT.all Reg06=0x00; delay_loop(); } } } } void delay_loop(){ short i,j; for(i = 0;i < 1000;i++) {for(j = 0;j < 10;j++);} } void Gpio_select(void){ Uint16 var1; Uint16 var2; =codetab[i];=codetab[i]; Uint16 var3; var1= 0x0000; var2= 0xFFFF; var3= 0x0000; EALLOW;GpioMuxRegs.GPAMUX.all=var1; // sets GPIO Muxs as I/Os // sets GPIO DIR as outputs // sets the Input qualifier values GpioMuxRegs.GPBMUX.all=var1; GpioMuxRegs.GPDMUX.all=var1; GpioMuxRegs.GPFMUX.all=var1; GpioMuxRegs.GPEMUX.all=var1; GpioMuxRegs.GPGMUX.all=var1;GpioMuxRegs.GPADIR.all=var2; // GPIO PORTs as output // GPIO DIR select GPIOs as output GpioMuxRegs.GPBDIR.all=var2; GpioMuxRegs.GPDDIR.all=var2; GpioMuxRegs.GPEDIR.all=var2; GpioMuxRegs.GPFDIR.all=var2; GpioMuxRegs.GPGDIR.all=var2; GpioMuxRegs.GPAQUAL.all=var3; GpioMuxRegs.GPBQUAL.all=var3; GpioMuxRegs.GPDQUAL.all=var3; GpioMuxRegs.GPEQUAL.all=var3; EDIS; } // Set GPIO input qualifier values //============================= // No more.//============================= 龍 巖 學 院 實 驗 報 告 班 級 07電本(1)班 學號 2007050344 姓 名 楊寶輝 同組人 獨立 實驗日期 2010-6-1 室溫 大氣壓 成 績 直流電機控制實驗 一、實驗目的 1.2.二、實驗設備 1.一臺裝有CCS軟件的計算機; 2.DSP實驗箱; 要求學生掌握2812 PWM的使用方法; 掌握2812對直流電機的控制。 3.DSP硬件仿真器; 4.示波器。 三、實驗原理 電機模塊的原理圖如下 四、實驗步驟 3.連接好DSP開發系統; 4.本實驗工程文件(Example_dcmotor.pjt),編譯,下載程序到DSP; 5.運行程序,用觀察直流電機運行方向和速度的變化; 五、實驗心得體會 通過本次實驗,認識了PWM的使用方法,通過親身體驗,初步掌握了2812對PWM的控制使用方法,加深了對PWM的認識。本次實驗的主要目的是通過2812對直流電機的控制,開始對于程序的設計沒有頭緒,通過查閱直流電機的原理,結合有關資料才正式設計出程序,基本掌握了2812對直流電機的控制,也更加熟悉了對DSP程序的設計,受益匪淺。 附:實驗程序: #include “include/DSP281x_Device.h” // DSP281x Headerfile Include File #include “include/DSP281x_Examples.h” // DSP281x Examples Include File // Prototype statements for functions found within this file.void init_eva(void);void init_evb(void);void delay_loop();// Global variable for this example main() { unsigned short i;// Step 1.Initialize System Control: // PLL, WatchDog, enable Peripheral Clocks // This example function is found in the DSP281x_SysCtrl.c file.InitSysCtrl();// Specific clock setting for this example: EALLOW; EDIS;// Step 2.Initalize GPIO: // This example function is found in the DSP281x_Gpio.c file and // illustrates how to set the GPIO to it's default state.// InitGpio();// Skipped for this example // Initialize only GPAMUX and GPBMUX for this test EALLOW; // Enable PWM pins GpioMuxRegs.GPAMUX.all = 0x00FF;// EVA PWM 1-6 pins GpioMuxRegs.GPBMUX.all = 0x00FF;// EVB PWM 7-12 pins EDIS;// Step 3.Clear all interrupts and initialize PIE vector table: // Disable CPU interrupts DINT;// Initialize the PIE control registers to their default state.// The default state is all PIE interrupts disabled and flags // are cleared.// This function is found in the DSP281x_PieCtrl.c file.InitPieCtrl();// Disable CPU interrupts and clear all CPU interrupt flags: IER = 0x0000; IFR = 0x0000;// Initialize the PIE vector table with pointers to the shell Interrupt // Service Routines(ISR).// This will populate the entire table, even if the interrupt // is not used in this example.This is useful for debug purposes.// The shell ISR routines are found in DSP281x_DefaultIsr.c.// This function is found in DSP281x_PieVect.c.InitPieVectTable();// Step 4.Initialize all the Device Peripherals: // This function is found in DSP281x_InitPeripherals.c // InitPeripherals();// Not required for this example InitXintf();// For this example, init the Xintf // Step 5.User specific code, enable interrupts: init_eva(); //init_evb(); while(1) { for(i=0;i<65535;i+=1000) { Reg06=0; EvbRegs.CMPR6 = i; delay_loop(); } } } void delay_loop(){ short i,j; for(i = 0;i < 1000;i++) {for(j = 0;j < 10;j++);} } void init_eva(){ // EVA Configure T1PWM, T2PWM, PWM1-PWM6 // Initalize the timers // Initalize EVA Timer1 EvaRegs.T1PR = 0xFFFF; // Timer1 period EvaRegs.T1CMPR = 0x3C00; // Timer1 compare EvaRegs.T1CNT = 0x0000; // Timer1 counter // TMODE = continuous up/down // Timer enable // Timer compare enable EvaRegs.T1CON.all = 0x1042; // Initalize EVA Timer2 EvaRegs.T2PR = 0x0FFF; // Timer2 period EvaRegs.T2CMPR = 0x03C0; // Timer2 compare EvaRegs.T2CNT = 0x0000; // Timer2 counter // TMODE = continuous up/down // Timer enable // Timer compare enable EvaRegs.T2CON.all = 0x1042; // Setup T1PWM and T2PWM // Drive T1/T2 PWM by compare logic EvaRegs.GPTCONA.bit.TCMPOE = 1; // Polarity of GP Timer 1 Compare = Active low EvaRegs.GPTCONA.bit.T1PIN = 1; // Polarity of GP Timer 2 Compare = Active high EvaRegs.GPTCONA.bit.T2PIN = 2; // Enable compare for PWM1-PWM6 //EvaRegs.CMPR1 = 0x0C00; //EvaRegs.CMPR2 = 0x3C00; EvaRegs.CMPR3 = 0xFC00; // Compare action control.Action that takes place // on a cmpare event // output pin 1 CMPR1active low // output pin 3 CMPR2active low // output pin 5 CMPR3active low EvaRegs.ACTRA.all = 0x0666; EvaRegs.DBTCONA.all = 0x0000;// Disable deadband EvaRegs.COMCONA.all = 0xA600;} void init_evb(){ // EVB Configure T3PWM, T4PWM and PWM7-PWM12 // Step 1active high // output pin 2 CMPR4active high // output pin 4 CMPR5active high // output pin 6 CMPR6x000 0000 0011 0000 EDIS;// Step 3.Initialize PIE vector table: // The PIE vector table is initialized with pointers to shell Interrupt // Service Routines(ISR).The shell routines are found in DSP281x_DefaultIsr.c.// Insert user specific ISR code in the appropriate shell ISR routine in // the DSP28_DefaultIsr.c file.// Disable and clear all CPU interrupts: DINT;IER = 0x0000;IFR = 0x0000; // Initialize Pie Control Registers To Default State: // This function is found in the DSP281x_PieCtrl.c file.// InitPieCtrl();PIE is not used for this example // Initialize the PIE Vector Table To a Known State: // This function is found in DSP281x_PieVect.c.// This function populates the PIE vector table with pointers // to the shell ISR functions found in DSP281x_DefaultIsr.c.InitPieVectTable(); // Enable CPU and PIE interrupts // This example function is found in the DSP281x_PieCtrl.c file.EnableInterrupts();// Step 4.Initialize all the Device Peripherals to a known state: // This function is found in DSP281x_InitPeripherals.c // InitPeripherals();skip this for SCI tests // Step 5.User specific functions, Reassign vectors(optional), Enable Interrupts: LoopCount = 0; ErrorCount = 0; scia_fifo_init(); // Initialize the SCI FIFO scia_loopback_init();// Initalize SCI for digital loop back // Note: Autobaud lock is not required for this example // Send a character starting with 0 SendChar = 0; // Step 6.Send Characters forever starting with 0x00 and going through // 0xFF.After sending each, check the recieve buffer for the correct value for(;;) { scia_xmit(SendChar); while(SciaRegs.SCIFFRX.bit.RXFIFST!=1){ } // wait for XRDY =1 for empty state // Check received character ReceivedChar = SciaRegs.SCIRXBUF.all; if(ReceivedChar!= SendChar)error(1); // Move to the next character and repeat the test SendChar++; // Limit the character to 8-bits SendChar &= 0x00FF; LoopCount++; if(LoopCount==256) { LoopCount=0; SciaRegs.SCICCR.bit.LOOPBKENA =0;// Disable loop back SciaRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset while((ReceivedChar = SciaRegs.SCIRXBUF.all)!=0x0d);scia_loopback_init();// Initalize SCI for digital loop back } } } // Step 7.Insert all local Interrupt Service Routines(ISRs)and functions here: void error(int ErrorFlag){ ErrorCount++;// asm(“ ESTOP0”);// Uncomment to stop the test here // for(;;);} // Test 1,SCIA DLB, 8-bit word, baud rate 0x000F, default, 1 STOP bit, no parity void scia_loopback_init(){ // Note: Clocks were turned on to the SCIA peripheral // in the InitSysCtrl()function SciaRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback // No parity,8 char bits,// async mode, idle-line protocol SciaRegs.SCICTL1.all =0x0003;// enable TX, RX, internal SCICLK,// Disable RX ERR, SLEEP, TXWAKE SciaRegs.SCICTL2.all =0x0003;SciaRegs.SCICTL2.bit.TXINTENA =1;SciaRegs.SCICTL2.bit.RXBKINTENA =1; SciaRegs.SCIHBAUD =0x0001; SciaRegs.SCILBAUD =0x00e7; } // Transmit a character from the SCI' void scia_xmit(int a){ SciaRegs.SCITXBUF=a;} // Initalize the SCI FIFO void scia_fifo_init() SciaRegs.SCICCR.bit.LOOPBKENA =1;// Enable loop back SciaRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset { SciaRegs.SCIFFTX.all=0xE040; SciaRegs.SCIFFRX.all=0x204f; SciaRegs.SCIFFCT.all=0x0;} //============================= // No more.//============================= TMS320F2812x DSP原理及應用技術實驗心得體會 1.設置環境時分為軟件設置和硬件設置,根據實驗的需要設置,這次實驗只是軟件仿真,可以不設置硬件,但是要為日后的實驗做準備,還是要學習和熟悉硬件設置的過程。 2.在設置硬件時,不是按實驗書上的型號選擇,而是應該按照實驗設備上的型號去添加。 3.不管是硬件還是軟件的設置,都應該將之前設置好的刪去,重新添加。設置好的配置中只能有一項。 4.CCS可以工作在純軟件仿真環境中,就是由軟件在PC機內存中構造一個虛擬的DSP環境,可以調試、運行程序。但是一般無法構造DSP中的外設,所以軟件仿真通常用于調試純軟件算法和進行效率分析等。5.這次實驗采用軟件仿真,不需要打開電源箱的電源。 6.在軟件仿真工作時,無需連接板卡和仿真器等硬件。 7.執行write_buffer一行時。如果按F10執行程序,則程序在mian主函數中運行,如果按F11,則程序進入write_buffe函數內部的程序運行。8.把str變量加到觀察窗口中,點擊變量左邊的“+”,觀察窗口可以展開結構變量,就可以看到結構體變量中的每個元素了。 9.在實驗時,顯示圖形出現問題,不能顯示,后來在Graph Title 把Input的大寫改為input,在對volume進行編譯執行后,就可以看到顯示的正弦波圖形了。10.在修改了實驗2-1的程序后,要重新編譯、連接執行程序,并且必須對.OUT文件進行重新加載,因為此時.OUT文件已經改變了。如果不重新加載,那么修改執行程序后,其結果將不會改變。 11.再觀察結果時,可將data和data1的窗口同時打開,這樣可以便于比較,觀察結果。 12.通過這次實驗,對TMS320F2812x DSP軟件仿真及調試有了初步的了解與認識,因為做實驗的時候都是按照實驗指導書按部就班的,與真正的理解和掌握還是有些距離的。但是這也為我們日后運用這些知識打下了基礎,我覺得實驗中遇到的問題,不要急于問老師或者同學,先自己想辦法分析原因,想辦法解決,這樣對自身的提高更多吧。通過做實驗,把學習的知識利用起來,也對這門課程更加有興趣了。 組員:葉孝璐 馮煥芬 鄭瑋儀 龐露露 2012年4月10號 實驗0 實驗設備安裝才CCS調試環境 實驗目的: 按照實驗講義操作步驟,打開CCS軟件,熟悉軟件工作環境,了解整個工作環境內容,有助于提高以后實驗的操作性和正確性。實驗步驟: 以演示實驗一為例: 1. 使用配送的并口電纜線連接好計算機并口與實驗箱并口,打開實驗箱電源; 2.啟動CCS,點擊主菜單“Project->Open”在目錄“C5000QuickStartsinewave”下打開工程文件sinewave.pjt,然后點擊主菜單“Project->Build”編譯,然后點擊主菜單“File->Load Program”裝載debug目錄下的程序sinewave.out; 3. 打開源文件exer3.asm,在注釋行“set breakpoint in CCS!!”語句的NOP處單擊右鍵彈出菜單,選擇“Toggle breakpoint”加入紅色的斷點,如下圖所示; 4. 點擊主菜單“View->Graph->Time/Frequency…”,屏幕會出現圖形窗口設置對話框 5. 雙擊Start Address,將其改為y0;雙擊Acquisition Buffer Size,將其改為1;DSP Data Type設置成16-bit signed integer,如下圖所示; 6. 點擊主菜單“Windows->Tile Horizontally”,排列好窗口,便于觀察 7. 點擊主菜單“Debug->Animate”或按F12鍵動畫運行程序,即可觀察到實驗結果: 心得體會: 通過對演示實驗的練習,讓自己更進一步對CCS軟件的運行環境、編譯過程、裝載過程、屬性設置、動畫演示、實驗結果的觀察有一個醒目的了解和熟悉的操作方法。熟悉了DSP實驗箱基本模塊。讓我對DSP課程產生了濃厚的學習興趣,課程學習和實驗操作結合為一體的學習體系,使我更好的領悟到DSP課程的實用性和趣味性。實驗二 基本算數運算 2.1 實驗目的和要求 加、減、乘、除是數字信號處理中最基本的算術運算。DSP 中提供了大量的指令來 實現這些功能。本實驗學習使用定點DSP 實現16 位定點加、減、乘、除運算的基本方法 和編程技巧。本實驗的演示文件為exer1.out。 2.2 實驗原理 定點 DSP 中的數據表示方法 C54X 是16 位的定點DSP。一個16 位的二進制數既可以表示一個整數,也可以表 示一個小數。當它表示一個整數時,其最低位(D0)表示20,D1 位表示21,次高位(D14)表示214。實現 16 位定點加法 C54X 中提供了多條用于加法的指令,如ADD,ADDC,ADDM 和ADDS。其中 ADDS 用于無符號數的加法運算,ADDC 用于帶進位的加法運算(如32 位擴展精度加 法),而ADDM 專用于立即數的加法。實現 16 位定點減法 C54X 中提供了多條用于減法的指令,如SUB,SUBB,SUBC 和SUBS。其中SUBS 用于無符號數的減法運算,SUBB 用于帶進位的減法運算(如32 位擴展精度的減法),而SUBC 為移位減,DSP 中的除法就是用該指令來實現的。實現 16 位定點整數乘法 在C54X 中提供了大量的乘法運算指令,其結果都是32 位,放在A 或B 寄存器 中。乘數在C54X 的乘法指令很靈活,可以是T 寄存器、立即數、存貯單元和A 或B 寄存器的高16 位。實現 16 位定點小數乘法 在 C54X 中,小數的乘法與整數乘法基本一致,只是由于兩個有符號的小數相乘,其結果的小數點的位置在次高的后面,所以必須左移一位,才能得到正確的結果。C54X 中提供了一個狀態位FRCT,將其設置為1 時,系統自動將乘積結果左移一位。但注意 整數乘法時不能這樣處理,所以上面的實驗中一開始便將FRCT 清除。兩個小數(16 位) 相乘后結果為32 位,如果精度允許的話,可以只存高16 位,將低16 位丟棄,這樣仍可 得到16 位的結果。6 實現 16 位定點整數除法 在 C54X 中沒有提供專門的除法指令,一般有兩種方法來完成除法。一種是用乘法 來代替,除以某個數相當于乘以其倒數,所以先求出其倒數,然后相乘。這種方法對于 除以常數特別適用。另一種方法是使用SUBC 指令,重復16 次減法完成除法運算。實現 16 位定點小數除法 在 C54X 中實現16 位的小數除法與前面的整數除法基本一致,也是使用循環的 SUBC 指令來完成。但有兩點需要注意:第一,小數除法的結果一定是小數(小于1),所以被除數一定小于除數。 2.3 實驗內容 本實驗需要使用C54X 匯編語言實現加、減、乘、除的基本運算,并通過DES 的存 貯器顯示窗口觀察結果。1 編寫實驗程序代碼 用 ccs simulator 調試運行并觀察結 2.4 實驗結果 1、加法結果 2、乘法結果 3、減法結果 4、除 2.5 思考題(0.5、0.25) 實驗三 C54X的浮點數的算術運 一、實驗目的 練習TMS320C54X 匯編程序的編寫與調試方法,重點練習C54X 程序流程控制的方法。學習并掌握應用 TMS320C54X 來進行浮點數的各種算術運算的算法實現。練習并掌握 TMS320C54X 的匯編語言的匯編指令系統的使用方法,重點練習具有C54X 特點的一些在功能上有所擴展的特殊指令,并了解這些指令在進行算術運算或各種控制時所帶來的方便。練習并掌握用 CCS 調試程序的一些基本操作。二.實驗原理 1 浮點數的表示方法 在定點運算中,小數點是在一個特定的固定位置。例如,如果一個 32-bit 的數把小數點放在最高有效位(也就是符號位)之后,那么就只有分數(絕對值小于1)才能被顯示。在定點運 算系統中,雖然在硬件上實現簡單,但是表示的操作數的動態范圍要受到限制。3 浮點數運算的步驟 程序代碼分成四個 ASM 文件輸入,通過編譯生成.obj 文件,連接生成.out 文件后就可以在DES320PP-U 實驗系統上調試運行(先要創建一個工程文件,然后加入四個工程文件,并且一起編譯,連接。因為每個文件都對下一個文件作了引用)。步驟如下: a.首先啟動 setup CCS C5000,在其中設置目前需要的CCS 的工作狀態為C54xxsimulator,保存這一設置并退出。然后再啟動CCS 實驗系統軟件CCS C5000。 b.在下拉菜單中選擇“File”->“Load Program”以裝入所要調試的程序fc.out,這時,在反匯編窗口中能看到程序的源代碼。 c.在下拉菜單中選擇“View”->“CPU Registers”->“CPU Register”,可以看見在CCS 界面下部份會出現CPU 中的相關寄存器;選擇“View”->“Memory…”,在彈出的“Memory Window Options”窗口中選擇要觀察的區域為數據區,地址開始為0x80h,然后就可以看見出現一個Data Memory 窗口,其中顯示了從0x80h 開始的.bss 區。 d.在反匯編窗口中需要觀察的地方設置斷點:在這條指令處雙擊將其點為紅色即可。比如在加法程序中有指令nop 的位置都可以加一個斷點。 e.在下拉菜單中選擇“調試”——“連續運行”(或直接點擊“運行程序”按鈕)運行浮點數程序。如果編寫程序時在計算完畢后遇到一個斷點,那么程序到此會自動停止。 f.當示范程序在第一個斷點處停下來時,此時就可以看見程序初始化后的情況:被加數12.0 以浮點數的格式放在內存區0x08a-0x08b 中,其值為4140h 和0000h。加數12.0 放在內存區0x08c-0x08d 中,其值也為4140h 和0000h。 g.再點擊“運行程序”按鈕,之后程序會在下一個斷點處停下來,這時可以看見被加數被格式轉換后的變量op1hm、op1lm 和op1se 的值在內存區0x084-0x086 中,分別為00c0h、0000h 和0082h。同樣加數被格式轉換后的變量op2se、op2hm 和op2lm的值在內存區0x087-0x089 中,分別為0082h、00c0h 和0000h。 h.再點擊“運行程序”按鈕,程序停下來時就可以觀察到在存儲器窗口中表示結果的變量rlthm、rltlm、rltsign 和rltexp 的值在內存區0x080-0x083 中,其值分別為0040h、0000h、0180h 和0083h。 i.這時可以看到 A 寄存器中的值為AH=41c0h,AL=0000h 這就是最后的以浮點數的格式表示的結果值24(=12+12)。加法運算到此結束。 j.繼續點擊“運行程序”按鈕,當程序再次停下來時就可以看見在A 寄存器中顯示的13.0 與12.0 進行減法運算的結果:AH=3f80h,AL=0000h。這是用浮點數格式表示的數1(=13-12)。減法運算的程序到此結束。 k.繼續點擊“運行程序”按鈕,當程序再次停下來時就可以看見在A 寄存器中顯示的12.0 與12.0 進行乘法運算的結果:AH=4310h,AL=0000h。這是用浮點數格式表示的數144(=12*12)。乘法運算的程序到此結束。 l.繼續點擊“運行程序”按鈕,當程序再次停下來時就可以看見在A 寄存器中顯示的12.0 與4.0 進行除法運算的結果:AH=4040h,AL=0000h。這是用浮點數格式表示的數3(=12/4)。至此加、減、乘、除四種運算都運行完畢。 m.如果程序運行不正確,請檢查源程序是否有誤,必要時可以在源程序中多插入斷點語句。程序在執行到斷點語句時自動暫停,此時可以通過檢查各個寄存器中的值以及內存單元中的值來判斷程序執行是否正確。 三.在 CCS 的C54xx simulator 上調試觀察實驗結果 浮點加法斷點一: 浮點加法斷點二: 浮點加法斷點三: 浮點減法 浮點數乘法 浮點數除法 四 心得體會 通過學習C54X的浮點數的算術運算,以及實驗結果的觀察,使我了解了浮點數運算的原理,學習并掌握用TMS320C54X來進行浮點數的各種算術運算的算法實現。實驗四用定時器實現數字振蕩器 實驗四 用定時器實現數字振蕩器 4.1 實驗目的 在數字信號處理中,會經常使用到正弦/余弦信號。通常的方法是將某個頻率的正弦/余弦值預先計算出來后制成一個表,DSP 工作時僅作查表運算即可。在本實驗中將介紹另一種獲得正弦/余弦信號的方法,即利用數字振蕩器用疊代方法產生正弦信號。本實驗除了學習數字振蕩器的DSP 實現原理外,同時還學習C54X 定時器使用以及中斷服務程序編寫。另外,在本實驗中我們將使用匯編語言和C 語言分別完成源程序的編寫。 4.2 本實驗利用定時器產生一個 2kHz 的正弦信號。定時器被設置成每25uS 產生一次中斷(等效于采樣速率為40K)。利用該中斷,在中斷服務程序中用疊代算法計算出一個SIN值,并利用CCS 的圖形顯示功能查看波形。 4.3 實驗原理 數字振蕩器原理 sinkωT,其 z 變換為 H(z= 其中,A=2cosωT, B=-1, C=sinωT。設初始條件為0,求出上式的反Z 變換得: y[k]=Ay[k-1]+By[k-2]+Cx[k-1] 2 C54X 的定時器操作 C54X 的片內定時器利用CLKOUT 時鐘計數,用戶使用三個寄存器(TIM,PRD,TCR)來控制定時器,參見表4-1。在表4-2 中列出了定時器控制寄存器的各個比特位的具體定義。‘VC5402 的另一個定時器(定時器1)的控制寄存器分別為:0x30 TIM1),0x31(PRD1),0x32(TCR1)。C54X 中斷的使用 C54X 中用戶可以通過中斷屏蔽寄存器 IMR 來決定開放或關閉一個中斷請求。圖 4-1 給出了 C5402 的 IMR 寄存器的各個比特位的定義。 圖 4-1 ‘C5402 的IMR 寄存器 其中,表示HPI 接口中斷,INT3-INT0 為外部引腳產生的中斷,TXINT 和TRINT 為TDM 串口的發送和接收中斷,BXINT0 和BRINT0 BSP 串口的發送和接收中斷,14 為定時器 0 中斷。在中斷屏蔽寄存器 IMR 中,1 表示允許 CPU 響應對應的中斷,0 表示禁止。當然要 CPU 響應中斷,INTM 還應該為 0(允許所有的中斷)。 本實驗的初始化程序讀取中斷向量表的啟始地址,然后設置的高 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) 4.4 實驗內容 C54X 匯編語言或C 語言實現數字振蕩器,并通過CCS 提供的圖形顯示窗口觀察出信號波形以及頻譜。實驗分下面幾步完成: 根據確定數字振蕩器的頻率,確定系數。2 啟動 CCS,新建工程文件。 選擇 Project 菜單中的Options 選項,或使用鼠標右鍵單擊工程文件名(如sinewave.pjt)并選擇build options 項來修改或添加編譯、連接中使用的參數。選擇Linker Output Filename”欄中寫入輸出OUT 文件的名字,如sine.out,你還可以設置生成的MAP 文件名。4 完成編譯、連接,正確生成OUT 文件。5 選 View→Graph→ 5…打開圖形顯示設置窗口。在匯編源程序的中斷服務程序(_tint)中的“nop”語句處設置斷點。用右鍵單擊圖形顯示窗口,并選擇“Proporties”項以便修改顯示屬性。清除所有斷點,關閉除波形顯示窗口外的所有窗口,并關閉工程文件。完成編譯、連接,正確生成OUT 文件。 10打開 C 源程序(timer.c)窗口,在中斷服務程序(函數tint()的“con_buf=0 Start Address ”改為 buf ;“ Acquisition Buffer Size ”改為“ Display Data Size 128,“DSP DataType”為“32-bit floating point” 11選擇 Debug→Animate,運行程序,觀察輸出波形。 實驗0 實驗設備安裝才CCS調試環境 實驗目的: 按照實驗講義操作步驟,打開CCS軟件,熟悉軟件工作環境,了解整個工作環境內容,有助于提高以后實驗的操作性和正確性。實驗步驟: 以演示實驗一為例: 1. 使用配送的并口電纜線連接好計算機并口與實驗箱并口,打開實驗箱電源; 2.啟動CCS,點擊主菜單“Project->Open”在目錄“C5000QuickStartsinewave”下打開工程文件sinewave.pjt,然后點擊主菜單“Project->Build”編譯,然后點擊主菜單“File->Load Program”裝載debug目錄下的程序sinewave.out; 3. 打開源文件exer3.asm,在注釋行“set breakpoint in CCS!!”語句的NOP處單擊右鍵彈出菜單,選擇“Toggle breakpoint”加入紅色的斷點,如下圖所示; 4. 點擊主菜單“View->Graph->Time/Frequency?”,屏幕會出現圖形窗口設置對話框 5. 雙擊Start Address,將其改為y0;雙擊Acquisition Buffer Size,將其改為1;DSP Data Type設置成16-bit signed integer,如下圖所示; 6. 點擊主菜單“Windows->Tile Horizontally”,排列好窗口,便于觀察 7. 點擊主菜單“Debug->Animate”或按F12鍵動畫運行程序,即可觀察到實驗結果: 心得體會: 通過對演示實驗的練習,讓自己更進一步對CCS軟件的運行環境、編譯過程、裝載過程、屬性設置、動畫演示、實驗結果的觀察有一個醒目的了解和熟悉的操作方法。熟悉了DSP實驗箱基本模塊。讓我對DSP課程產生了濃厚的學習興趣,課程學習和實驗操作結合為一體的學習體系,使我更好的領悟到DSP課程的實用性和趣味性。 實驗二 基本算數運算 2.1 實驗目的和要求 加、減、乘、除是數字信號處理中最基本的算術運算。DSP 中提供了大量的指令來 實現這些功能。本實驗學習使用定點DSP 實現16 位定點加、減、乘、除運算的基本方法 和編程技巧。本實驗的演示文件為exer1.out。 2.2 實驗原理 1)定點 DSP 中的數據表示方法 C54X 是16 位的定點DSP。一個16 位的二進制數既可以表示一個整數,也可以表 示一個小數。當它表示一個整數時,其最低位(D0)表示20,D1 位表示21,次高位(D14)表示214。 2)實現 16 位定點加法 C54X 中提供了多條用于加法的指令,如ADD,ADDC,ADDM 和ADDS。其中 ADDS 用于無符號數的加法運算,ADDC 用于帶進位的加法運算(如32 位擴展精度加 法),而ADDM 專用于立即數的加法。 3)實現 16 位定點減法 C54X 中提供了多條用于減法的指令,如SUB,SUBB,SUBC 和SUBS。其中SUBS 用于無符號數的減法運算,SUBB 用于帶進位的減法運算(如32 位擴展精度的減法),而SUBC 為移位減,DSP 中的除法就是用該指令來實現的。 4)實現 16 位定點整數乘法 在C54X 中提供了大量的乘法運算指令,其結果都是32 位,放在A 或B 寄存器 中。乘數在C54X 的乘法指令很靈活,可以是T 寄存器、立即數、存貯單元和A 或B 寄存器的高16 位。 5)實現 16 位定點小數乘法 在 C54X 中,小數的乘法與整數乘法基本一致,只是由于兩個有符號的小數相乘,其結果的小數點的位置在次高的后面,所以必須左移一位,才能得到正確的結果。C54X 中提供了一個狀態位FRCT,將其設置為1 時,系統自動將乘積結果左移一位。但注意 整數乘法時不能這樣處理,所以上面的實驗中一開始便將FRCT 清除。兩個小數(16 位)相乘后結果為32 位,如果精度允許的話,可以只存高16 位,將低16 位丟棄,這樣仍可 得到16 位的結果。 6)實現 16 位定點整數除法 在 C54X 中沒有提供專門的除法指令,一般有兩種方法來完成除法。一種是用乘法 來代替,除以某個數相當于乘以其倒數,所以先求出其倒數,然后相乘。這種方法對于 除以常數特別適用。另一種方法是使用SUBC 指令,重復16 次減法完成除法運算。 7)實現 16 位定點小數除法 在 C54X 中實現16 位的小數除法與前面的整數除法基本一致,也是使用循環的 SUBC 指令來完成。但有兩點需要注意:第一,小數除法的結果一定是小數(小于1),所以被除數一定小于除數。 2.3 實驗內容 本實驗需要使用C54X 匯編語言實現加、減、乘、除的基本運算,并通過DES 的存 貯器顯示窗口觀察結果。 1)編寫實驗程序代碼 2)用 ccs simulator 調試運行并觀察結 2.4 實驗結果 1、加法結果 2、乘法結果 3、減法結果 4、除2.5 思考題(0.5、0.25)實驗三 C54X的浮點數的算術運 一、實驗目的 1)練習TMS320C54X 匯編程序的編寫與調試方法,重點練習C54X 程序流程控制的方法。2)學習并掌握應用 TMS320C54X 來進行浮點數的各種算術運算的算法實現。 3)練習并掌握 TMS320C54X 的匯編語言的匯編指令系統的使用方法,重點練習具有C54X 特點的一些在功能上有所擴展的特殊指令,并了解這些指令在進行算術運算或各種控制時所帶來的方便。 4)練習并掌握用 CCS 調試程序的一些基本操作。 二.實驗原理 1)浮點數的表示方法 在定點運算中,小數點是在一個特定的固定位置。例如,如果一個 32-bit 的數把小數點放在最高有效位(也就是符號位)之后,那么就只有分數(絕對值小于1)才能被顯示。在定點運算系統中,雖然在硬件上實現簡單,但是表示的操作數的動態范圍要受到限制。 3)浮點數運算的步驟 程序代碼分成四個 ASM 文件輸入,通過編譯生成.obj 文件,連接生成.out 文件后就可以在DES320PP-U 實驗系統上調試運行(先要創建一個工程文件,然后加入四個工程文件,并且一起編譯,連接。因為每個文件都對下一個文件作了引用)。步驟如下: a.首先啟動 setup CCS C5000,在其中設置目前需要的CCS 的工作狀態為C54xxsimulator,保存這一設置并退出。然后再啟動CCS 實驗系統軟件CCS C5000。 b.在下拉菜單中選擇“File”->“Load Program”以裝入所要調試的程序fc.out,這時,在反匯編窗口中能看到程序的源代碼。 c.在下拉菜單中選擇“View”->“CPU Registers”->“CPU Register”,可以看見在CCS 界面下部份會出現CPU 中的相關寄存器;選擇“View”->“Memory…”,在彈出的“Memory Window Options”窗口中選擇要觀察的區域為數據區,地址開始為0x80h,然后就可以看見出現一個Data Memory 窗口,其中顯示了從0x80h 開始的.bss 區。 d.在反匯編窗口中需要觀察的地方設置斷點:在這條指令處雙擊將其點為紅色即可。比如在加法程序中有指令nop 的位置都可以加一個斷點。 e.在下拉菜單中選擇“調試”——“連續運行”(或直接點擊“運行程序”按鈕)運行浮點數程序。如果編寫程序時在計算完畢后遇到一個斷點,那么程序到此會自動停止。 f.當示范程序在第一個斷點處停下來時,此時就可以看見程序初始化后的情況:被加數12.0 以浮點數的格式放在內存區0x08a-0x08b 中,其值為4140h 和0000h。加數12.0 放在內存區0x08c-0x08d 中,其值也為4140h 和0000h。g.再點擊“運行程序”按鈕,之后程序會在下一個斷點處停下來,這時可以看見被加數被格式轉換后的變量op1hm、op1lm 和op1se 的值在內存區0x084-0x086 中,分別為00c0h、0000h 和0082h。同樣加數被格式轉換后的變量op2se、op2hm 和op2lm的值在內存區0x087-0x089 中,分別為0082h、00c0h 和0000h。 h.再點擊“運行程序”按鈕,程序停下來時就可以觀察到在存儲器窗口中表示結果的變量rlthm、rltlm、rltsign 和rltexp 的值在內存區0x080-0x083 中,其值分別為0040h、0000h、0180h 和0083h。 i.這時可以看到 A 寄存器中的值為AH=41c0h,AL=0000h 這就是最后的以浮點數的格式表示的結果值24(=12+12)。加法運算到此結束。 j.繼續點擊“運行程序”按鈕,當程序再次停下來時就可以看見在A 寄存器中顯示的13.0 與12.0 進行減法運算的結果:AH=3f80h,AL=0000h。這是用浮點數格式表示的數1(=13-12)。減法運算的程序到此結束。 k.繼續點擊“運行程序”按鈕,當程序再次停下來時就可以看見在A 寄存器中顯示的12.0 與12.0 進行乘法運算的結果:AH=4310h,AL=0000h。這是用浮點數格式表示的數144(=12*12)。乘法運算的程序到此結束。 l.繼續點擊“運行程序”按鈕,當程序再次停下來時就可以看見在A 寄存器中顯示的12.0 與4.0 進行除法運算的結果:AH=4040h,AL=0000h。這是用浮點數格式表示的數3(=12/4)。至此加、減、乘、除四種運算都運行完畢。 m.如果程序運行不正確,請檢查源程序是否有誤,必要時可以在源程序中多插入斷點語句。程序在執行到斷點語句時自動暫停,此時可以通過檢查各個寄存器中的值以及內存單元中的值來判斷程序執行是否正確。 三.在 CCS 的C54xx simulator 上調試觀察實驗結果 浮點加法斷點一: 浮點加法斷點二: 浮點加法斷點三: 浮點減法 浮點數乘法 浮點數除法 四 心得體會 通過學習C54X的浮點數的算術運算,以及實驗結果的觀察,使我了解了浮點數運算的原理,學習并掌握用TMS320C54X來進行浮點數的各種算術運算的算法實現。實驗四用定時器實現數字振蕩器 實驗四 用定時器實現數字振蕩器 4.1 實驗目的 在數字信號處理中,會經常使用到正弦/余弦信號。通常的方法是將某個頻率的正弦/余弦值預先計算出來后制成一個表,DSP 工作時僅作查表運算即可。在本實驗中將介紹另一種獲得正弦/余弦信號的方法,即利用數字振蕩器用疊代方法產生正弦信號。本實驗除了學習數字振蕩器的DSP 實現原理外,同時還學習C54X 定時器使用以及中斷服務程序編寫。另外,在本實驗中我們將使用匯編語言和C 語言分別完成源程序的編寫。 4.2 實驗要求 本實驗利用定時器產生一個 2kHz 的正弦信號。定時器被設置成每25uS 產生一次中斷(等效于采樣速率為40K)。利用該中斷,在中斷服務程序中用疊代算法計算出一個SIN值,并利用CCS 的圖形顯示功能查看波形。 4.3 實驗原理 1)數字振蕩器原理 設一個傳遞函數為正弦序列 sinkωT,其z 變換為 H(z)= 其中,A=2cosωT, B=-1, C=sinωT。設初始條件為0,求出上式的反Z 變換得: y[k]=Ay[k-1]+By[k-2]+Cx[k-1] 2)C54X 的定時器操作 C54X 的片內定時器利用CLKOUT 時鐘計數,用戶使用三個寄存器(TIM,PRD,TCR)來控制定時器,參見表4-1。在表4-2 中列出了定時器控制寄存器的各個比特位的具體定義。‘VC5402 的另一個定時器(定時器1)的控制寄存器分別為:0x30(TIM1),0x31(PRD1),0x32(TCR1)。 3)C54X 中斷的使用 在 C54X 中用戶可以通過中斷屏蔽寄存器IMR 來決定開放或關閉一個中斷請求。圖4-1 給出了C5402 的IMR 寄存器的各個比特位的定義。 圖 4-1 ‘C5402 的IMR 寄存器 其中,HPINT 表示HPI 接口中斷,INT3-INT0 為外部引腳產生的中斷,TXINT 和TRINT 為TDM 串口的發送和接收中斷,BXINT0 和BRINT0 為BSP 串口的發送和接收中斷,TINT0 為定時器0 中斷。在中斷屏蔽寄存器IMR 中,1 表示允許CPU 響應對應的中斷,0 表示禁止。當然要CPU 響應中斷,ST1 寄存器中的INTM 還應該為0(允許所有的中斷)。 本實驗的初始化程序讀取中斷向量表的啟始地址,然后設置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) 4.4 實驗內容 本實驗需要使用 C54X 匯編語言或C 語言實現數字振蕩器,并通過CCS 提供的圖形顯示窗口觀察出信號波形以及頻譜。實驗分下面幾步完成: 1)根據確定數字振蕩器的頻率,確定系數。2)啟動 CCS,新建工程文件。 3)選擇 Project 菜單中的Options 選項,或使用鼠標右鍵單擊工程文件名(如sinewave.pjt)并選擇build options 項來修改或添加編譯、連接中使用的參數。選擇Linker 窗口,在“Output Filename”欄中寫入輸出OUT 文件的名字,如sine.out,你還可以設置生成的MAP 文件名。 4)完成編譯、連接,正確生成OUT 文件。 5)選 View→Graph→Time/Frequency?打開圖形顯示設置窗口。6)在匯編源程序的中斷服務程序(_tint)中的“nop”語句處設置斷點。7)用右鍵單擊圖形顯示窗口,并選擇“Proporties”項以便修改顯示屬性。8)清除所有斷點,關閉除波形顯示窗口外的所有窗口,并關閉工程文件。9)完成編譯、連接,正確生成OUT 文件。 10)打開 C 源程序(timer.c)窗口,在中斷服務程序(函數tint())的“con_buf=0;”語句處增加一個斷點。同樣打開圖形顯示窗口,并將“Start Address”改為buf;“Acquisition Buffer Size”改為“Display Data Size”改為128,“DSP DataType”為“32-bit floating point” 11)選擇 Debug→Animate,運行程序,觀察輸出波形。 信息與通信工程學院 信號與信息處理綜合實驗(DSP部分) 實驗報告 班 級: 2012211127 名: 劉燦 姓 學 日 號: 2012210732 期: 2015.4.10 一.實驗題目 Hello World和LED 二.實驗目的 熟悉平DSK6416開發臺,掌握CCS軟件的基本操作流程,達到熟練操作軟、硬件系統開發、調試的目的。 三.實驗任務及要求 1.任務 (1)在控制臺中顯示Hello World 運行程序后,在控制臺顯示Hello World(2)控制LED燈閃爍 FTP給出一個LED的程序模板,可以控制LED 0的閃爍。基于該模板,需要完成: (a)修改閃爍的頻率; (b)通過寫8bit數值到CPLD寄存器來控制LED,使得4個LED以200ms的頻率同時打開和關閉。 2.要求 (1)實現基本功能且不出現任何錯誤 (2)基于原理實現多功能的擴展 四.組內分工 劉杰 程序代碼的編寫與調試 劉燦 建立工程以及目標系統的配置 五.實驗內容及流程 1.實驗內容 這次實驗內容是顯示hello world和控制LED燈的閃爍。由于是dsp的第一次實驗,內容比較簡單,主要還是在于熟悉ccs這個軟件在進行dsp開發時的具體建立工程、配置文件、導入實驗板和程序燒寫調試的過程和步驟。 2.實驗流程介紹 1.新建工程 (1)打開ccs后點擊菜單中的“File->New->Project”,選擇“CCS project”,然后進入下一個頁面進行工程的命名。 (2)命名完成之后是選擇工程的硬件平臺,我們實驗室所使用的實驗板是DSK6416,它的芯片為C6000系列的TMS320C6416,所以在“Project Type”下拉框中選擇“C6000”,其余選項默認即可。 (3)接下來是設置工程屬性,在“Device Variant”下拉欄中選擇“Generic devices-> Generic C64xx Device”,“Device Endianness”選擇little,其余保持默認值。 (4)然后工程模板選擇“hello world”,就完成了工程的新建。 2.代碼編譯和鏈接 (1)添加源代碼(2)配置CSL庫 將C6000的CSL庫,存在本地PC機硬盤上,我們hello world工程的代碼路徑為C:ticsl。在pll_led工程圖標上單擊右鍵,選擇“Show Build Settings…”來設置編譯屬性,設置include options,單擊新建,在對話框中輸入“C:ticslinclude” (3)定義芯片型號: 在“predefine symbols”選項中輸入芯片型號CHIP_6416(4)指定鏈接庫: 在工程屬性的“C6000 Linker”的“File Search Path”選項中需要添加DSK6416和CSL6416這兩個庫,其路徑分別為“c:tidsk6414libdsk6414bsl.lib”和“c:ticsllib_2xcsl6414.lib” (5)添加cmd文件: 在工程路徑下新建一個文本文件,將其后綴修改成.cmd,名稱可隨便修改,并且在文本文件中寫入下列內容:-stack 0x400-heap 0x400 保存并編譯工程,生成“.out”文件。 3.軟件調試 在工程中運行“New->Target Configuration File”新建配置文件,命名為DSK6416_led.ccxml來完成CCS軟件和板卡的連接。命名完后在配置文件Basic中Connection選擇Spectrum digital DSK-EVM-eZdsp onboard USB Emulator,Device選擇DSK6416,保存。然后進行調試,設置斷點。最后將程序燒錄到實驗板中,檢查實驗結果。 六.源代碼及注釋 #include printf(“Hello World!n”); //控制臺顯示“hello world” DSK6416_init(); //初始化LED和DIP DSK6416_LED_init(); DSK6416_DIP_init(); while(1){ if(DSK6416_DIP_get(3)== 0) //開關3控制LED燈以200ms閃爍 { DSK6416_LED_toggle(3); DSK6416_waitusec(200000); } else if(DSK6416_DIP_get(2)== 0) //開關2控制LED燈以100ms閃爍 { DSK6416_LED_toggle(3); DSK6416_waitusec(100000); } else if(DSK6416_DIP_get(1)== 0) //開關1控制4個燈以200ms同時亮滅 { DSK6416_rset(DSK6416_USER_REG, 0x0f); DSK6416_waitusec(200000); DSK6416_rset(DSK6416_USER_REG, 0x00); DSK6416_waitusec(200000); } else if(DSK6416_DIP_get(0)== 0)//開關0控制4個燈循環亮滅,間隔200ms { for(int i=0;i<4;i++){ DSK6416_LED_toggle(i); DSK6416_waitusec(200000);} } } } 七.實驗結果 1.按照實驗步驟進行操作后,實驗控制臺正常顯示顯示“Hello World”,如下圖: 2.實驗板上DIP 0~3開關控制的LED燈閃爍效果也符合程序預期的效果。 八.遇到的問題 由于第一次實驗的內容較為簡單,我們在編程方面沒有遇到什么困難,工程的建立和系統的配置也能照著實驗指導書按部就班的完成。但是在連接實驗板時我們遇到了連接不上的問題。機房的電腦連接實驗板后安裝不了驅動,我們自己帶的筆記本電腦也有沒有反應的現象。后來我們換了同學的電腦才成功的連接上。 九.心得體會 第一次的實驗總的來說比較容易,主要是對ccs這個軟件的操作和建立工程的過程的熟悉。通過這次實驗我對于這學期dsp實驗的流程和步驟有了大體的了解,也熟悉了ccs的編程和調試,也為下次的實驗打好了基礎。第二篇:dsp實驗報告心得體會
第三篇:DSP實驗報告
第四篇:DSP實驗報告
第五篇:DSP第一次實驗報告