当前位置:首页 >> 信息与通信 >>

课程设计报告


2012 专业综合课程设计 II

DSP5509 开发板 测试实验

实验报告

班级: 姓名: 学号:

DSP5509 开发板是一套功能齐全的基于 TMS320VC5509A DSP 的学习开发平台, DSP5509 开发板既可作为开发板供用户学习使用,也可作为系统板嵌入到用户的产品供用 户进

行二次开发以便缩短产品开发周期。 在生产实习熟悉了 DSP5509 开发板功能的基础上,学生进行了 9 个软件测试实验,对 于这款 DSP 芯片有了更深层次的了解,学到了很多关于硬件设计和开发的知识,对于自己 的编程能力也有了很大的提高。 1、CPU 看门狗实验 看门狗的作用:防止因为软件死循环而造成的系统死锁。 HX-5509 看门狗的结构: Watchdog Timer 包括一个 16bit 的预定标计数器+一个 16bit 的主计数器,从而提供一个 32bit 动态范围的计数器 当主计时器减为 0 时,产生超时事件,引发以下的可编程事件: 00b,一个看门狗定时器中断 01b,DSP 复位 10b,一个非屏蔽中断(NMI) 11b,不发生任何事件 所产生的超时事件,通过编程控制寄存器 WDTCR 中的 WDOUT 域来控制,如: WDTIM_FSET(WDTCR, WDOUT, 1); /* Connect to NMI 连接到不可屏蔽 中断*/ 每当预定标计数器减为 0,就会重新装入,并重新开始计数 装入的值由 WDTCR 中 TDDR 位+ WDTCR2 中的预定标模式 PREMD 位来决定,如: WDTIM_FSET(WDTCR, TDDR, 0xF); /* Value to load PSC field 前置计数器的值: FFFFh*/ WDTIM_FSET(WDTCR2, PREMD, 0); /*前置计数器模式:直接模式 */ PREMD=0 该模式下,4 位 TDDR 直接装入,提供 20bit 动态范围 注意:一旦看门狗使能,其寄存器都处于写保护状态。 前三个寄存器写无效, WDTCR2 某些域写无效 看门狗实验的主程序如下(重要语句学生已做了注释) : //这段程序的作用就是观察看门狗寄存器的计数过程 #include <csl.h> #include <csl_wdtim.h> #include <stdio.h> int i, pscVal; WDTIM_Config getConfig; /*读*/ WDTIM_Config myConfig = { 0x1000, /* WDPRD 周期寄存器 只是一个初始化, 在 MAIN 函数里还写 */ 0x0000, /* WDTCR 控制寄存器 */ 0x1000 /* WDTCR2 控制寄存器 2 */ };

