dsp实验:定时器
实验三:定时器
一、实验原理
1.定时器的结构
2.定时器中断周期
3.实验功能:通过XF管脚控制LED闪动以一定规律进行闪烁。
二、硬件资源及在片外围电路
硬件资源:
DSP芯片、CPU、LED、蜂鸣器、电阻、电容等
在片外围电路:
时钟发生器、定时器、通用输入/输出口等
三、参数设置
CPU工作时钟:*clkmd =0x21b3;
0010000110110011
CLKOUT=18M
中断频率:9 /* PRSC 4bit*/
18M/9000=2KHZ
四、实验流程图
五、程序
#include
#include
#include
#include
#include
extern void VECSTART(void);
#define TIMER_CTRL TIMER_TCR_RMK(\
TIMER_TCR_IDLEEN_DEFAULT, /* IDLEEN == 0 */ \
TIMER_TCR_FUNC_OF(0), /* FUNC == 0 */ \
TIMER_TCR_TLB_RESET, /* TLB == 1 */ \
TIMER_TCR_SOFT_BRKPTNOW, /* SOFT == 0 */ \
TIMER_TCR_FREE_WITHSOFT, /* FREE == 0 */ \
TIMER_TCR_PWID_OF(0), /* PWID == 0 */ \
TIMER_TCR_ARB_RESET, /* ARB == 1 */ \
TIMER_TCR_TSS_START, /*
TSS == 0 */ \
TIMER_TCR_CP_PULSE, /* CP == 0 */ \
TIMER_TCR_POLAR_LOW, /* POLAR == 0 */ \
TIMER_TCR_DATOUT_0 /* DATOUT == 0 */ \
)
/* Create a TIMER configuration structure that can be passed */
/* to TIMER_config CSL function for initialization of Timer */
/* control registers. */ TIMER_Config timCfg0 = {
TIMER_CTRL, /* TCR0 */
// 0x3400u, /* PRD0 0x3400=13312*/ 14400, /* PRD0 16bit
0x3400=144000=14400*10*/
9 /* PRSC 4bit*/
}; //中断频率=Fcpu/(9000*1)=144MHz/13312=1kHz
Uint16 eventId0;
/* Create a TIMER_Handle object for use with TIMER_open */ TIMER_Handle mhTimer0;
volatile Uint16 timer0_cnt = 0;
/* Function/ISR prototypes */
interrupt void timer0Isr(void);
int old_intm;
Uint16 tim_val;
Uint16 xfchange = 0;
Uint16 ms,f;
void main(void)
{
/* Initialize CSL library - This is REQUIRED !!! */
/*CLS库的初始化,这是必需的*/
CSL_init();
/* Set IVPH/IVPD to start of interrupt vector table */
/*修改寄存器IVPH,IVPD,重新定义中断向量表*/
IRQ_setVecs((Uint32)(&VECSTART));
/* Temporarily disable all maskable interrupts */
/*禁止所有可屏蔽的中断源*/
old_intm = IRQ_globalDisable();
/* Open Timer 0, set registers to power on defaults */
/*打开定时器0,设置其为上电的的默认值,并返回其句柄*/
mhTimer0 = TIMER_open(TIMER_DEV0, TIMER_OPEN_RESET);
/* Get Event Id associated with Timer 0, for use with */
/* CSL interrupt enable functions. */
/*获取定时器0的中断ID号*/
eventId0 = TIMER_getEventId(mhTimer0);
/* Clear any pending Timer interrupts */
/*清除定时器0的中断状态位*/
IRQ_clear(eventId0);
/* Place interrupt service routine address at */
/* associated vector location */
/*为定时器0设置中断服务程序*/
IRQ_plug(eventId0,&timer0Isr);
/* Write configuration structure values to Timer control regs */ /*设置定时器0的控制与周期寄存器*/
TIMER_config(mhTimer0, &timCfg0);
/* Enable Timer interrupt */
/*使能定时器的中断*/
IRQ_enable(eventId0);
/* Enable all maskable interrupts */
/*设置寄存器ST1的INTM位,使能所有的中断*/
IRQ_globalEnable();
/* Start Timer */
/*启动定时器0*/
TIMER_start(mhTimer0);
ms=0;
for(;;)
{
// Wait for at least 10 timer periods
//等待10个定时周期
if(xfchange == 0)
{
//点亮XF的LED
CHIP_FSET(ST1_55,XF,1);
}
else
{
//关掉XF的LED
CHIP_FSET(ST1_55,XF,0);
}
}
/* Restore old value of INTM */
/*恢复INTM旧的值*/
IRQ_globalRestore(old_intm);
/* We are through with timer, so close it */ /*关掉定时器0*/
TIMER_close(mhTimer0);
}
/*定时器0的中断程序*/
interrupt void timer0Isr(void)
{
ms++;
++timer0_cnt;
if(timer0_cnt == 500)
{
xfchange = 1;
}
if(timer0_cnt == 1000)
{
timer0_cnt = 0;
xfchange = 0;
}
}