现用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,难道是我的配置写的有问题?