main() { CSL_init();//初始化 #if (_WDTIM_SUPPORT) //#if (_WDTIM_SUPPORT)如果前面的程序已经定义宏名_WDTIM_SUPPORT 就编译知道和 这个#if 配套的#endif 中间的代码,否则,跳过这块代码.这里的这句程序没有用 WDTIM_config(&myConfig);//配置看门狗,需要调用看门狗配置函数 WDTIM_FSET(WDTCR, WDOUT, 1); /* Connect to NMI 连接到不可屏蔽中断*/ WDTIM_FSET(WDTCR, TDDR, 0xF); /* Value to load PSC field 前置计数器的值:FFFFh*/ WDTIM_FSET(WDTCR2, PREMD, 0); /* Set direct mode 前置计数器模式:直接模式 */ WDTIM_service(); /* enable watchdog 使能看门狗 */ for (;;) { WDTIM_getConfig(&getConfig);/*保存读到的值*/ pscVal = WDTIM_FGET(WDTCR,PSC);/*把 PSC 的值赋给 pscVal*/ printf("pscVal: %x, wdtcr: %x\n", pscVal, getConfig.wdtcr); /*输出*/ //WDTIM_service(); /*当超时后, WDFLAG 会置 1,使能看门狗将超时时间的 WDFLAG 位清零*/ } //结束循环 #endif } 实验现象: 2、LED 跑马灯实验 GPIO (通用输入/输出)或总线扩展器利用工业标准 I? C、 SMBus?或 SPI?接口简化了 I/O 口的扩展。当微控制器或芯片组没有足够的 I/O 端口,或当系统需要采用远端串行通信或控 制时,GPIO 产品能够提供额外的控制和监视功能。 每个 GPIO 端口可通过软件分别配置成输入或输出。 VC5509 有 8 个通用的 I/O 口 GPIO0-GPIO7。本开发板中,当输出为零时,对应的 LED 灯会点亮。 VC5509 内部包含一个数字锁相环(DPLL),它可以使用相关的寄存器来使能和禁用, 并且实现分频和倍频。 输出频率计算公式: 将输入时钟频率乘以 CLKMD 中 PLL_MULT 的值,再除以 PLL_DIV 的值 PLL_MULT 的取值范围是 2-31 PLL_DIV 是从 0(除以 1)到 3(除以 4) 输出频率= (PLL_MULT/(PLL_DIV+1))*输入时钟频率 eg: (24/(1+1))*12M=144M(此例中 PLL_MULT 为 24,PLL_MULT 值为 1) 主要程序为(重要语句已作注释) : #include <csl.h> #include <csl_pll.h> #include <csl_chip.h> #include <csl_gpio.h> void delay(); /*锁相环的设置*/ PLL_Config myConfig ={

//IAI: the PLL locks using the same process that was underway //before the idle mode was entered 1, //IOB: If the PLL indicates a break in the phase lock, //it switches to its bypass mode and restarts the PLL phase-locking //sequence 24, //PLL multiply value; multiply 24 times 1 //Divide by 2 PLL divide value; it can be either PLL divide value //(when PLL is enabled), or Bypass-mode divide value //(PLL in bypass mode, if PLL multiply value is set to 1) };//设置为 144M main() { int i = 0; CSL_init();/*初始化 CSL 库,相当于全局初始化*/ PLL_config(&myConfig); /*设置系统的运行速度为 144MHz*/ GPIO_RSET(IODIR,0xFF);//设置 GPIO 方向寄存器函数,确定方向为输出*/ for(i = 0;i<0x02;i++) { GPIO_RSET(IODATA,0x0); /*全亮*/ delay(); GPIO_RSET(IODATA,0xff);//设置数据寄存器,全灭*/ delay(); } /*循环闪烁*/ for(;;) { GPIO_RSET(IODATA,0x1);delay();delay(); GPIO_RSET(IODATA,0x2);delay();delay(); GPIO_RSET(IODATA,0x4);delay();delay(); GPIO_RSET(IODATA,0x8);delay();delay(); GPIO_RSET(IODATA,0x10);delay();delay(); GPIO_RSET(IODATA,0x40);delay();delay(); GPIO_RSET(IODATA,0x80);delay();delay(); } } void delay() { Uint32 j = 0,k = 0; for(j = 0;j<0x0c;j++) { for(k= 0;k<0xffff;k++) {} } } 实验现象:LED 灯先都同时亮灭两次之后,再循环闪烁

0,

3、CPU Timer 定时器实验 C55x 芯片内斗提供了两个通用寄存器,可向 CPU 产生周期性中断或向 DSP 芯片外的 器件提供周期信号,TMS320VC5509 提供的是 2 个 20 位的通用寄存器,每个通用寄存器都 由 2 部分组成:一个 4 位的预定标寄存器(PSC)和一个 16 位的主计数器(TIM) 。 定时器有两个计数寄存器和两个周期寄存器, 在定时器初始化或定时值重新装入的过程 中,周期寄存器的内容将复制到计数寄存器中。 主要程序为(重要语句已作注释) : #include <stdio.h> #include <csl.h> #include <csl_irq.h> #include <csl_timer.h> #include <csl_chiphal.h> /* 本程序中使用预定义的 CLS 宏和符号常量来配置 timer */ /*中断向量表在 vectors.s55 中 */ extern void VECSTART(void);//函数声明 #define TIMER_CTRL TIMER_TCR_RMK(\ TIMER_TCR_IDLEEN_DEFAULT, /* IDLEEN == 0 */ \ TIMER_TCR_FUNC_OF(0), /* FUNC == 0 */ \ TIMER_TCR_TLB_RESET, /* TLB == 1 */ \ TIMER_TCR_SOFT_BRKPTNOW, /* SOFT == 0 */ \ TIMER_TCR_FREE_WITHSOFT, /* FREE == 0 */ \ TIMER_TCR_PWID_OF(0), /* PWID == 0 */ \ TIMER_TCR_ARB_RESET, /* ARB == 1 */ \ TIMER_TCR_TSS_START, /* TSS == 0 */ \ TIMER_TCR_CP_PULSE, /* CP == 0 */ \ TIMER_TCR_POLAR_LOW, /* POLAR == 0 */ \ TIMER_TCR_DATOUT_0 /* DATOUT == 0 */ \ ) //宏配置 //初始化 TIMER_Config timCfg0 = { TIMER_CTRL, /* TCR0 之前已经进行了宏配置,可以直接写 0x0420*/ 0x3400u, /* PRD0 主周期寄存器结尾的 u 代表无符号整数*/ 0x0000 /* PRSC 预定标寄存器 */ };//定时器配置之后 1kHz 左右 Uint16 eventId0; //此变量用于存储中断 ID 号 TIMER_Handle mhTimer0;//创建一个句柄,便于打开定时器 volatile Uint16 timer0_cnt = 0;//只是起一个计数的作用 interrupt void timer0Isr(void);/*定时器 0 的中断程序*/ int old_intm; Uint16 tim_val; Uint16 xfchange = 0; void main(void) { CSL_init();/*CLS 库的初始化,这是必需的*/

IRQ_setVecs((Uint32)(&VECSTART)); /*修改寄存器 IVPH, IVPD, 重新定义中断向 量表*/ old_intm = IRQ_globalDisable(); /*禁止所有可屏蔽的中断源*/ mhTimer0 = TIMER_open(TIMER_DEV0, TIMER_OPEN_RESET);/*打开定时器 0, 设置其为上电的的默认值,并返回其句柄*/ eventId0 = TIMER_getEventId(mhTimer0);/*获取定时器 0 的中断 ID 号*/ IRQ_clear(eventId0); /*清除定时器 0 的中断状态位*/ IRQ_plug(eventId0,&timer0Isr); /*为定时器 0 设置中断服务程序*/ TIMER_config(mhTimer0, &timCfg0);/*设置定时器 0 的控制与周期寄存器*/ IRQ_enable(eventId0); /*使能定时器的中断*/ IRQ_globalEnable(); /*设置寄存器 ST1 的 INTM 位,使能所有的中断*/ /*启动定时器 0*/ TIMER_start(mhTimer0); for(;;) { if(xfchange == 0) { CHIP_FSET(ST1_55,XF,1); /*点亮 XF 的 LED*/ } else { CHIP_FSET(ST1_55,XF,0); /*关掉 XF 的 LED*/ } } IRQ_globalRestore(old_intm); /*恢复 INTM 旧的值*/ TIMER_close(mhTimer0); /*关掉定时器 0*/ } interrupt void timer0Isr(void) /*定时器 0 的中断程序*/ { ++timer0_cnt; if(timer0_cnt == 2000)//为了避免视觉暂留,把周期设定的大一些 { xfchange = 1; } if(timer0_cnt == 4000) { timer0_cnt = 0; xfchange = 0; } } 实验现象:LED 灯间断亮灭 4、实时时钟实验 RTC 为运行在 DSP 上的应用程序提供了一个时间基准。当前的日期和时间由一组时间 寄存器提供,每秒更新一次。RTC 时钟来源于一个外部频率为 32768Hz 的晶振,连接在

RTCINX1 和 RTCINX2 信号之间,或一个同频率的外部时钟源。RTC 有单独电源,与 DSP 的其他部分分开。所以,即使 DSP 没有上电,RTC 也能保存当前的时间和日期信息。只要 RTC 供电,闹钟寄存器的配置就得以保持。在器件的封装上,有 RTC 单独的供电引脚。为 保证该寄存器所存储的时间的准确性,RTC 为访问该寄存器提供了 1 个读缓冲区和 1 个写 缓冲区 RTCINTEN 中的 SET 位用来控制读写缓冲区与时间日期寄存器的隔离。SET=0,读写 缓冲区直接连接到时间日期寄存器; SET=1,时间日期寄存器复制到读缓冲区,此时读缓 冲区与时间日期寄存器隔离 主要程序为(重要语句已作注释) : #include <csl.h> #include <csl_rtc.h> #include <csl_irq.h> #include <stdio.h> void myPeriodicIsr(void); void myUpdateIsr(void); extern Uint32 VECSTART(); //声明中断向量表 volatile Uint16 rtc_cnt = 0; volatile Uint16 counterPer = 0, counterUp = 0, sec; int min0, min1 = 0; int stop = 0;//标志 int old_intm; int eventId; RTC_Date myDate = { 0x03, /* Year */ 0x02, /* Month */ 0x28, /* Daym */ 0x05 /* Dayw */ }; RTC_Time myTime = { 0x1, /* Hour */ 0x4, /* Minutes */ 0x59, /* Seconds */ }; RTC_IsrAddr addr = { myPeriodicIsr,//函数名,地址 NULL, myUpdateIsr }; main() { CSL_init(); RTC_setTime(&myTime); RTC_setDate(&myDate);

old_intm = IRQ_globalDisable(); //暂时关闭所有可屏蔽中断 IRQ_setVecs((Uint32)(&VECSTART)); //set IVPD,重新定义中断向量表 eventId = RTC_getEventId();//类似于句柄,获取中断向量号 IRQ_clear(eventId);//清除未完成的 RTC 中断 RTC_setCallback(&addr); // 关联中断事件函数,而不是中断函数 RTC_setPeriodicInterval(RTC_RATE_500ms);//设定周期间断的间隔,每 500ms 响应 一次 IRQ_globalEnable(); //全局使能 RTC_start(); //将 rtcinten 中的 set 位清零 sec = RTC_RGET(RTCSEC);//读秒针 while (sec != 0) {sec = RTC_RGET(RTCSEC);}//从 0s 开始 RTC_eventEnable(RTC_EVT_PERIODIC); RTC_eventEnable(RTC_EVT_UPDATE); //中断事件使能 min0 = RTC_RGET(RTCMIN);//读分钟 while (!stop) //让中断发生一分钟/* 等待中断的发生 */ { while (RTC_FGET(RTCPINTR,UIP) != 0);//UIP 位是更新位,为 0 时,至少 244us 不会更新,防止发生错误;为 1 时,再 uip 位变高后,在 244us 内会发生更新 min1 = RTC_RGET(RTCMIN);//实时更新的分钟数 if ((min1 - min0) >= 1) { RTC_eventDisable(RTC_EVT_PERIODIC); //一分钟后禁止中断 RTC_eventDisable(RTC_EVT_UPDATE); stop = 1; } } printf("\nRTC - testing a combination of update and periodic interrupts - successful\n"); RTC_stop(); for(;;) {} } void myPeriodicIsr()//注意,这个地方不是中断,不能用 interupt 关键字 { ++counterPer; printf("\tPeriodic interrupt at: %x::%x::%x\n",RTC_FGET(RTCHOUR, HR), min1, RTC_RGET(RTCSEC)); } void myUpdateIsr() { ++counterUp; sec = RTC_RGET(RTCSEC); printf("Update interrupt at: %x::%x::%x\n",RTC_FGET(RTCHOUR, HR), min1, sec) } 实验现象:

5、AD 转换实验 本开发板将 AD 的高基准电压接+3.3V,低基准电压接地。VC5509A 所提供的模数转换 器一次转换可以再多路输入中任选一路进行采样, 采样结果为十位, 最高采样速率为 21.5kHz. 在具体应用中往往需要采集一些模拟信号量,如电池电压和面板旋钮输入值等,AD 转换器 就是用来将这些模拟量转换为数字量使用。 主要程序为(重要语句已作注释) : #include "myapp.h" #include "csedu.h" #include "scancode.h" void InitADC(); void wait( unsigned int cycles ); void EnableAPLL( ); unsigned int nADC0[256],nADC1[256]; main() { int i; unsigned int uWork; EnableAPLL(); SDRAM_init(); InitADC(); PLL_Init(132); while ( 1 ) { for ( i=0;i<256;i++ ) { ADCCTL=0x8000; // 启动 AD 转换,通道 0 1000 0000 0000 0000 do { uWork=ADCDATA;//ADC 数据寄存器,首位可判断 ADC 是否转换结束 } while ( uWork&0x8000 );//按位与 nADC0[i]=uWork&0x0fff;//传送数据到通道 0 } for ( i=0;i<256;i++ ) { ADCCTL=0x9000; // 启动 AD 转换,通道 1 1001 0000 0000 0000 do { uWork=ADCDATA; } while ( uWork&0x8000 ); nADC1[i]=uWork&0x0fff; } asm( " nop"); // break point//汇编中的空操作指令 } }

void InitADC()//设定 AD 时钟 { ADCCLKCTL=0x23; // 4MHz ADCLK,ADC 时钟=CPU 时钟/(35+1)=4MHz ADCCLKDIV=0x4f00;//ADC 时钟分频寄存器 0100 1111 0000 0000,决定抽样和保 持周期 } //延时程序 void wait( unsigned int cycles ) { int i; for ( i = 0 ; i < cycles ; i++ ){ } } void EnableAPLL( )//使能时钟发生器 { /* Enusre DPLL 全数字锁相环 is running */ *( ioport volatile unsigned short* )0x1f00 = 4;//ioport //要在程序中访问 IO 空间地址, 必须首先使用 ioport 关键字对访问的地址进行定义 wait( 25 ); *( ioport volatile unsigned short* )0x1f00 = 0; // MULITPLY *( ioport volatile unsigned short* )0x1f00 = 0x3000; // COUNT *( ioport volatile unsigned short* )0x1f00 |= 0x4F8; wait( 25 ); //*( ioport volatile unsigned short* )0x1f00 |= 0x800 // MODE *( ioport volatile unsigned short* )0x1f00 |= 2; wait( 30000 ); // APLL Select *( ioport volatile unsigned short* )0x1e80 = 1; // DELAY wait( 60000 ); } 实验结果为: 6、快速傅立叶变换(FFT)实验 本实验为纯软件仿真实验 FF 即快速傅里叶变换,解决了 DFT 运算量太大,在实际使用中受限制的问题,FFT 算 法分为 DIT 和 DIF 两种。本实验中是按时间采样,即 DIT。 主要程序为(重要语句已作注释) : #include "myapp.h" #include "csedu.h" #include "scancode.h" #include <math.h> #define PI 3.1415926

#define SAMPLENUMBER 128 ///2^7 void InitForFFT(); void MakeWave(); int INPUT[SAMPLENUMBER],DATA[SAMPLENUMBER]; float fWaveR[SAMPLENUMBER],fWaveI[SAMPLENUMBER],w[SAMPLENUMBER]; float sin_tab[SAMPLENUMBER],cos_tab[SAMPLENUMBER]; //主函数 main() { int i; InitForFFT(); MakeWave(); for ( i=0;i<SAMPLENUMBER;i++ ) { fWaveR[i]=INPUT[i];//实部 fWaveI[i]=0.0f;//虚部,加 f 指的是浮点数 w[i]=0.0f; } FFT(fWaveR,fWaveI); for ( i=0;i<SAMPLENUMBER;i++ ) { DATA[i]=w[i]; } while ( 1 ); // 在这里可以设置断点 } void FFT(float dataR[SAMPLENUMBER],float dataI[SAMPLENUMBER]) { int x0,x1,x2,x3,x4,x5,x6,xx; int i,j,k,b,p,L; float TR,TI,temp; /********** 代码转化序列,实现比特反转************/ for ( i=0;i<SAMPLENUMBER;i++ ) { x0=x1=x2=x3=x4=x5=x6=0; x0=i&0x01; x1=(i/2)&0x01; x2=(i/4)&0x01; x3=(i/8)&0x01;x4=(i/16)&0x01; x5=(i/32)&0x01; x6=(i/64)&0x01; xx=x0*64+x1*32+x2*16+x3*8+x4*4+x5*2+x6; dataI[xx]=dataR[i]; }//这里应该是倒序位处理,以便于进行蝶形运算、 for ( i=0;i<SAMPLENUMBER;i++ ) { dataR[i]=dataI[i]; dataI[i]=0; } /************** 按时间抽取的,即 DIT*******************/

for ( L=1;L<=7;L++ ) { /* for(1) */ b=1; i=L-1; while ( i>0 ) { b=b*2; i--; } /* b= 2^(L-1) */ for ( j=0;j<=b-1;j++ ) /* for (2) */ { p=1; i=7-L; while ( i>0 ) /* p=pow(2,7-L)*j; */ { p=p*2; i--; } p=p*j; for ( k=j;k<128;k=k+2*b ) /* for (3) */ { TR=dataR[k]; TI=dataI[k]; temp=dataR[k+b]; dataR[k]=dataR[k]+dataR[k+b]*cos_tab[p]+dataI[k+b]*sin_tab[p]; dataI[k]=dataI[k]-dataR[k+b]*sin_tab[p]+dataI[k+b]*cos_tab[p]; dataR[k+b]=TR-dataR[k+b]*cos_tab[p]-dataI[k+b]*sin_tab[p]; dataI[k+b]=TI+temp*sin_tab[p]-dataI[k+b]*cos_tab[p]; } /* END for (3) 一个蝶形*/ } /* END for (2) */ } /* END for (1) */ for ( i=0;i<SAMPLENUMBER/2;i++ ) { w[i]=sqrt(dataR[i]*dataR[i]+dataI[i]*dataI[i]);//求出模,从而做出频谱 } } /* END FFT */ void InitForFFT()///把离散因子表示出来 { int i; for ( i=0;i<SAMPLENUMBER;i++ ) { sin_tab[i]=sin(PI*2*i/SAMPLENUMBER); cos_tab[i]=cos(PI*2*i/SAMPLENUMBER); } } void MakeWave()//输入,三个周期的正弦波,按照 128 点抽样后的数据 { int i; for ( i=0;i<SAMPLENUMBER;i++ ) {

INPUT[i]=sin(PI*2*i/SAMPLENUMBER*3)*1024; } } 实验现象:如图所示:

