DSP28379D在调用DSP内部Ecap 脉冲捕获功能时,如下图所示CH4绿色通道是我DSP外部的GPIO口给到Ecap模块进行捕获的方波,CH3是DSP捕获到CH4脉冲上升沿触发Ecap中断程序后实现GPIO口的翻转来测试Ecap的延时时间,为什么会有260ns的延时时间啊?
目前系统时钟配置为200MHz, datasheet上关于GPIO的延时采5个系统时钟周期以内,260ns太长了不正常啊,我现在要用到1MHz以上的开关频率,这个延时太大了无法接受啊
Susan Yang:“CH3是DSP捕获到CH4脉冲上升沿触发Ecap中断程序后实现GPIO口的翻转来测试Ecap的延时时间”
中断的触发,中断程序的执行以及GPIO反转都是需要时间的。
请问能否给出详细代码?
DSP28379D在调用DSP内部Ecap 脉冲捕获功能时,如下图所示CH4绿色通道是我DSP外部的GPIO口给到Ecap模块进行捕获的方波,CH3是DSP捕获到CH4脉冲上升沿触发Ecap中断程序后实现GPIO口的翻转来测试Ecap的延时时间,为什么会有260ns的延时时间啊?
目前系统时钟配置为200MHz, datasheet上关于GPIO的延时采5个系统时钟周期以内,260ns太长了不正常啊,我现在要用到1MHz以上的开关频率,这个延时太大了无法接受啊
user4669408:
回复 Susan Yang:
void Ecap_Init(void){
EALLOW;InputXbarRegs.INPUT7SELECT = 21; // Set eCAP1 source to GPIO-pinEDIS;
GPIO_SetupPinOptions(21, GPIO_INPUT, GPIO_ASYNC);
ECap1Regs.ECEINT.all = 0x0000; // Disable all capture __interruptsECap1Regs.ECCLR.all = 0xFFFF; // Clear all CAP __interrupt flagsECap1Regs.ECCTL1.bit.CAPLDEN = 0; // Disable CAP1-CAP4 register loadsECap1Regs.ECCTL2.bit.TSCTRSTOP = 0; // Make sure the counter is stopped
// Configure peripheral registersECap1Regs.ECCTL2.bit.CONT_ONESHT = 1; // One-shotECap1Regs.ECCTL2.bit.STOP_WRAP = 0;//3; // Stop at 4 eventsECap1Regs.ECCTL1.bit.CAP1POL = 0; // Falling edgeECap1Regs.ECCTL1.bit.CAP2POL = 0; // Rising edgeECap1Regs.ECCTL1.bit.CAP3POL = 0; // Falling edgeECap1Regs.ECCTL1.bit.CAP4POL = 0; // Rising edgeECap1Regs.ECCTL1.bit.CTRRST1 = 1; // Difference operationECap1Regs.ECCTL1.bit.CTRRST2 = 1; // Difference operationECap1Regs.ECCTL1.bit.CTRRST3 = 1; // Difference operationECap1Regs.ECCTL1.bit.CTRRST4 = 1; // Difference operationECap1Regs.ECCTL2.bit.SYNCI_EN = 0; // Enable sync inECap1Regs.ECCTL2.bit.SYNCO_SEL = 0; // Pass throughECap1Regs.ECCTL1.bit.CAPLDEN = 1; // Enable capture units
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1; // Start CounterECap1Regs.ECCTL2.bit.REARM = 1; // arm one-shotECap1Regs.ECCTL1.bit.CAPLDEN = 1; // Enable CAP1-CAP4 register loadsECap1Regs.ECEINT.bit.CEVT1 = 1; // 1 events = __interrupt// ECap1Regs.ECEINT.bit.CEVT4 = 1; // 4 events = __interrupt
}/* Ecap_Init() */
interrupt void ecap1_isr(void){
EALLOW;GpioDataRegs.GPASET.bit.GPIO12 = 1;EDIS;ECap1Regs.ECCLR.bit.CEVT1 = 1;
ECap1Regs.ECCLR.bit.INT = 1;ECap1Regs.ECCTL2.bit.REARM = 1;
// Acknowledge this __interrupt to receive more __interrupts from group 4PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
GpioDataRegs.GPACLEAR.bit.GPIO12 = 1;
}