使用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;
}