This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

使用2812的CAP4 和EV 定时器4测频问题



使用2812的CAP和EVB的定时器4测频,但是频率不对,程序是在如下程序上修改的,只是把CAP2和T1换成了CAP4和T4。输入50HZ的时候,测的频率为83Hz ;100HZ为166Hz。。。。求解答

#include "DSP28_Device.h"

void main()

{

       //系统初始化

       InitSysCtrl();

       //初始化中断向量表

       DINT;                                        //关全局中断

       IER = 0x0000;                                

       IFR = 0x0000;

       InitPieCtrl();

       InitPieVectTable();

       InitGpio();

       InitEv();

       //PIE级中断使能

       PieCtrl.PIEIER3.bit.INTx6=1;

       //CPU级中断使能

       IER |= M_INT3;

       EINT;

       ERTM;

 while(1)

 {;}

}

初始化EV

#include "DSP28_Device.h"

//---------------------------------------------------------------------------

// InitEv:

//---------------------------------------------------------------------------

// This function initializes to a known state.

//

void InitEv(void)

{

       //配置CAP3

       EvaRegs.CAPFIFO.bit.CAP2FIFO = 0x0001;                        //预存一个值

       EvaRegs.CAPCON.bit.CAP12TSEL = 0x0001;                        //选择T1为时基

       EvaRegs.CAPCON.bit.CAP2EDGE = 0x0001;                        //上升沿触发

       //配置T1

        EvaRegs.T1CON.all=0;          //定时器控制寄存器

       EvaRegs.T1PR=0xffff;

       EvaRegs.T1CNT=0x0000;

    EvaRegs.T1CON.bit.FREE=0;        //仿真挂起时立即停止

     EvaRegs.T1CON.bit.SOFT=0;

       EvaRegs.T1CON.bit.TMODE=0x0002;                                        //连续增计数模式

       EvaRegs.T1CON.bit.TPS=6;                                        //预定标因子为64;

       EvaRegs.T1CON.bit.TCLKS10=0x0000;                                //使用内部时钟

       EvaRegs.EVAIFRC.bit.CAP2INT=1;                        //清除cap2外设级中断标志

       //外设级中断使能

       EvaRegs.EVAIMRC.bit.CAP2INT=1;

       //开启T1 和CAP2

       EvaRegs.CAPCON.bit.CAPQEPN=0x0001;

       EvaRegs.T1CON.bit.TENABLE=1;

}        

       初始化gpio

#include "DSP28_Device.h"

//---------------------------------------------------------------------------

// InitGpio:

//---------------------------------------------------------------------------

// This function initializes the Gpio to a known state.

//

void InitGpio(void)

{

// Set GPIO F port pins,bit0 as ouput,bit1 as input,bit2 as output, bit3 as ouput

// Input Qualifier =0, none

//配置GPIO口,捕获单元为外设功能,应配置

       EALLOW;

       GpioMuxRegs.GPAMUX.bit.CAP2Q2_GPIOA9=1;                //A9设置成外设功能,用于捕获CAP2

       EDIS;

}        

初始化系统

#include "DSP28_Device.h"

//---------------------------------------------------------------------------

// InitSysCtrl:

//---------------------------------------------------------------------------

// This function initializes the System Control registers to a known state.

//

void InitSysCtrl(void)

{

  Uint16 i;

  EALLOW;

// On TMX samples, to get the best performance of on chip RAM blocks M0/M1/L0/L1/H0 internal

// control registers bit have to be enabled. The bits are in Device emulation registers.

  DevEmuRegs.M0RAMDFT = 0x0300;

  DevEmuRegs.M1RAMDFT = 0x0300;

  DevEmuRegs.L0RAMDFT = 0x0300;

  DevEmuRegs.L1RAMDFT = 0x0300;

  DevEmuRegs.*** = 0x0300;

// Disable watchdog module

  SysCtrlRegs.WDCR= 0x0068;

// Initalize PLL

  SysCtrlRegs.PLLCR = 0xA;

  // Wait for PLL to lock

  for(i= 0; i< 5000; i++){}

// 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.SCIENCLKA=1;

// SysCtrlRegs.PCLKCR.bit.SCIENCLKB=1;

  EDIS;

}

//---------------------------------------------------------------------------

// KickDog:

//---------------------------------------------------------------------------

// This function resets the watchdog timer.

// Enable this function for using KickDog in the application

void KickDog(void)

{

   EALLOW;

   SysCtrlRegs.WDKEY = 0x0055;

   SysCtrlRegs.WDKEY = 0x00AA;

   EDIS;

}

中断函数

//###########################################################################

//

// FILE:        DSP28_DefaultIsr.c

//

// TITLE:        DSP28 Device Default Interrupt Service Routines.

//

//###########################################################################

//

//  Ver | dd mmm yyyy | Who  | Description of changes

// =====|=============|======|===============================================

//  0.55| 06 May 2002 | L.H. | EzDSP Alpha Release

//  0.56| 20 May 2002 | L.H. | No change

//  0.57| 27 May 2002 | L.H. | No change

//##########################################################

#include "DSP28_Device.h"

Uint16 capnum1;

Uint16 capnum2;

 float f;

Uint16 t;

unsigned int temp;

.

.

.省略中间部分

.

.interrupt void CAPINT2_ISR(void)    // EV-A

{

  if( EvaRegs.CAPFIFO.bit.CAP2FIFO==3)

       {

       capnum1=EvaRegs.CAP2FIFO;  

         capnum2=EvaRegs.CAP2FIFO;

       if(capnum2 > capnum1)

             temp = capnum2-capnum1;

        else

             temp = capnum2+(0xFFFF-capnum1);

        f= 150000000.0/(2*64)/(float)temp;

        }

EvaRegs.EVAIFRC.bit.CAP2INT=1;// 清捕获中断1 标志位

PieCtrl.PIEACK.bit.ACK3=1;//开外设中断应答

EINT;

return;

}