上图为时域中 FFT 前图形

上图为时域中 FFT 后图形

上图为频域中 FFT 后的波形(上为幅度,下为相位) 7、串口通信实验

5509A 有 3 个多通道缓冲串口 mcbsp,有 7 个管脚分布在 dsp 的外围针脚上,有 1 个发 送端,1 个接收端,还有接收和发送的时钟信号,帧同步信号,各一对。mcbsp 内部有一个 采样速率发生器, 可以产生时钟和帧同步信号, 这两个信号可用于发送和接收的时钟和帧同 步信号。 要将 McBSP 的配置为 GPIO 模式, 只需配置的寄存器: PCR (引脚控制寄存器) 和 SPCR (串口控制寄存器) ,而 mcbsp 的其他寄存器在 GPIO 配置模式下都不用管 PC 机与 C5509A 串行通信必须遵循起止式异步协议,它的特点是一个字符一个字符传输, 并且传送一个字符总是以起始比特开始,以停止位结束,字符之间没有固定的时间间隔要求。 起始比特位始终为低电平, 1 比特;字符位可以选择 4~8 比特;奇偶校验位可以为无、奇、偶、 空格、标志;停止位为 1、1. 5 或 2 比特。理论上,发送过程和接收过程可选择不同的数据格式 进行通信,但通常我们为了开发程序的简化和通信方便都采用统一的数据格式(如: 1 个起始 位+ 8 个数据位) 。 主要程序为(由于程序过长,在这里只介绍 main 函数,重要语句已作注释) : void main(void) { CSL_init();/*初始化 CSL 库*/ PLL_config(&myConfig); /*设置系统的运行速度为 144MHz*/ hMcbsp = MCBSP_open(MCBSP_PORT1,MCBSP_OPEN_RESET); /*初始化 McBSP1*/ MCBSP_config(hMcbsp,&Mcbsp1Config); /*设置 McBSP1*/ MCBSP_getConfig(hMcbsp,&Mcbsptest);//读里面的内容,可以在 watch window 里查看 settimer();//设定定时器 timer0 //以下程序实现软件 Uart while(TRUE)//while 的作用是查询收发状态 { if(uart_recflag==1) { uart_recflag = 0; if(uart_sendflag==0) { uart_bitsendcnt = 0;//一个比特需要的次数 uart_sendend = 0;//发送结束 uart_sendcnten = 0; uart_bitsend = 0; uart_send = uart_rec; uart_sendflag = 1; uart_sendbitcnt = 0;//发送 bit 位数 } } }; } interrupt void timer0Isr(void)//这个中断中所作的就是先解码再发送出去 { temp = REG_PCR1; //发送

if(uart_sendflag==1) { if(uart_sendcnten==0) { REG_PCR1 &= 0xffdf;//写 PCR 寄存器的第五位,即 DXSTAT 域清零 uart_bitsend = 1; uart_sendcnten = 1; } if(uart_sendcnten==1) { uart_bitsendcnt++; if(uart_bitsendcnt==10) { uart_sendbitcnt++; if(uart_sendend==1) { uart_sendflag = 0; } else { if(uart_sendbitcnt<9) { if((uart_send & uart_bitsend)==0) { REG_PCR1 &= 0xffdf; } else { REG_PCR1 |= 0x0020;//读 PCR 寄存器的第五位 DXSTAT 域置 1 } uart_bitsend <<= 1; } else { REG_PCR1 |= 0x0020; uart_sendflag = 0; } } uart_bitsendcnt = 0; } } } //接收 if((uart_bitcnt==0)&&(uart_recstart==0))

{ if((temp&0x0010)==0)//PCR 引脚上的第四位 DRSTAT { timer0_cnt = 0; timer0_cnten = 1; uart_bitscan = 0; uart_rec = 0; uart_recstart = 1; } } if(timer0_cnten==1) { timer0_cnt++; if((temp&0x0010)!=0) { uart_bitscan++; } if(timer0_cnt==10) { timer0_cnt = 0; if(uart_bitscan>5) { switch(uart_bitcnt) { case 0: uart_rec = 0; timer0_cnten = 0; uart_recstart = 0; break; case 1: uart_bitcnt++; uart_rec |= 0x01; break; case 2: uart_bitcnt++; uart_rec |= 0x02; break; case 3: uart_bitcnt++; uart_rec |= 0x04; break; case 4: uart_bitcnt++; uart_rec |= 0x08; break; case 5: uart_bitcnt++; uart_rec |= 0x10; break; case 6: uart_bitcnt++;

uart_rec |= 0x20; break; case 7: uart_bitcnt++; uart_rec |= 0x40; break; case 8: uart_bitcnt++; uart_rec |= 0x80; break; case 9: uart_bitcnt = 0; timer0_cnten = 0; uart_recflag = 1; uart_recstart = 0; break; default: break; } } else { uart_bitcnt++; if(uart_bitcnt>9) { uart_bitcnt = 0; timer0_cnten = 0; } } uart_bitscan = 0; } } } 实验现象为: 8、网络通信实验 这个实验很难,学生没有看懂例程,将程序 run 了一下,看了效果。 主要程序为(由于程序过长,在这里只介主要程序,重要语句已作注释) : #ifndef _CESECT_ //#ifndef x 先测试 x 是否被宏定义过 #define _CESECT_ #define CESECT1 0x200000 //CE1 空间基地址(16 位) #define CESECT2 0x400000 //CE2 空间基地址(16 位) #define CESECT3 0x600000 //CE3 空间基地址(16 位) #endif Uint16 x; Uint32 y; CSLBool b; Uint16 FrameLenth; Uint16 RxSuccessFlag;

