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;
?}
}
相关热词搜索: 专业技术 控制器 原理 实验 报告