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
#include
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(\输出*/
//WDTIM_service(); /*当超时后,WDFLAG会置1,使能看门狗将超时时间的WDFLAG位清零*/ } //结束循环 #endif }
实验现象:
2、LED跑马灯实验
GPIO (通用输入/输出)或总线扩展器利用工业标准I2C、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
/*锁相环的设置*/
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
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灯先都同时亮灭两次之后,再循环闪烁
3、CPU Timer定时器实验
C55x芯片内斗提供了两个通用寄存器,可向CPU产生周期性中断或向DSP芯片外的器件提供周期信号,TMS320VC5509提供的是2个20位的通用寄存器,每个通用寄存器都由2部分组成:一个4位的预定标寄存器(PSC)和一个16位的主计数器(TIM)。
定时器有两个计数寄存器和两个周期寄存器,在定时器初始化或定时值重新装入的过程中,周期寄存器的内容将复制到计数寄存器中。
主要程序为(重要语句已作注释): #include
/* 本程序中使用预定义的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库的初始化,这是必需的*/