实验一 DSP数据存取实验
实验要求:
1、 到main函数入口地址
2、 修改数据区存储区数据如下表所示
地址 | 0x80000 | 0x80001 | 0x80002 | 0x80003 | 0x80004 | 0x80005 | 0x80006 | 0x80007 |
数据 | 0x0100 | 0x0007 | 0x0100 | 0x0005 | 0x0100 | 0x0003 | 0x0100 | 0x0001 |
3、 单步运行,利用watch window观察程序中地址变量和数据变量
4、 观察从地址0x80000到0x80007的存储内容
操作步骤:
1、 打开Setup CCStudio v3.3 ,系统配置为F2812 Device Simultor
2、 打开CCStudio v3.3,打开工程F2812\DSP281x_examples\Lab0201-Memory\Memory.pjt
3、 在main函数处设断点(F9),运行程序
4、 打开反汇编窗口(View>Disassembly),观察入口地址
5、 修改Memory.c中程序,完成存储区数据修改
6、 编译通过,加载.out 文件
7、 设置在变量定义处设置断点,点击运行(F5),单步运行(F11)
8、 打开观察窗(View>Watch Window)观察自己所设变量在单步运行时变化
9、 打开存储区窗口(View>Memory)观察地址为0x80000到0x80007的数据变化
实验二 指示灯与拨码开关实验
实验要求:
1、 熟悉板上指示灯控制寄存器、开关控制寄存器
2、 指示灯点亮规则:
只闭合拨码开关1:全灭;
只闭合拨码开关2:全亮;
只闭合拨码开关3: 顺序依次点亮;
只闭合拨码开关4:反向顺序依次点亮;
开关的其它状态:全灭;
操作步骤:
1、打开Setup CCStudio v3.3 ,系统配置为F2812 XDS510 Emulator_1
2、打开CCStudio v3.3,打开工程F2812\DSP281x_examples\Lab0201-Memory\led.pjt
3、修改led.c,注意板上DIP开关控制寄存器地址为C0001h,板上指示灯控制寄存器地址为:C0000h。这两个寄存器都是低四位有效。
4、观察实验现象
实验三 DSP定时器
实验要求:
1、 利用定时器中断代替软件延时函数控制指示灯显示频率,要求1秒闪烁一次
2、 实物仿真时,通过CCS中的Clock功能统计延时函数的延时时间,与设定值进行比较
操作步骤:
1、打开Setup CCStudio v3.3 ,系统配置为F2812 XDS510 Emulator_1
2、打开CCStudio v3.3,打开工程F2812\DSP281x_examples\Lab0201-Memory\time.pjt
3、 修改time.c程序,写一个由定时器中断产生的以1s为单位的延时函数void delay(int ti
me);
4、 在菜单中选择profile>Enable\View
5、 在延时函数前后各设置一个断点
6、 清零时钟计数器(双击清零),点击Run运行程序
7、 计算时间t=测得值/150000000(假如系统的时钟工作在150MHZ),与设定值进行比较
实验四 事件管理器实验
实验要求
1、 利用事件管理器中的16路中的PWM1,输出一段连续变化的PWM波
2、 驱动扬声器蜂鸣器播放一段音乐声(声音频率文件参考Speaker.pjt)
操作步骤
1、打开Setup CCStudio v3.3 ,系统配置为F2812 XDS510 Emulator_1
2、打开CCStudio v3.3,打开工程F2812\DSP281x_examples\Lab0201-Memory\PWM.pjt和F2812\DSP281x_examples\Lab0201-Memory\Speaker.pjt
3、在例程Speaker.c中是使用通用定时器TIME0来连续输出频率的方波,这里要求改为用EVA中的PWM1代替之。
4、比较通过普通GPIO口输出和外设PWM口驱动的音乐声的不同。
实验参考程序(已验证运行)
实验一参考程序
main()
{// 在此加软件断点
int i;
unsigned int * pz;
pz=(unsigned int *)0x80000;
for ( i=8;i>0;i--,pz++ )// 在此加软件断点
(*pz)=i;//指针取值
pz=(unsigned int *)0x80000;
for ( i=0;i<4;pz=pz+2,i++ )
(*pz)=0x0100;
while(1)
{
} // 在此加软件断点
}
实验二参考程序
#include "DSP281x_Device.h" // DSP281x Headerfile Include File
#include "DSP281x_Examples.h" // DSP281x Examples Include File
#include "f2812a.h"
#define LBDS (*((unsigned int *)0xc0000))// 定义指示灯寄存器地址和寄存器类型
#define DIPS (*(unsigned int *)0xc0001)// 定义DIP开关寄存器地址和寄存器类型
// 子程序接口
void Delay(unsigned int nDelay); // 延时子程序
main()
{
unsigned int uLED[6]={1,2,4,8,15,0}; // 控制字,逐位置1: 0001B 0010B 0100B 1000B 0000B 1111B LBDS 是4bit的寄存器
int i,j;
InitSysCtrl(); // 初始化DSP运行时钟
while ( 1 )
{
j=DIPS%16;
switch(j)
{
case 1:
LBDS=uLED[5]; // 全灭
break;
case 2:
LBDS=uLED[4]; //全亮
break;
case 4:
for ( i=0;i<4;i++ )
{timeout on t2 timer
LBDS=uLED[i]; // 正向顺序送控制字
Delay(100); // 延时
}
break;
case 8:
for ( i=3;i>=0;i-- )
{
LBDS=uLED[i]; // 反向顺序送控制字
Delay(100); // 延时
}
break;
default:
LBDS=uLED[5];
break;
}
}
}
void Delay(unsigned int nDelay)
{
int ii,jj,kk=0;
for ( ii=0;ii<nDelay;ii++ )
{
for ( jj=0;jj<512;jj++ )
{
kk++;
}
}
}
实验三参考程序
#include "DSP281x_Device.h" // DSP281x Headerfile Include File
#include "DSP281x_Examples.h" // DSP281x Examples Include File
// Prototype statements for functions found within this file.
interrupt void cpu_timer0_is(void);
void delay(int time);
#define LEDS *(int *)0xc0000
int i=0,nCount=0,time;
unsigned int uLBD;
void main(void)
{
InitSysCtrl();//初始化cpu
DINT;//关中断
InitPieCtrl();//初始化pie寄存器
IER = 0x0000;//禁止所有的中断
IFR = 0x0000;
InitPieVectTable();//初始化pie中断向量表
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.TINT0 = &cpu_timer0_is;//指定中断服务子程序,中断向量表就是设置中断服务程序入口地址
EDIS; // This is needed to disable write to EALLOW protected registers
InitCpuTimers();
ConfigCpuTimer(&CpuTimer0,150,1000000);//150MHZ,1000000us
StartCpuTimer0();//启动定时器0
// Enable CPU INT1 which is connected to CPU-Timer 0:
IER |= M_INT1;
// Enable TINT0 in the PIE: Group 1 interrupt 7
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;//定时器TINT0就是INT1.7,使能信号
// Enable global Interrupts and higher priority real-time debug events:
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
LEDS=0x0001;
while ( 1 )
{
delay(2);
LEDS=~LEDS;
}
}
void delay(time)
{
int i;
while(nCount<time);
nCount=0;
}
interrupt void cpu_timer0_is(void)
{
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;//允许继续相应中断
nCount++;
}
//===========================================================================
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论