当前位置:范文大全 > 调查报告 > dsp控制器原理及专业技术实验报告:dsp控制原理及应用

dsp控制器原理及专业技术实验报告:dsp控制原理及应用

时间:2021-11-02 10:51:47 浏览次数:

  DSP控制器原理及技术实验报告

 ———————————————————————————————— 作者:

 ———————————————————————————————— 日期:

 实验二 定时器

 一.实验目的1.  熟悉如何编写 28335 的中断服务程序;

 2.  掌握长时间间隔的定时器的处理。

 3. 掌握片内外设的设置方法。

 二.实验内容

 1.

 系统初始化; 

 2. DSP 的初始设置;

 3.  定时中断的编写;

 三.实验要求

 1. 通过本实验,熟悉中断的结构及用中断程序控制程序流程,掌握定时器的应用;

 2. 分析给定程序代码功能,并在实验报告中给出程序流程图和必要的注释;

 3. 改变定时时间,下载运行,观察结果,在报告中计算出运行时间。

 四.实验背景知识

 TMS320F28335 片上有 3 个 32-位 CPU 定时器,分别被称为 CPU 定时器 0、1 和2。每个定时器中均有一个 32-位减计数器,当计数器减到 0 时,产生一个中断。其中,CPU 定时器 0 的中断 TINT0 为 PIE 中断,CPU 定时器 1 的中断 TINT1 直接连到 CPU中断的 INT13,CPU 定时器 2 的中断 TINT2 直接连到 CPU 中断的 INT14。如下图所示。

 CPU 定时器 2 保留为实时操作系统(如 DSP BIOS)使用,而 CPU 定时器 0、 1 则可被用户使用,SEED-DEC28335 未使用 CPU 定时器 0,用户可以根据应用的需要灵活使用。

 CPU 定时器的原理框图和定时中断如下图所示。

 定时器在工作过程中,首先用 32 位计数寄存器(TIMH:TIM)装载周期寄存器(PRDH: PRD)内部的值。计数寄存器根据 SYSCLKOUT 时钟递减计数。当计数寄存器等于 0 时,定时器中断输出产生一个中断脉冲。

 定时器计数器(TIMH: TIM): TIM 寄存器保存当前 32 位定时器计数值的低 16 位,TIMH 寄存器保存高 16 位。每隔(TDDRH:TDDR+1)个时钟周期 TIMH:TIM 减 1,当 TIMH:TIM 递减到 0 时,TIMH:TIM 寄存器重新装载 PRDH:PRD 寄存器保存的周期值,并产生定时器中断TINT信号。

 定时器周期寄存器(PRDH:PRD):PRD 寄存器保存 32 位周期值的低 16 位,

 PRDH 保存高 16 位。当 TIMH: TIM 递减到零时,在下次定时周期开始之前 TIMH: TIM寄存器重新装载 PRDH:PRD 寄存器保存的周期值;当用户将定时器控制寄存器(TCR)的定时器重新装载位(TRB)置位时, TIMH: TIM 也会重新装载 PRDH: PRD 寄存器保存的周期值。

 五.实验准备

 1 实验硬件准备

 1. 将 DSP 仿真器与计算机连接好;

 2. 将 DSP 仿真器的 JTAG 插头与 SEED-DEC28335 单元的 J18 相连接;

 3. 启动计算机,当计算机启动后,打开SEED-DTK28335的电源。观察

 SEED-DTK_MBoard 单元的+5V,+3.3V,+15V,-15V 的电源指示灯灯及SEED-DEC28335 的电源指示灯 D2 是否均亮;若有不亮,断开电源,检查电源。

 2 实验软件准备

 ?1.在F盘新建timer文件夹

 ?2. 将实验箱所带光盘中的cputimer文件夹下的include、lib、src、28335.cmd、

 dsp2833x_header_nonbios.cmd拷贝进F盘新建timer文件夹下?3 新建、加载工程和文件

 1. 双击SETUP CCStudio3.3;

 2. 在famlily中选择C28XX,在platform中选择SEEDXDS510PLUS;

 3. 点击左下角save&quit,进入CCS主调试界面;

 4. 点击project-new,键入project名和路径,确认后CCS左边project中出现

 新建立的工程timer.pjt;

 5. 右击source-add?files?to?project,再进入src,在文件类型中选择all?files,加载src中的全部程序;

 6. 右击source-add?files?to?project,在timer文件夹的文件类型中选择all?files,

 并加载28335.cmd和dsp2833x_header_nonbios.cmd两个文件;

 7. 右击source-add?files?to?project,再进入lib文件夹并加载其中的 rts2800fpu32.lib。

 4编译配置及调试

 ?1. 点击CCS上面的project的build?options选项,点击第二项compiler-advanced,在floating?point?support下拉菜单中选择fpu32;在preproess中的一项中指定头文件路径F:\timer\include

 2. 在linker-basic中选择suppress?banner(-q)

 3. 点击编译,如无问题,在file中的load?program下载编译生产的.out文件即可在线调试。

 注意:在自己新建的timer工程中编译会出现5个警告,解决方法如下:

 1. 打开头文件incluede下的DSP2833x_GlobalPrototypes.h,在第24行加入:

   extern?void?InitXintf(void);语句;

 2. 打开source下的cputimer.c,在第六行加入:

 include?"DSP2833x_GlobalPrototypes.h"

 3. 保存以上修改重新编译即可消除警告。

 4. 其他实验不存在以上问题。

 六.实验结果

 1.

 #include "DSP2833x_Device.h"

 unsigned int Led_Flag;

 interrupt void ISRTimer2(void);

 unsigned int * LED3 = (unsigned int *) 0x4080;?

 void main(void)

 {

 // Step 1. Initialize System Control:初始化系统控制:

 // PLL, WatchDog, enable Peripheral Clocks锁相环,监督机构,使能外围时钟

 // This example function is found in the DSP2833x_SysCtrl.c file.这个例子函数是在DSP2833x_SysCtrl.c文件中找到。

    InitSysCtrl();

 // Step 2. Initialize GPIO:2 .初始化GPIO步:

 // This example function is found in the DSP2833x_Gpio.c

 // illustrates how to set the GPIO to it's default state.这个例子在DSP2833x_Gpio.c文件和函数发现说明如何设置的GPIO的默认状态。

    InitGpio(); // Skipped for this example

 // Step 3. Clear all interrupts and initialize PIE vector table:步骤3 .清除所有中断和初始化PIE中断向量表:

 // Disable CPU interrupts使能CPU中断

   DINT;

 // Initialize the PIE control registers to their default state.初始化PIE控制寄存器的默认状态。

 // The default state is all PIE interrupts disabled and flags are cleared.默认状态是所有PIE禁用中断和标志被清除

 // This function is found in the DSP2833x_PieCtrl.c file.这个函数是在DSP2833x_PieCtrl.c文件中找到。

  InitPieCtrl();

 // Disable CPU interrupts and clear all CPU interrupt flags:禁用CPU中断和清除所有CPU中断标志:

 IER = 0x0000;

  IFR = 0x0000;

 // Initialize the PIE vector table with pointers to the shell Interrupt

 // Service Routines (ISR).

 // This will populate the entire table, even if the interrupt

 // is not used in this example. This is useful for debug purposes.

 // The shell ISR routines are found in DSP2833x_DefaultIsr.c.

 // This function is found in DSP2833x_PieVect.c.初始化PIE中断矢量表指针服务例程(ISR)。

  InitPieVectTable();

 // Interrupts that are used in this example are re-mapped toISR functions found within this file.中断在本例中使用重新映射到ISR函数中找到这个文件

  EALLOW; // This is needed to write to EALLOW protected register这是需要写EALLOW注册保护

    PieVectTable.TINT2 = &ISRTimer2;

  EDIS;   // This is needed to disable write to EALLOW protected registers这是需要禁用写EALLOW保护寄存器

 // Step 4. Initialize all the Device Peripherals:步骤4 .初始化所有的设备外围设备:

 // This function is found in DSP2833x_InitPeripherals.c这个函数是在DSP2833x_InitPeripherals.c找到

 // InitPeripherals(); // Not required for this example

 // Step 5. User specific code, enable interrupts:第5步。用户特定的代码,使中断:

   /*Initial XZONE*/  

  InitXintf();

  /*设置CPU*/

  InitCpuTimers();

 ?ConfigCpuTimer(&CpuTimer2, 150, 1000000);

  ?StartCpuTimer2();

  CpuTimer2Regs.TCR.all = 0x4001; // Use write-only instruction to set TSS bit = 0使用只写指令设置TSS = 0

 /*开中断*/

  IER |= M_INT14;

 // Enable TINT0 in the PIE: Group 1 interrupt 7在PIE第1组中断7使能TINT0

   PieCtrlRegs.PIEIER1.bit.INTx7 = 1;

 ?EINT;  // Enable Global interrupt INTM启用全局中断INTM

  ERTM; // Enable Global real time interrupt DBGM

  for(;;);

 }

 interrupt void ISRTimer2(void)

 {

  CpuTimer2.InterruptCount++;

  if(Led_Flag == 1)

  {

 ? *LED3 = 0;//此行添加断点

 ? Led_Flag = 0;

  }

 ?else

 ?{

  *LED3 = 1;//此行添加断点

  Led_Flag = 1;

 ?}

 }