DSP实验报告Word格式.docx
《DSP实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《DSP实验报告Word格式.docx(16页珍藏版)》请在冰点文库上搜索。
3、认识中断、GPIO、定时器等的编程使用方法。
二、实验内容和原理
实验一
LED绿灯的控制:
共阳极发光二极管原理图如下
图1发光二极管原理图
通过GPIO控制发光二极管DS20~DS25的亮灭。
当GPIOFx=0时,对应的发光二极管被点亮。
GPIO端口:
GPIOF13~GPIOF8
实验二
利用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、输入数据为
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、实验一:
试验中点亮了一排灯,按老师的所要求的方式闪亮。
实验程序设计:
程序段
#defineEALLOWasm("
EALLOW"
)
#defineEDISasm("
EDIS"
#definePLLCR *((volatileunsignedint*)0x7021)
#definePCLKCR *((volatileunsignedint*)0x701C)
#defineHISPCP *((volatileunsignedint*)0x701A)
#defineLOSPCP *((volatileunsignedint*)0x701B)
#defineWDCR *((volatileunsignedint*)0x7029)
#defineSCSR *((volatileunsignedint*)0x7022)
#defineGPFMUX *((volatileunsignedint*)0x70D4)
#defineGPFDIR *((volatileunsignedint*)0x70D5)
#defineGPFDAT *((volatileunsignedint*)0x70F4)
简单宏定义,将相关寄存器与其地址相关联。
其中#defineEALLOWasm("
#defineEDISasm("
)表示将汇编指令‘EALLOW’与‘EDIS’进行宏定义,在后面以C语言编写的程序可以直接调用。
voidInitPll(void)
{ inti;
EALLOW;
PLLCR=10;
//SYSCLK=外部振荡频率*PLLCR/2
EDIS;
for(i=0;
i<
((131072/2)/12);
i++){;
}//延时,使得PLL模块能够完成初始化操作
}
voidInitPll(void)函数用于锁相环初始化,初始化PLL模块;
如果外部晶振为30MHz,计算得SYSCLK为30MHz*10/2=150MHz。
voidInitPeripheralClocks(void)
{ EALLOW;
HISPCP=1;
//HISPCLK=SYSCLK*HISPCP/2
LOSPCP=2;
//LOSPCLK=SYSCLK*LOSPCP/2
PCLKCR=0x909;
//开启部分外设
}
voidInitPeripheralClocks(void)函数用于初始化外设时钟。
设置高速外设时钟预定表寄存器HISPCP和HSPCLK,使高速外设时钟频率=SYSCLK/(HSPCLK*2)=150MHz/2=75MHz;
设置低速外设时钟预定表寄存器LOSPCP的LSPCLK,使低速外设时钟频率=SYSCLK/(LSPCLK*2)=150MHz/4=37.5MHz;
向PCLKCR写入0x909,用来使能EVA,ADC,SPI,SCIB等外设时钟。
voidDisableDog(void)
WDCR=0x0068;
//关闭看门狗;
;
voidDisableDog(void)该函数用于关闭看门狗;
设置看门狗控制寄存器WDCR的WDDIS(位6)为1屏蔽看门狗模块。
voidInitSysCtrl(void)
{
DisableDog();
InitPll();
InitPeripheralClocks();
voidInitSysCtrl(void)函数用来初始化系统控制;
包括关闭看门狗,设置初始化始终频率,初始化外设时钟频率。
voidInitGpiof(void)
GPFMUX=0x0000;
GPFDIR=0xFF00;
voidInitGpiof(void)函数用来初始化GPIO口;
设置模式寄存器GPFMUX的相关位为0,使GPIOF引脚配置为通用数字I/O模式;
设置方向寄存器GPFMUX的相关位为1,使引脚配置为输出。
voidmain(void)
{ longinti;
InitSysCtrl();
InitGpiof()
for(;
;
{GPFDAT=0x5678;
for(i=0;
500000;
GPFDAT=0x1234;
}
}//主函数点亮部分绿灯
voidmain(void)函数为实验主函数;
通过设置数据寄存器GPFDAT的值,控制相应输出口对应的绿灯亮灭。
点亮4盏规定的灯,同时实现灯分别以1s,100ms,10ms,1ms为周期交替亮灭。
实验程序设计:
程序段
voidInitPll(void)
EALLOW;
//SYSCLK=外部振荡频率*PLLCR/2
HISPCP=1;
voidInitPeripheralClocks(void)函数用于初始化外设时钟;
voidInitGpiof(void)函数用于GPIO初始化;
voidInitCputimer(void)
TIMER0TPR=149;
TIMER0TPRH=0;
TIMER0PRD=999999;
TIMER0TCR=0xf000;
voidInitCputimer(void)函数用于初始化CPU定时器;
设定CPU定时器的频率,预定标寄存器写入149,将系统时钟分频为1MHz,TIMER0TPRD写入99999
时钟周期值为1s;
TIMER0TCR的14,15位置位,清除中断标志位、中断使能。
typedefinterruptvoid(*PINT)(void);
interruptvoidINT_1_7(void);
voidInitPIE(void)
PIEIFR1=0x0000;
PIEIER1=0x0040;
PIECTRL=0x1;
PIEACK=0x1;
voidInitPIE(void)函数用于初始化PIE控制器;
清零PIEIFR寄存器和PIERER寄存器,使能PIE中断向量表,清零中断标志位
intk;
{ InitSysCtrl();
InitGpiof();
InitCputimer();
InitPIE();
*(PINT*)0x0D4C=&
INT_1_7;
asm("
andIFR,#00H"
);
orIER,#01H"
EINT"
LPMCR0=0x0;
k=0;
){asm("
IDLE"
};
voidmain(void)函数用于初始化系统控制、GPIO、CPU定时器、PIE中断控制器。
清除PIEIER和PIEIFR
没有产生中断的情况下,系统运行在低功耗模式。
interruptvoidINT_1_7(void)//中断函数
{k+=1;
a+=1;
b+=1;
c+=1;
//使用四个变量
if(k==100)
{k=0;
GPFDAT=GPFDAT|0X2000;
elseif(k==50)
{GPFDAT=GPFDAT&
0XDFFF;
if(a==20)
{a=0;
GPFDAT=GPFDAT|0X1000;
elseif(a==10)
0XEFFF;
if(b==200)
{b=0;
GPFDAT=GPFDAT|0X0800;
elseif(b==100)
0XF7FF;
if(c==2000)
{c=0;
GPFDAT=GPFDAT|4000;
elseif(c==1000)
0XFBFF;
PIEACK=0x1;
TIMER0TCR=0xf000;
interruptvoidINT_1_7(void)中断函数采用四个变量和if语句结合,利用位与实现绿灯不同频率的亮灭。
实验现象:
观察到目标板上的四个led绿灯亮起来,其中两个看不出有闪动,一个能观察到微弱的闪动,一个约每秒闪动一次,明亮程度依次递减。
3、实验三
(1)实现规定的功能点亮预定实现的红灯和绿灯。
实现对6盏绿灯和16盏红灯的控制。
#include"
DSP281x_Device.h"
//DSP281x头文件
voidLedOut(Uint16led);
voidIOinit()//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;
voidIOinit()函数用于GPIO口初始化;
将GPIOB8~GPIOB15配置为一般I/O口,D0~D7;
将GPIOB8~GPIOB15配置为输出,D0~D7;
将GPIOE0~GPIOE2配置为一般I/O口输出,作138译码。
程序段
SysCtrlRegs.PLLCR.bit.DIV=10;
SysCtrlRegs.HISPCP.all=1;
//HISPCLK=SYSCLK/HISPCP*2
SysCtrlRegs.LOSPCP.all=2;
//LOSPCLK=SYSCLK/LOSPCP*2
SysCtrlRegs.PCLKCR.all=0;
SysCtrlRegs.WDCR=0x0068;
CpuTimer0Regs.TPR.all=149;
CpuTimer0Regs.TPRH.all=0;
CpuTimer0Regs.PRD.all=999;
CpuTimer0Regs.TCR.all=0xf000;
PieCtrlRegs.PIEIFR1.all=0x0000;
PieCtrlRegs.PIEIER1.all=0x0040;
PieCtrlRegs.PIECRTL.bit.ENPIE=0x1;
PieCtrlRegs.PIEACK.all=0x1;
{ InitSysCtrl();
IOinit();
PieVectTable.TINT0=&
//
SysCtrlRegs.LPMCR0.all=0x0;
voidmain(void)为程序主函数。
扩展内容:
定义变量无符号整形变量led,写入组号。
unsignedintled;
interruptvoidINT_1_7(void)
{led=0x0014;
LedOut(led);
voidLedOut(Uint16led)
Uint16 i;
//将GPIOB8~GPIOB15配置为输出,D0~D7
GpioDataRegs.GPEDAT.all=0xfffb;
//LEDB选通
GpioDataRegs.GPBDAT.all=~led;
//显示高8位
for(i=0;
100;
i++){}//延时
GpioDataRegs.GPEDAT.all=0xffff;
//锁存高8位
GpioDataRegs.GPEDAT.all=0xfffa;
//LEDA选通
GpioDataRegs.GPBDAT.all=~(led<
<
8);
//显示低8位
i++){}
//锁存低8位
第5个红灯和第3个红灯被点亮。
(2)将红灯按规则点亮:
2ms亮一次,七次为一个周期。
初始化PLL模块中外部晶振为30MHz,计算得SYSCLK为30MHz*10/2=150MHz,预定标寄存器写
入149,将系统时钟分频为1MHz,TIMER0TPRD写入99