int ms; //------------------Uint16 TxEthnetFrameBuffer[1518/2]; Uint16 RxEthnetFrameBuffer[1518/2]; extern struct ipaddr server_ipaddr;//声明 Uint16 temp; int *souraddr,*deminaddr; Uint16 eventId0; int old_intm; interrupt void int1(void); //---------Function prototypes--------/* Reference start of interrupt vector table */ /* This symbol is defined in file, vectors_IP.s55 */ extern void VECSTART(void); /*锁相环的设置*/ PLL_Config myConfig ={ 0, //IAI: the PLL locks using the same process that was underway //before the idle mode was entered 1, //IOB: If the PLL indicates a break in the phase lock, //it switches to its bypass mode and restarts the PLL phase-locking //sequence 12, //PLL multiply value; multiply 12 times 1 //Divide by 2 PLL divide value; it can be either PLL divide value //(when PLL is enabled), or Bypass-mode divide value //(PLL in bypass mode, if PLL multiply value is set to 1) }; /*EMIF 设置*/ EMIF_Config emiffig = { 0x221, //EGCR : the MEMFREQ = 00,the clock for the memory is equal to cpu frequence // the WPE = 0 ,forbiden the writing posting when we debug the EMIF // the MEMCEN = 1,the memory clock is reflected on the CLKMEM pin // the NOHOLD = 1,HOLD requests are not recognized by the EMIF 0xFFFF, //EMI_RST: any write to this register resets the EMIF state machine 0x3FFF, //CE0_1: CE0 space control register 1 // MTYPE = 011,Synchronous DRAM(SDRAM),16-bit data bus width 0xFFFF, //CE0_2: CE0 space control register 2 0x00FF, //CE0_3: CE0 space control register 3 // TIMEOUT = 0xFF; 0x1FFF, 0xFFFF, 0x00FF, //CE1_1: CE0 space control register 1 //Aynchronous, 16Bit //CE1_2: CE0 space control register 2 //CE1_3: CE0 space control register 3

