DSP实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
装订线
实验报告
课程名称:微机原理及其应用指导老师:徐习东成绩:
实验名称:实验一二三综合实验报告实验类型:同组学生姓名:
一、实验目的和要求(必填)二、实验内容和原理(必填)
三、主要仪器设备(必填)四、操作方法和实验步骤
五、实验数据记录和处理六、实验结果与分析(必填)
七、讨论、心得
一、实验目的和要求
1、了解DSP的基本原理和实验过程。
完成实验一、二、三。
完成4段程序的运行过程。
2、了解DSP的编程方法,学习TI资源文件的使用方法,
3、认识中断、GPIO、定时器等的编程使用方法。
二、实验内容和原理
实验一
LED绿灯的控制:
共阳极发光二极管原理图如下
图1 发光二极管原理图
通过GPIO控制发光二极管DS20~DS25的亮灭。
当GPIOFx=0时,对应的发光二极管被点亮。
GPIO端口:
GPIOF13~GPIOF8
实验二
实验名称:DSP实验综合报告姓名:学号:
装订线
利用CPU定时器和中断实现点亮了4盏规定的绿灯,同时控制灯分别以1s,100ms,10ms,1ms为周期交替亮灭。
通过设置CPU定时器,使1ms产生1个中断输出,再通过循环计数控制当分别产生1ms、10ms、100ms、1s的时间间隔进入中断,控制相应LED亮灭。
实验三
分别用两种TI资源的方法编程,实现控制绿灯和红灯的要求。
方法一是仅仅使用TI规定的变量编程,方法二是使用TI
资源的内置文件,初始化文件和.c文件等中的自带函数。
把6盏绿灯及16盏红灯有规律地控制点亮。
红灯的控制:
LED接口如图:
1、一端接电源高电平红灯的控制:
2、一端接锁存器的输出;
3、由两个锁存器控制16盏灯;
两个锁存器:
1、输入数据为
实验名称:DSP实验综合报告姓名:学号:
装订线GPIOB8 ~GPIOB15;
2、锁存信号由GPIOE0 ~GPIOE2 控制;
点灯控制:
1、先确定第几组,第几盏;
2、GPIOE输出组号,GPIOB输出位号;
3、延时,GPIOE输出锁存信号
三、主要仪器设备
TMS实验板、PC机、程序烧写器
四、操作方法和实验步骤
1、实验一
(1)学习DSP的相关内部元件的使用方法。
(2)了解C语言编写DSP程序的方法。
(3)在软件CSS3.3中读懂并改写老师上传的程序,通过对相关的寄存器赋值完成项目的程序编写工作。
(4)学习软件的调试运行方法。
把相关的程序烧写入开发板中,调试,实现原来预想中的功能。
2、实验二
(1)学习CPU定时器的初始化设置及使用;
(2)学会使用CPU中断系统;
(3)设计并编写项目程序;
(4)把相关的程序烧写入开发板中,调试,实现原来预想中的功能。
3实验三
(1)学习红灯LED控制方法;
(2)设计并编写相关程序;
(3)把相关的程序烧写入开发板中,调试,实现原来预想中的功能。
五、实验结果与分析
1、实验一:试验中点亮了一排灯,按老师的所要求的方式闪亮。
实验程序设计:
程序段○1
#define EALLOW asm(" EALLOW")
#define EDIS asm(" EDIS")
实验名称:DSP实验综合报告姓名:学号:
装订线
#define PLLCR*((volatile unsigned int *) 0x7021)
#define PCLKCR*((volatile unsigned int *) 0x701C)
#define HISPCP*((volatile unsigned int *) 0x701A)
#define LOSPCP*((volatile unsigned int *) 0x701B)
#define WDCR*((volatile unsigned int *) 0x7029)
#define SCSR*((volatile unsigned int *) 0x7022)
#define GPFMUX*((volatile unsigned int *) 0x70D4)
#define GPFDIR*((volatile unsigned int *) 0x70D5)
#define GPFDAT*((volatile unsigned int *) 0x70F4)
简单宏定义,将相关寄存器与其地址相关联。
其中#define EALLOW asm(" EALLOW")
#define EDIS asm(" EDIS")表示将汇编指令‘EALLOW’与‘EDIS’进行宏定义,在后面以C语言编写的程序可以直接调用。
程序段○2
void InitPll(void)
{int i;
EALLOW;
PLLCR = 10; //SYSCLK = 外部振荡频率* PLLCR /2
EDIS;
for(i= 0; i< ( (131072/2)/12 ); i++) {;} //延时,使得PLL模块能够完成初始化操作}
void InitPll(void)函数用于锁相环初始化,初始化PLL模块;
如果外部晶振为30MHz,计算得SYSCLK为30MHz*10/2=150MHz。
程序段○3
void InitPeripheralClocks(void)
{EALLOW;
HISPCP = 1;// HISPCLK= SYSCLK * HISPCP /2
LOSPCP = 2;// LOSPCLK= SYSCLK * LOSPCP /2
PCLKCR = 0x909;// 开启部分外设
EDIS;
}
void InitPeripheralClocks(void)函数用于初始化外设时钟。
设置高速外设时钟预定表寄存器HISPCP和HSPCLK,使高速外设时钟频率=SYSCLK/(HSPCLK*2)=150MHz/2=75MHz;
设置低速外设时钟预定表寄存器LOSPCP的LSPCLK,使低速外设时钟频率=SYSCLK/(LSPCLK*2)=150MHz/4=37.5MHz;
向PCLKCR写入0x909,用来使能EV A,ADC,SPI,SCIB 等外设时钟。
实验名称:DSP实验综合报告姓名:学号:
装订线程序段○4
void DisableDog(void)
{EALLOW;
WDCR = 0x0068; //关闭看门狗;;
EDIS;
}
void DisableDog(void)该函数用于关闭看门狗;
设置看门狗控制寄存器WDCR的WDDIS(位6)为1屏蔽看门狗模块。
程序段○5
void InitSysCtrl(void)
{
DisableDog();
InitPll();
InitPeripheralClocks();
}
void InitSysCtrl(void)函数用来初始化系统控制;
包括关闭看门狗,设置初始化始终频率,初始化外设时钟频率。
程序段○6
void InitGpiof(void)
{EALLOW;
GPFMUX =0x0000;
GPFDIR =0xFF00;
EDIS;
}
void InitGpiof(void)函数用来初始化GPIO口;
设置模式寄存器GPFMUX的相关位为0,使GPIOF引脚配置为通用数字I/O模式;
设置方向寄存器GPFMUX的相关位为1,使引脚配置为输出。
程序段○7
void main(void)
{long int i;
InitSysCtrl();
InitGpiof()
for(;;)
{GPFDAT = 0x5678;
实验名称:DSP实验综合报告姓名:学号:
装订线
for(i= 0; i< 500000; i++) {;}
GPFDAT = 0x1234;
for(i= 0; i< 500000; i++) {;}
}
}//主函数点亮部分绿灯
void main(void)函数为实验主函数;
通过设置数据寄存器GPFDA T的值,控制相应输出口对应的绿灯亮灭。
2、实验二
点亮4盏规定的灯,同时实现灯分别以1s,100ms,10ms,1ms为周期交替亮灭。
实验程序设计:
程序段○1
void InitPll(void)
{ int i;
EALLOW;
PLLCR = 10;//SYSCLK = 外部振荡频率* PLLCR /2
EDIS;
for(i= 0; i< ( (131072/2)/12 ); i++) {;}
}
void InitPll(void)函数用于锁相环初始化,初始化PLL模块;
如果外部晶振为30MHz,计算得SYSCLK为30MHz*10/2=150MHz。
程序段○2
void InitPeripheralClocks(void)
{ EALLOW;
HISPCP = 1; // HISPCLK= SYSCLK * HISPCP /2
LOSPCP = 2; // LOSPCLK= SYSCLK * LOSPCP /2
PCLKCR = 0x909;// 开启部分外设
EDIS;
}
void InitPeripheralClocks(void)函数用于初始化外设时钟;
设置高速外设时钟预定表寄存器HISPCP和HSPCLK,使高速外设时钟频率=SYSCLK/(HSPCLK*2)=150MHz/2=75MHz;
设置低速外设时钟预定表寄存器LOSPCP的LSPCLK,使低速外设时钟频率=SYSCLK/(LSPCLK*2)=150MHz/4=37.5MHz;
向PCLKCR写入0x909,用来使能EV A,ADC,SPI,SCIB 等外设时钟。
实验名称:DSP实验综合报告姓名:学号:
装订线程序段○3
void DisableDog(void)
{ EALLOW;
WDCR = 0x0068; //关闭看门狗;;
EDIS;
}
void DisableDog(void)该函数用于关闭看门狗;
设置看门狗控制寄存器WDCR的WDDIS(位6)为1屏蔽看门狗模块。
程序段○4
void InitSysCtrl(void)
{
DisableDog();
InitPll();
InitPeripheralClocks();
}
void InitSysCtrl(void)函数用来初始化系统控制;
包括关闭看门狗,设置初始化始终频率,初始化外设时钟频率。
程序段○5
void InitGpiof(void)
{ EALLOW;
GPFMUX =0x0000;
GPFDIR =0xFF00;
EDIS;
}
void InitGpiof(void)函数用于GPIO初始化;
设置模式寄存器GPFMUX的相关位为0,使GPIOF引脚配置为通用数字I/O模式;
设置方向寄存器GPFMUX的相关位为1,使引脚配置为输出。
程序段○6
void InitCputimer(void)
{ EALLOW;
TIMER0TPR=149;
TIMER0TPRH=0;
TIMER0PRD=999999;
TIMER0TCR=0xf000;
EDIS;
实验名称:DSP实验综合报告姓名:学号:
装订线
}
void InitCputimer(void)函数用于初始化CPU定时器;
设定CPU定时器的频率,预定标寄存器写入149,将系统时钟分频为1MHz,TIMER0TPRD写入99999 时钟周期值为1s;
TIMER0TCR的14,15位置位,清除中断标志位、中断使能。
程序段○7
typedef interrupt void(*PINT)(void);
interrupt void INT_1_7(void);
void InitPIE(void)
{ EALLOW;
PIEIFR1=0x0000;
PIEIER1=0x0040;
PIECTRL=0x1;
PIEACK =0x1;
EDIS;
}
void InitPIE(void)函数用于初始化PIE控制器;
清零PIEIFR寄存器和PIERER寄存器,使能PIE中断向量表,清零中断标志位
程序段○8
int k;
void main(void)
{ InitSysCtrl();
InitGpiof();
InitCputimer();
InitPIE();
EALLOW;
* (PINT *) 0x0D4C = & INT_1_7;
asm(" and IFR,#00H");
asm(" or IER,#01H");
asm(" EINT");
LPMCR0=0x0;
EDIS;
k=0;
for(;;){asm(" IDLE");};
}
void main(void)函数用于初始化系统控制、GPIO、CPU定时器、PIE中断控制器。
清除PIEIER和PIEIFR
实验名称:DSP实验综合报告姓名:学号:
装订线没有产生中断的情况下,系统运行在低功耗模式。
程序段○9
interrupt void INT_1_7(void) //中断函数
{ k+=1;
a+=1;
b+=1;
c+=1; //使用四个变量
if(k==100)
{k=0;GPFDAT=GPFDAT|0X2000;}
else if(k==50)
{GPFDAT=GPFDAT&0XDFFF;}
if(a==20)
{a=0;GPFDAT=GPFDAT|0X1000;}
else if(a==10)
{GPFDAT=GPFDAT&0XEFFF;}
if(b==200)
{b=0;GPFDAT=GPFDAT|0X0800;}
else if(b==100)
{GPFDAT=GPFDAT&0XF7FF;}
if(c==2000)
{c=0;GPFDAT=GPFDAT|4000;}
else if(c==1000)
{GPFDAT=GPFDAT&0XFBFF;}
PIEACK=0x1;
TIMER0TCR=0xf000;
}
interrupt void INT_1_7(void)中断函数采用四个变量和if语句结合,利用位与实现绿灯不同频率的亮灭。
实验现象:
观察到目标板上的四个led绿灯亮起来,其中两个看不出有闪动,一个能观察到微弱的闪动,一个约每秒闪动一次,明亮程度依次递减。
3、实验三
实验名称:DSP实验综合报告姓名:学号:
装订线
(1)实现规定的功能点亮预定实现的红灯和绿灯。
实现对6盏绿灯和16盏红灯的控制。
实验程序设计:
程序段○1
#include "DSP281x_Device.h" // DSP281x头文件
void LedOut(Uint16 led);
void IOinit() //I/O口初始化
{
EALLOW;
GpioMuxRegs.GPBMUX.all = GpioMuxRegs.GPBMUX.all&0x00ff;
GpioMuxRegs.GPBDIR.all = GpioMuxRegs.GPBDIR.all|0xff00;
GpioMuxRegs.GPEMUX.all = GpioMuxRegs.GPEMUX.all&0xfff8;
GpioMuxRegs.GPEDIR.all = GpioMuxRegs.GPEDIR.all|0x0007;
EDIS;
}
void IOinit()函数用于GPIO口初始化;
将GPIOB8~GPIOB15配置为一般I/O口,D0~D7;
将GPIOB8~GPIOB15配置为输出,D0~D7;
将GPIOE0~GPIOE2配置为一般I/O口输出,作138译码。
程序段○2
void InitPll(void)
{ int i;
EALLOW;
SysCtrlRegs.PLLCR.bit.DIV = 10;//SYSCLK = 外部振荡频率* PLLCR /2
EDIS;
for(i= 0; i< ( (131072/2)/12 ); i++) {;}
}
void InitPll(void)函数用于锁相环初始化,初始化PLL模块;
如果外部晶振为30MHz,计算得SYSCLK为30MHz*10/2=150MHz。
程序段○3
void InitPeripheralClocks(void)
{ EALLOW;
SysCtrlRegs.HISPCP.all = 1; // HISPCLK= SYSCLK /HISPCP *2
SysCtrlRegs.LOSPCP.all = 2; // LOSPCLK= SYSCLK / LOSPCP *2
SysCtrlRegs.PCLKCR.all = 0;// 开启部分外设
EDIS;
}
实验名称:DSP实验综合报告姓名:学号:
装订线
设置高速外设时钟预定表寄存器HISPCP和HSPCLK,使高速外设时钟频率=SYSCLK/(HSPCLK*2)=150MHz/2=75MHz;
设置低速外设时钟预定表寄存器LOSPCP的LSPCLK,使低速外设时钟频率=SYSCLK/(LSPCLK*2)=150MHz/4=37.5MHz;
向PCLKCR写入0x909,用来使能EV A,ADC,SPI,SCIB 等外设时钟。
程序段○4
void DisableDog(void)
{ EALLOW;
SysCtrlRegs.WDCR = 0x0068; //关闭看门狗;;
EDIS;
}
void DisableDog(void)该函数用于关闭看门狗;
设置看门狗控制寄存器WDCR的WDDIS(位6)为1屏蔽看门狗模块。
程序段○5
void InitSysCtrl(void)
{
DisableDog();
InitPll();
InitPeripheralClocks();
}
void InitSysCtrl(void)函数用来初始化系统控制;
包括关闭看门狗,设置初始化始终频率,初始化外设时钟频率。
程序段○6
void InitCputimer(void)
{ EALLOW;
CpuTimer0Regs.TPR.all = 149;
CpuTimer0Regs.TPRH.all= 0;
CpuTimer0Regs.PRD.all = 999;
CpuTimer0Regs.TCR.all =0xf000;
EDIS;
}
void InitCputimer(void)函数用于初始化CPU定时器;
设定CPU定时器的频率,预定标寄存器写入149,将系统时钟分频为1MHz,TIMER0TPRD写入99999 时钟周期值为1s;
TIMER0TCR的14,15位置位,清除中断标志位、中断使能。
实验名称:DSP实验综合报告姓名:学号:
装订线程序段○7
interrupt void INT_1_7(void);
void InitPIE(void)
{ EALLOW;
PieCtrlRegs.PIEIFR1.all=0x0000;
PieCtrlRegs.PIEIER1.all=0x0040;
PieCtrlRegs.PIECRTL.bit.ENPIE=0x1;
PieCtrlRegs.PIEACK.all =0x1;
EDIS;
}
void InitPIE(void)函数用于初始化PIE控制器;
清零PIEIFR寄存器和PIERER寄存器,使能PIE中断向量表,清零中断标志位
程序段○8
void main(void)
{ InitSysCtrl();
IOinit();
InitCputimer();
InitPIE();
EALLOW;
PieVectTable.TINT0= & INT_1_7;//
asm(" and IFR,#00H");
asm(" or IER,#01H");
asm(" EINT");
SysCtrlRegs.LPMCR0.all=0x0;
EDIS;
for(;;){asm(" IDLE");};
}
void main(void)为程序主函数。
扩展内容:
定义变量无符号整形变量led,写入组号。
程序段
unsigned int led;
interrupt void INT_1_7(void)
{led=0x0014;
实验名称:DSP实验综合报告姓名:学号:
装订线
LedOut(led);
}
void LedOut(Uint16 led)
{
Uint16 i;
EALLOW;
//将GPIOB8~GPIOB15配置为输出,D0~D7
GpioMuxRegs.GPBDIR.all = GpioMuxRegs.GPBDIR.all|0xff00;
EDIS;
GpioDataRegs.GPEDAT.all = 0xfffb; //LEDB选通
GpioDataRegs.GPBDAT.all = ~led; //显示高8位
for (i=0; i<100; i++){} //延时
GpioDataRegs.GPEDAT.all = 0xffff; //锁存高8位
GpioDataRegs.GPEDAT.all = 0xfffa; //LEDA选通
GpioDataRegs.GPBDAT.all = ~(led<<8);//显示低8位
for (i=0; i<100; i++){}
GpioDataRegs.GPEDAT.all = 0xffff; //锁存低8位
}
实验现象:
第5个红灯和第3个红灯被点亮。
(2)将红灯按规则点亮:2ms亮一次,七次为一个周期。
程序段○1
void InitCputimer(void)
{ EALLOW;
CpuTimer0Regs.TPR.all = 149;
CpuTimer0Regs.TPRH.all= 0;
CpuTimer0Regs.PRD.all = 999;
CpuTimer0Regs.TCR.all =0xf000;
EDIS;
}
初始化PLL模块中外部晶振为30MHz,计算得SYSCLK为30MHz*10/2=150MHz,预定标寄存器写入149,将系统时钟分频为1MHz,TIMER0TPRD写入999,时钟周期值为1ms。
TIMER0TCR的14,15位置位,清除中断标志位、中断使能。
程序段○2
实验名称:DSP实验综合报告姓名:学号:
装订线
中断函数程序:
interrupt void INT_1_7(void)
{k++;
if(k%14==0) {led=0x0000;LedOut(led);}
if(k%14==1){led=0xfefe; LedOut(led);}
if(k%14==2){led=0x0000;LedOut(led);}
if(k%14==3){led=0xfcfc; LedOut(led);}
if(k%14==4){led=0x0000;LedOut(led);}
if(k%14==5){led=0xf8f8;LedOut(led);}
if(k%14==6){led=0x0000; LedOut(led);}
if(k%14==7){led=0xf0f0;LedOut(led);}
if(k%14==8){led=0x0000; LedOut(led);}
if(k%14==9){led=0xe0e0; LedOut(led);}
if(k%14==10){led=0x0000; LedOut(led);}
if(k%14==11){led=0xc0c0; LedOut(led);}
if(k%14==12){led=0x0000; LedOut(led);}
if(k%14==13){led=0x8080; LedOut(led);}
PieCtrlRegs.PIEACK.all =0x1;
CpuTimer0Regs.TCR.all =0xf000;}
根据led位置和显示情况将对应的十六进制值赋给led变量,通过if语句实现预期功能。
程序段○3
void LedOut(Uint16 led)
{
Uint16 i;
EALLOW;
GpioMuxRegs.GPBDIR.all = GpioMuxRegs.GPBDIR.all|0xff00;
EDIS;
GpioDataRegs.GPEDAT.all = 0xfffb;
GpioDataRegs.GPBDAT.all = ~led;
for (i=0; i<100; i++){}
GpioDataRegs.GPEDAT.all = 0xffff;
GpioDataRegs.GPEDAT.all = 0xfffa;
GpioDataRegs.GPBDAT.all = ~(led<<8);
for (i=0; i<100; i++){}
GpioDataRegs.GPEDAT.all = 0xffff; }
实验名称:DSP实验综合报告姓名:学号:
装订线六、讨论、心得与感想
1、4次程序实验的运行原理与区别联系。
实验一是仅仅利用了2个文件(主函数和一般性C语言非外设的连接文件)就实现了对GPIO的控制,同时没有使用TI定义的结构体进行对寄存器的操作。
变量指针地址全部都是自己申明的。
函数也全部都是自己自定义的。
这样操作的化简单明了,不用纠结于文件之间的关系。
但是这种编程方法不适合大规模编程,同时对寄存器的操作也比较复杂,可读性差。
所以只能当是入门级别的编程方法。
在以后的实验中我们大可以通过引用调用TI提供的资源文件简化编程的进程和自己编写的代码量,省略很多不必要的步骤,同时引用统一的函数和变量能大大提高可读性和移植性,提高编写大型项目程序的简洁性和难度。
实验二也是和实验一一样仅仅使用两个文件实现的项目,在这次的实验中我们通过对提供源码的修改,了解学习的中断函数的编程步骤和运行过程,复习了之前学过的定时器的使用方法。
这种方法如上所述是入门级别的编写方法。
也是可以通过引用TI的相关的资源文件实现对中断向量表的控制,和中断向量的定义等等功能,实现中断函数编程的标准化。
实验三是利用了了TI 的头文件,不再去申明变量地址指针,变量按TI 要求书写。
另外,利用了寄存器连接命令文件,全局变量说明文件。
所以主函数中省略了变量地址指针的定义。
之所以能省略指针变量的定义是因为在项目中包含了头文件device.h中引用了大量相关资源的头文件如:DSP281X_Gpio.h等。
然后在在这些文件中已经定义好了很多的寄存器结构联合体,这些结构联合体的内部元素寄存器指针已经定义好了赋值为相应的地址。
关于DSP281x_GlobalVariableDefs.c和DSP281x_Headers_nonBIOS.cmd这两个文件的功能感想分析在后面有说。
实验三的第二种实现方法是利用了TI 的头文件及初始化程序。
部分函数可以省去。
在led_InitPll.c文件中注析了函数InitPll(void)、InitPeripheralClocks(void)、DisableDog(void)、InitSysCtrl(void)等等函数。
这是因为在TI资源文件中DSP281x_GlobalPrototypes.h中让相关的函数全局化定义了,同时还包含了一些TI的初始化程序文件如DSP281X_Gpio.c、DSP281X_SysCrl文件等。
让主函数可以轻松调用相关的函数。
同时值得注意的是项目中包含了DSP281x_GlobalVariableDefs.c这个文件,简而言之,这个文件是用来对.h文件中定义的结构联合体进行在块(section)中分配地址空间的,一旦使用了TI定义的结构联合体控制寄存器就必须使用这个.c文件。
还有实验三的两种实现方案中出现了DSP281x_Headers_nonBIOS.cmd这个连接命令文件,根据我个人对这个文件内容的解读,我认为DSP281x_GlobalVariableDefs.c中建立了结构联合体实例与XXXFile的联系,而这个连接命令文件就建立了XXXFile(section块)与相应功能的存储空间之间的联系或者说与开发板的存储空间之间的地址映射。
同时也可以省略了地址指针变量的定义。
2、实验过程中遇到的问题及解决方案
(1)实验一和实验二较容易,只要做好相应GPIO口初始化和CPU定时器的初始化,并且赋值正确就可以比较顺利地完成试验。
实验名称:DSP实验综合报告姓名:学号:
装订线
(2)实验三思路与程序设计难度不大,但在调试过程中遇到了比较大的问题,编译通过后下载到TMS 实验板上运行时出现错误,分析并请教老师后得知,原因是程序编译下载操作有误,应当在编写或修改程序后进行“Reset CPU”操作后重新装载再下载并运行。
(3)除了操作问题外,编写程序时也遇到了一些问题。
在设计实验三的程序时,在中断函数中加入了for循环,导致程序下载后运行出现问题,在助教老师的指导讲解下明白了在中断函数中不应加入循环,原因是中断函数本身就是循环。