打印

求助:DM642定时器

[复制链接]
2935|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
展翅飞|  楼主 | 2009-6-26 10:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
DM642定时器能定时1us么,赋好初值后 实际试验中发现定时器中断内没任何指认 定时时间约为1.16us,内部指认愈多中断时间变的越长,我想问下这定时器中断是怎么工作的?
是中断结束后 定时器计数才开始重新计数么?为何中断内指认越多,进入中断时间周期越长,?定时周期不变

相关帖子

沙发
展翅飞|  楼主 | 2009-6-26 10:18 | 只看该作者

求助:DM642定时器

代码:


/* Header file created by DSP/BIOS tool */
#include "spicfgcfg.h"

#include <std.h>

#include <log.h>
#include <sys.h>
#include <mem.h>
#include <sio.h>
#include <csl.h>
#include <csl_cache.h>
#include <csl_irq.h>
#include <gio.h>

#define DRR0                    *((unsigned char *)(0x018C0000))
#define DXR0                    *((unsigned char *)(0x018C0004))
#define DRR1                    *((unsigned char *)(0x01900000))
#define DXR1                    *((unsigned char *)(0x01900004))

#define GPIO_EN        (*((unsigned int*)(0x01b00000)))
#define GPIO_DIR       (*((unsigned int*)(0x01b00004)))
#define GPIO_VAL       (*((unsigned int*)(0x01b00008)))
#define GPIO_DH        (*((unsigned int*)(0x01b00010)))
#define GPIO_HM        (*((unsigned int*)(0x01b00014)))
#define GPIO_DL        (*((unsigned int*)(0x01b00018)))
#define GPIO_LM        (*((unsigned int*)(0x01b0001c)))
#define GPIO_GC        (*((unsigned int*)(0x01b00020)))
#define GPIO_POL       (*((unsigned int*)(0x01b00024)))

void InitGPIO();     //初始化GPIO接口

void SpiRcv0();
void SpiRcv1();
void MCBSP_init();
#define PRDValue0 0x0000004b  // 1US 
Uint32 x[100],y[100];
Uint32 i,j;
#pragma CODE_SECTION(timer1,".jpgtbls ");
#pragma CODE_SECTION(writed,".jpgtbls ");
#pragma CODE_SECTION(SpiRcv0,".jpgtbls ");
#pragma CODE_SECTION(SpiRcv1,".jpgtbls ");//定义到内部ISRAM

void writed();
Uint32 KK=0,l=0;
Uint32 x[100],y[100];
Uint32 i,j;
TIMER_Handle hTimer1;
Uint32 TimerEventid;
//定时器配置系数结构体
TIMER_Config MyConfig1=
{
 0x00000305,//CTL
 PRDValue0,//PRD
 0x00000000,//CNT
};
void writed()
{

        GPIO_VAL |= 0x00002002;    
    
        GPIO_VAL &= 0xffffdffd;
                GPIO_VAL |= 0x00002002;    
    
        GPIO_VAL &= 0xffffdffd;
                GPIO_VAL |= 0x00002002;    
    
        GPIO_VAL &= 0xffffdffd;
                GPIO_VAL |= 0x00002002;    
    
        GPIO_VAL &= 0xffffdffd;
                GPIO_VAL |= 0x00002002;    
    
        GPIO_VAL &= 0xffffdffd;//加上这几句后 通过示波器观察 发现进入此函数时间间隔变成2.2us  但定时时间初值为1us

}
//定时器1硬件中断 定时1us检测高速AD值 
 void timer1(void)
{


  
 writed();//屏蔽这句通过仿真进入时间为1.16us

//SWI_post(&TIME_swi);
}
/*----------------------------------------------------------------------------*/
void main() {

  volatile Uint32 y;
  int success = 1;
  CSL_init();
  
  IRQ_globalEnable(); //IRQ global enable
  IRQ_nmiEnable(); //NMIE
  IRQ_enable(IRQ_EVT_RINT0); //McBSP0 interrupt enable
  IRQ_enable(IRQ_EVT_RINT1); //McBSP1 interrupt enable

  MCBSP_init();
      InitGPIO();
      
   //打开定时器0及GPIO口
     hTimer1 = TIMER_open(TIMER_DEV1, 0);

 
 //获取定时器0的事件号
     TimerEventid = TIMER_getEventId(hTimer1);
 
 //中断向量表的初始化

    IRQ_globalEnable();
 //    IRQ_nmiEnable(); //NMIE
   IRQ_enable(TimerEventid);
    IRQ_enable(IRQ_EVT_RINT0); //McBSP0 interrupt enable
    IRQ_enable(IRQ_EVT_RINT1); //McBSP1 interrupt enable
 //对定时器0及GPIO口进行配置
     TIMER_config(hTimer1, &MyConfig1);

 
 //开始运行
     TIMER_start(hTimer1);
  

}

//AD0 interrupt
void SpiRcv0()
{
    x[i++] = DRR0;
    if(i>99) i=0;
}

//AD1 interrupt
void SpiRcv1()
{
    y[j++] = DRR1;
    if(j>99) j=0;
}

void MCBSP_init()
{
  MCBSP_enableSrgr(hMcbsp0);
  MCBSP_enableRcv(hMcbsp0);
  MCBSP_enableXmt(hMcbsp0);
  MCBSP_enableFsync(hMcbsp0);  
  MCBSP_start(hMcbsp0,MCBSP_RCV_START | MCBSP_XMIT_START | MCBSP_SRGR_START| MCBSP_SRGR_FRAMESYNC, 0);

  MCBSP_enableSrgr(hMcbsp1);
  MCBSP_enableRcv(hMcbsp1);
  MCBSP_enableXmt(hMcbsp1);
  MCBSP_enableFsync(hMcbsp1);  
  MCBSP_start(hMcbsp1,MCBSP_RCV_START | MCBSP_XMIT_START | MCBSP_SRGR_START| MCBSP_SRGR_FRAMESYNC, 0);
}

void InitGPIO()
{
    
    /* GPIO */
    GPIO_EN        = 0x0000ffff;
    GPIO_DIR       = 0x00002222;      
}

/*----------------------------------------------------------------------------*/

/******************************************************************************
* End of main.c
******************************************************************************/


使用特权

评论回复
板凳
fanyinfu| | 2009-7-2 18:38 | 只看该作者

sfddfsfds

dfsdffdsf

使用特权

评论回复
地板
yxwsz| | 2009-7-3 23:25 | 只看该作者

RE

真怀疑你的水平啊;
需要1us的定时,需要硬件去实现; 600mhz的dm642外设时钟是150Mhz,也就是每执行600条指令就需要中断一次,有你这样设计的吗?

使用特权

评论回复
5
hebu007| | 2009-7-9 14:54 | 只看该作者

...

1US 好苛刻呀 

使用特权

评论回复
6
展翅飞|  楼主 | 2009-7-10 09:32 | 只看该作者

回4楼

是的 定时1us的设计是比较不行
关键是我们要求对AD的采样率为1M   节约成本DSP直接和AD芯片连接 采用SPI总线连接 并对AD值进行判断  大于阈值时 侧把之后的10ms的数据记录下来 只有定时1us了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

17

帖子

0

粉丝