0x1FFF, 0xFFFF, 0x00FF, 0x1FFF, 0xFFFF, 0x00FF, 0x2911,

//CE2_1: CE0 space control register 1 //Aynchronous, 16Bit //CE2_2: CE0 space control register 2 //CE2_3: CE0 space control register 3 //CE3_1: CE0 space control register 1 //Aynchronous, 16Bit //CE3_2: CE0 space control register 2 //CE3_3: CE0 space control register 3 //SDC1: SDRAM control register 1 // TRC = 8 // SDSIZE = 0;SDWID = 0 // RFEN = 1 // TRCD = 2 // TRP = 2 //SDPER : SDRAM period register // 7ns *4096 //SDINIT: SDRAM initialization register // any write to this register to init the all CE spaces, // do it after hardware reset or power up the C55x device //SDC2: SDRAM control register 2 // SDACC = 0; // TMRD = 01; // TRAS = 0101; // TACTV2ACTV = 0001;

0x0410, 0x07FF,

0x0131

}; //5509A 中断设置,使能 INT1 中断 void INTconfig() { IRQ_setVecs((Uint32)(&VECSTART)); /* Temporarily disable all maskable interrupts */ old_intm = IRQ_globalDisable();/* Temporarily disable all maskable interrupts */ eventId0 = IRQ_EVT_INT1; /* Get Event Id associated with External INT1(8019), for use with */ IRQ_clear(eventId0); /* Clear any pending INT1 interrupts */ IRQ_plug(eventId0,&int1); IRQ_enable(eventId0); /* Enable INT1(8019) interrupt */ IRQ_globalEnable();/* Enable all maskable interrupts */ } main() { CSL_init(); /*初始化 CSL 库*/

