DSP实验
在打开实验箱电源的前提下: 1、 打开CCSStudio3.3
2、 选择debug,选择connect,如果在左下角显示connecting,表示与仿真器连接正常。 实验一、存储器实验。
该实验不用改变硬件,实验内容为在数据存储器的指定地址写上特定数据如0xAAAA,然后将该数据搬移到其他位置。 源程序:(example_dsp281x_mem.c) void main(void) {
int i;
volatile unsigned int *room = (volatile unsigned int *)0x3f9020; volatile unsigned int *room2= (volatile unsigned int *)0x3f902F; 建立可变数据类型的两个指针,指向两个地址。
// Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks InitSysCtrl();
对看门狗,系统等进行初始化 // Disable CPU interrupts DINT; 禁止中断
// Disable CPU interrupts and clear all CPU interrupt flags: IER = 0x0000; 禁止中断
IFR = 0x0000; 清所有中断标记。
/*将0xAAAA写入从数据空间的地址0x3f9020开始的8个单元中*/ for(i=0;i<8;i++) {
*room=0xAAAA;
room指针的地址内填上0xAAAA room++; }
/*从0x3f9020开始的8个空间读出数据依次写入从0x3f9028开始的8个单元中*/
for(i=0;i<8;i++) {
*room2=*(room-1);
将room指针减一,然后将其内容填到room2指针的地址内。 room--; room2--; }
}
InitSysCtrl()函数,在DSP281x_SysCtrl.c中定义。
其定义如下:
void InitSysCtrl(void) {
// On F2812/F2810 TMX samples prior to rev C this initialization was // required. For Rev C and after this is no longer required // Disable the watchdog DisableDog();
// Initialize the PLLCR to 0xA InitPll(0xa);
// Initialize the peripheral clocks InitPeripheralClocks(); }
以上程序完成关看门狗,初始化时钟,初始化外设时钟。(外设时钟是片内外设的时钟,分高速和低速)
——————————————————————————————————————— 其中
void InitPeripheralClocks(void) {
EALLOW;
// HISPCP/LOSPCP prescale register settings, normally it will be set to default values SysCtrlRegs.HISPCP.all = 0x0001; SysCtrlRegs.LOSPCP.all = 0x0002;
// Peripheral clock enables set for the selected peripherals. SysCtrlRegs.PCLKCR.bit.EVAENCLK=1; SysCtrlRegs.PCLKCR.bit.EVBENCLK=1; SysCtrlRegs.PCLKCR.bit.SCIAENCLK=1; SysCtrlRegs.PCLKCR.bit.SCIBENCLK=1; SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=1; SysCtrlRegs.PCLKCR.bit.SPIENCLK=1; SysCtrlRegs.PCLKCR.bit.ECANENCLK=1; SysCtrlRegs.PCLKCR.bit.ADCENCLK=1; EDIS; }
以上程序完成外设时钟的设置,寄存器的含义见教材或参考书,其中EALLOW表示开保护,EDIS为启动保护,这些是在寄存器操作时必须的。其中:SysCtrlRegs是一个结构体,PCLKCR是一个结构体,bit和All是一个联合体。
—————————————————————————————————————— void InitPll(Uint16 val) {
volatile Uint16 iVol;
if (SysCtrlRegs.PLLCR.bit.DIV != val) {
EALLOW;
SysCtrlRegs.PLLCR.bit.DIV = val; EDIS;
设置PLL时钟,在此后Cpu等待PLL锁死,在PLL没有锁死前,CPU将工作在晶振时钟的0.5倍。当PLL稳定后,CPU才工作于新频率。软件可以再PLL锁死前继续运行。但如果对运行时间要求严的话,可以在此加上等待。在锁相环稳定前,看门狗是不工作的。
DisableDog();
for(iVol= 0; iVol< ( (131072/2)/12 ); iVol++) { } 等待。 } }
观看实验结果方法:
1、 在CCS环境中,进行编译,选择project中的build。如果没有错,进行下一步。 2、 在file中选择load program。在文件的目录下寻找对应得 .Out文件。 3、 在view中选择memory。选择数据,在对话框中输入0x3f9010。 4、 在debug目录下选择run,可观察到数据变化。
实验内容:
通过修改上述源程序,
实现在0x3f9020开始的位置放置8个数,0x3211。 在0x3f902f开始的位置放置8个数,0x1111。
将0x3f9020位置开始的8个数和0x3f902f位置开始放置的8个数相加,放到0x3f9010开始的8个地址中。
实验二 拨码开关实验 硬件不用调整。
该程序完成将拨码开关的信息读入DSP,然后再将该信息回写,控制led灯。 关键问题:读入的地址和输出的地址用的同一个地址。为什么呢?
其拨码开关是通过74LS244和总线相连,灯是通过74LS273相连总线。读时将273设为无效,244有效,拨码开关的数据上总线。写时,244无效,273有效,将数据发送出,同时锁存。需要3根控制线。按时序操作。对于本试验箱来讲,DSP将控制信号发给CPLD,在对一个特定地址进行读写时(0x2200),CPLD内部通过编程,实现对读写信号的不同操作。在DSP读0x2200时,CPLD将244有效。当DSP写0x2200时,CPLD将244无效,同时273有效,同时开关锁存一次,同时保持锁存。
主要程序如下:
/*******************************头文件****************************/ #include \ // DSP281x Headerfile Include File #include \ // DSP281x Examples Include File
/****************************主程序*******************************/ void main(void) {
unsigned int temp; temp = 0;
InitSysCtrl();//初始化PLL,WatchDog,使能外围时钟,该初始化文件在\中
DINT;//关闭CPU中断
// Initialize PIE control registers to their default state. // The default state is all PIE interrupts disabled and flags // are cleared. InitPieCtrl();
IER = 0x0000;//关闭中断和清除所有中断标志 IFR = 0x0000;
// Initialize the PIE vector table with pointers to the shell Interrupt // Service Routines (ISR). InitPieVectTable();
for(;;) { asm(\ temp = *(int *)0x2200&0x00ff; //读入0x2200地址的开关量值并赋给temp asm(\ * (int *)0x2200 = temp; //temp值输出0x2200地址的LED灯 asm(\
} }
其中InitPieVectTable()在文件DSP281x_PieVect.c中。 void InitPieVectTable(void) { int16 i; Uint32 *Source = (void *) &PieVectTableInit; 在这里取PieVectableInit的地址, Uint32 *Dest = (void *) &PieVectTable; 在这里取PieVectTable的地址 他们都应该是全局变量。 EALLOW; for(i=0; i < 128; i++) *Dest++ = *Source++; EDIS; // Enable the PIE Vector Table PieCtrlRegs.PIECRTL.bit.ENPIE = 1;
变量pieVectTableInit在文件DSP281x_PieVect.c中。PieVectTable在DSP281x_PieVect.h中定义,在最后2行。
他们的具体地址可以由.cmd文件来确定。
实验内容:
通过修改以上程序实现1号开关动作时,2号灯亮,2号开关动作时,3号灯亮,*****,等。在第8号开关动作时,第1号灯亮。
需要判断是高电平亮,还是低电平亮,可以使用中断调试。在运行状态,在需要设置断点的位置的右边,双击,就可以产生红点。表明设置了断点。在view目录下,打开watch window,输入需要观察的变量,就可看到其变化,然后,在debug目录下点run,在断点处,程序会停下来,可以观察temp变量来判断。