现用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;
}
Shine:
跟一下代码,看这些寄存器是否都配置进去了,特别是ECCTL2.CAP/APWM是否为0?
user4948430:
回复 Shine:
单步调试发现,ECAPIntStatusClear(SOC_ECAP_0_REGS, ECAP_ECEINT_CEVT1);这个函数没有将ECAP_ECCLR寄存器中,相应的标志位置1,不知道什么原因
Shine:
回复 user4948430:
ECAPIntStatusClear这个函数有bug.https://e2e.ti.com/support/embedded/starterware/f/790/p/248298/868944
user4948430:
回复 Shine:
我把API改了,
void ECAPIntStatusClear(unsigned int baseAdd, unsigned int flag){ HWREGH(baseAdd + ECAP_ECCLR) = HWREGH(baseAdd + ECAP_ECFLG) & flag;}
但调试发现,ECCLR寄存器相应位仍没有置为1,这是为什么
user4948430:
回复 user4948430:
我看datasheet上 ECCLR寄存器是可读可写的,难道不能读吗
Shine:
回复 user4948430:
ECCLR Always reads back a 0。
所以看一下ECFLG寄存器看一下有没有清除成功。
user4948430:
回复 Shine:
没有清除成功,还是原来的1,难道是我的配置写的有问题?
TI中文支持网