CHIP_RSET(XBSR,0x0a01); /*EMIF 为全 EMIF 接口*/ PLL_config(&myConfig); /*设置系统的运行速度为 144MHz*/ EMIF_config(&emiffig); /*初始化 5509A 的 EMIF*/ REGconfig();//设置 8019 寄存器指针 RST8019();//复位 8019 CS8019();//片选(使能)8019 Init8019();//初始化 8019 INTconfig();//设置并使能 5509A 芯片的 INT1 中断(8019 中断) ddelay(100); ArpRequest();//ARP 请求 while(1); } //External INT1(8019)中断,响应 ICMP 数据包 interrupt void int1() { temp = RecFrame(); if(temp) DoNetworkStuff(); page(0); delay(10); deminaddr = (int *)0x200007; *deminaddr = 0x00FF; } 实验现象: 9、LCD 显示实验 液晶显示模块是128× 64 点阵的汉字图形型液晶显示模块,可显示汉字及图形,内置国 标GB2312 码简体中文字库(16X16 点阵)、128 个字符(8X16 点阵)及64X256 点阵 显示RAM(GDRAM)。可与CPU 直接接口,提供两种界面来连接微处理机:8-位并行及 串行两种连接方式。具有多种功能:光标显示、画面移位、睡眠模式等。 主要程序为(由于程序过长,在这里只介绍 main 函数,重要语句已作注释) : /*----------------LCD 忙检测----------------*/ void chk_busy() { unsigned int temp; *addr = 0x00ef; //功能选择寄存器组, ,在存储器空间与存储器映射文档里面 *LCDCOM = 0x0005; //RS=0(comm), RW=1(read), RST=1 这个指针指向 LCD 控制寄存 器,在存储器空间与存储器映射文档里面 temp = 0x0080; //下面的 while 里的语句肯定执行。 。 。 while((temp&0x0080)!=0) { *LCDCOM = 0x000d; //EN=1 *addr = 0x00f7; //数据寄存器使能,控制寄存器关闭 delay(10); temp = *LCDIN; //忙的话,就变成 0x0280 *addr = 0x00ef; //控制寄存器使能,数据寄存器关闭

