现用C6748 ECAP0脉冲捕获50Hz脉冲,示波器看波形很正常,但捕获的CAP1计数器值很奇怪是90左右,下面是代码,请FAE帮我看一下,谢谢。
/*
* main.c
*/
int main(void) {
unsigned int i,j=0;
// 外设使能配置
PSCInit();
// McBSP 管脚复用配置
GPIOBankPinMuxSet();
printf("\r\n===============Test Start=============\r\n");
printf("Welcome to StartWare ECAP application.\r\n");
//脉冲捕获初始化
ECAPInit();
//DSP中断初始化
//InterruptInit();
// 主循环
for(i=0;i<100;i++)
{
for(j=0x00FFFFFF;j>0;j--); // 延时
ECAPRead();
}
for(;;)
{
}
}
/****************************************************************************/
/* */
/* PSC 初始化 */
/* */
/****************************************************************************/
void PSCInit(void)
{
// 使能 ECAP 模块
// 对相应外设模块的使能也可以在 BootLoader 中完成
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
}
/****************************************************************************/
/* */
/* ECAP 初始化 */
/* */
/****************************************************************************/
void ECAPInit(void)
{
/*-----设置 ECCTL1-----*/
// 使能CAP寄存器装载
ECAPCaptureLoadingEnable(SOC_ECAP_0_REGS);
// 设置预分频值.
ECAPPrescaleConfig(SOC_ECAP_0_REGS, 0);
// 上升沿触发捕获事件
ECAPCapeEvtPolarityConfig(SOC_ECAP_0_REGS, 0,0,0,0);
// 输入捕获后重新装载计数器值.
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_0_REGS, 0,0,0,0);
/*-----设置 ECCTL2-----*/
// 连续模式
ECAPContinousModeConfig(SOC_ECAP_0_REGS);
// ECAP计数器TSCTR持续计数
ECAPCounterControl(SOC_ECAP_0_REGS,ECAP_COUNTER_FREE_RUNNING);
// 禁用同步输出和同步输入
ECAPSyncInOutSelect(SOC_ECAP_0_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
// 配置 ECAP 2 为 CAPTURE 模式
ECAPOperatingModeSelect(SOC_ECAP_0_REGS, ECAP_CAPTURE_MODE);
}
/****************************************************************************/
/* */
/* GPIO 管脚复用配置 */
/* */
/****************************************************************************/
void GPIOBankPinMuxSet(void)
{
// C6748 有三个增强捕获模块
//作为捕获功能时管脚方向为输入
//作为辅助脉宽调制时管脚方向为输出
*(unsigned int *)0x01C14128=0x20000000; //ecap0
*(unsigned int *)0x01C14124=0x40000000; //ecap1
//ECAP0 方向设置为输入
GPIODirModeSet(SOC_GPIO_0_REGS,137,GPIO_DIR_INPUT); //GPIO8[7]
//ECAP1方向设置为输入
GPIODirModeSet(SOC_GPIO_0_REGS,1,GPIO_DIR_INPUT); //GPIO0[0]
}
/****************************************************************************/
/* */
/* DSP 中断初始化 */
/* */
/****************************************************************************/
void InterruptInit(void)
{
// 初始化 DSP 中断控制器
IntDSPINTCInit();
// 使能DSP 全局中断
IntGlobalEnable();
}
/****************************************************************************/
/* */
/* 取得捕获结果 */
/* */
/****************************************************************************/
unsigned int ECAPRead(void)
{
unsigned int capvalue1,capvalue2,capvalue3,capvalue4;
float frequency;
// Event1 中断标志
if(ECAPIntStatus(SOC_ECAP_0_REGS, ECAP_CEVT1_INT))
{
// 取得捕获计数
EcapContextSave(SOC_ECAP_0_REGS,0,&ECAPResult);
capvalue1 = ECAPResult.cap1;
//capvalue2 = ECAPResult.cap2;
//capvalue3 = ECAPResult.cap3;
//capvalue4 = ECAPResult.cap4;
printf("ECAPRead:capvalue1 = %d\r\n",capvalue1);
//printf("ECAPRead:capvalue2 = %d\r\n",capvalue2);
//printf("ECAPRead:capvalue3 = %d\r\n",capvalue3);
//printf("ECAPRead:capvalue4 = %d\r\n",capvalue4);
// CAPTRUE 模块 150M 时钟主频
//frequency = 150000000/(float)capvalue1;
//printf("ECAPRead:frequency = %f\r\n",frequency);
ECAPIntStatusClear(SOC_ECAP_0_REGS, ECAP_ECEINT_CEVT1);
ECAPOneShotREARM(SOC_ECAP_0_REGS);
//IntEventClear(SYS_INT_ECAP0);
}
return 1;
}