*LCDCOM = 0x0005; //EN=0 } //不忙的时候,才会执行下面的语句 *addr = 0x00ff; } /*------------------写 LCD------------------*/ void wr_lcd(unsigned char dat_comm, unsigned int content) { chk_busy(); if(dat_comm) { *addr = 0x00ef; *LCDCOM = 0x0003; //RS=1(data), RW=0(write), RST=1 *addr = 0x00d7; *LCDOUT = content; *addr = 0x00cf; *LCDCOM = 0x000b; //EN=1 delay(30); *LCDCOM = 0x0003; //EN=0 *addr = 0x00ff; } else { *addr = 0x00ef; *LCDCOM = 0x0001; //RS=0(命令), RW=0(write), RST=1 *addr = 0x00d7; *LCDOUT = content; *addr = 0x00cf; *LCDCOM = 0x0009; //EN=1 delay(30); *LCDCOM = 0x0001; //EN=0 *addr = 0x00ff; } } /*----------------清 DDRAM------------------*/ void clrram (void) { wr_lcd (comm,0x30); wr_lcd (comm,0x01); } /*------------------初始化-----------------*/ void lcd_init(void) { *addr = 0x00ef; delay(10);

*LCDCOM = 0x0000; //RESET delay(1000); *LCDCOM = 1; //LCD 控制寄存器,解除复位 wr_lcd (comm,0x30); /*30---基本指令动作*/ wr_lcd (comm,0x01); /*清屏,地址指针指向 00H*/ wr_lcd (comm,0x06); /*光标的移动方向*/ wr_lcd (comm,0x0c); /*开显示,关游标*/ } /*---------------欢迎界面------------------*/ void Smenu() { wr_lcd (comm,0x30); wr_lcd (comm,0x90); // 90 表示 0 格 91 表示 1 格 wr_lcd (dat,0xb9); wr_lcd (dat,0xfe); //"哈"。汉字编码在 LCD 资料里面,繁体的那个 wr_lcd (dat,0xb9); wr_lcd (dat,0xa4); //"工" wr_lcd (dat,0xb4); wr_lcd (dat,0xf3); //"大" wr_lcd (dat,0xBB); wr_lcd (dat,0xB6); //"欢" wr_lcd (dat,0xD3); wr_lcd (dat,0xAD); //"迎" wr_lcd (dat,0xC4); wr_lcd (dat,0xFA); //"您" wr_lcd (dat,0xa3); wr_lcd (dat,0xa1); //"!" } main() { CSL_init();/*初始化 CSL 库*/ CHIP_RSET(XBSR,0x0a01); /*EMIF 为全 EMIF 接口*/ PLL_config(&myConfig); /*设置系统的运行速度为 48MHz*/ EMIF_config(&emiffig); /*初始化 DSP 的 EMIF*/ addr = (int *)CESECT2; LCDCOM = (int *)CESECT3; LCDOUT = (int *)CESECT3; LCDIN = (int *)CESECT2; //注意一下,这个数和 addr 中的数是一样的 lcd_init(); clrram(); Smenu(); for(;;); } 实验现象为: 液晶屏上显示字样:哈工大欢迎您!

课程设计总结
在本次课程设计中,遇到了很多的困难,比如对寄存器及宏变量不了解,软件出现不可 预知的问题等等,但是通过查阅相关的教材和文献,以及与同学们之间相互讨论,部分得到 了较好的解决,但仍存在一定的问题,由于可设时间有限,不能尽善尽美,但课程设计要求 的部分已基本完成。

通过本次课程设计,对于 DSP 硬件设计和开发有了一定的认识,自己的编程能力得到 了锻炼,增强了分析问题和解决问题的能力。 参考文献 1, 鸿翔电子 VC5509 开发板相关资料 2, 《TMS320C55x DSP 应用系统设计》赵洪亮等编著,北京航空航天大学出版社。 3, 《TMS320C55xDSP 原理及应用》汪春梅,孙洪波编著,电子工业出版社。


相关文章:
课程设计报告
课程设计报告_工学_高等教育_教育专区。课程设计报告题 目: 语音信号滤波去噪 语音信号滤波去噪 1 课程设计的任务与要求 首先录制一段自己的语音信号,并对录制的...
2014课程设计报告模板
2014课程设计报告模板_工学_高等教育_教育专区。XXXXXXX 机电学院 电子课程设计报告(论文) 题目:多功能电子表设计 专业班级: 电气工程及其自动化 123 姓时名: 间...
课设报告模板
单片机课程设计报告 单片机课程设计报告 系 别: 自动化系 专业班级: 专业班级: 电气工程及其自动化 070X 学生姓名: 学生姓名: 指导教师: 指导教师: 翟晟 (课程...
课程设计报告范文
课程设计报告范文_理学_高等教育_教育专区。课程设计报告 院专课班学姓 系: 业: 程: 级: 号: 名: 城市学院 计算机应用 数据库应用开发 07 计算机应用专 2 ...
课程设计总结报告-
课程设计总结报告-_工学_高等教育_教育专区。课程设计总结报告 课程名称: 学生姓名: 学生学号: 系专别: 业: 电子技术课程设计(一) 周峰 14062500060 物理与电子...
c++课程设计报告书
c++课程设计报告书_理学_高等教育_教育专区。河南城建学院 《面向对象程序设计》课程设计报告书 面向对象程序设计》 设计题目:企业人事管理系统 指导老师:崔雪冰 蔡...
课程设计报告
扬州大学 《数据结构》 课程设计报告 课题名称 姓名学院 系科班级 指导老师 日期 自来水管架设问题 ××× 广陵学院 软件 812 陈宏建 目录一、 课程设计的题目 ...
课程设计报告
课程设计报告_工学_高等教育_教育专区。重庆科技学院 《无线传感器网络》 课程设计报告学 院:_电气与信息工程学院_ 专业班级: 明航 学号: 物联网 1301 ...
课程设计报告格式
课程设计报告格式_工学_高等教育_教育专区。浙江科技学院嵌入式系统 B(EDA 技术与应用) 课程设计报告 课题名称 院、系、部专班姓学业级名号 基于 MAX II 系列...
课程设计报告
2012 专业综合课程设计 II DSP5509 开发板 测试实验 实验报告 班级: 姓名: 学号: DSP5509 开发板是一套功能齐全的基于 TMS320VC5509A DSP 的学习开发平台, ...
更多相关标签:
课程设计报告模板 | c语言课程设计报告 | 课程设计总结 | 网页设计课程体系 | 后期设计培训 | 设计课程 | 课程设计 | 单片机课程设计报告 |