请问ECAP里面用来产生APWM的模块,捕获脉冲是从哪个GPIO口输入的?
user5878224:
这是ECAP文件配置的程序:
// TI File $Revision: /main/2 $// Checkin $Date: March 15, 2007 16:54:36 $//###########################################################################//// FILE: DSP2833x_ECap.c//// TITLE: DSP2833x eCAP Initialization & Support Functions.////###########################################################################// $TI Release: DSP2833x/DSP2823x C/C++ Header Files V1.31 $// $Release Date: August 4, 2009 $//###########################################################################
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
//—————————————————————————// InitECap://—————————————————————————// This function initializes the eCAP(s) to a known state.//void InitECap(void){ // Initialize eCAP1/2/3
//tbd…
}
//—————————————————————————// Example: InitECapGpio://—————————————————————————// This function initializes GPIO pins to function as ECAP pins//// Each GPIO pin can be configured as a GPIO pin or up to 3 different// peripheral functional pins. By default all pins come up as GPIO// inputs after reset.//// Caution:// For each eCAP peripheral// Only one GPIO pin should be enabled for ECAP operation.// Comment out other unwanted lines.
void InitECapGpio(){
InitECap1Gpio();#if (DSP28_ECAP2) InitECap2Gpio();#endif // endif DSP28_ECAP2#if (DSP28_ECAP3) InitECap3Gpio();#endif // endif DSP28_ECAP3#if (DSP28_ECAP4) InitECap4Gpio();#endif // endif DSP28_ECAP4#if (DSP28_ECAP5) InitECap5Gpio();#endif // endif DSP28_ECAP5#if (DSP28_ECAP6) InitECap6Gpio();#endif // endif DSP28_ECAP6}
void InitECap1Gpio(void){ EALLOW;/* Enable internal pull-up for the selected pins */// Pull-ups can be enabled or disabled by the user.// This will enable the pullups for the specified pins.// Comment out other unwanted lines.
// GpioCtrlRegs.GPAPUD.bit.GPIO5 = 0; // Enable pull-up on GPIO5 (CAP1) GpioCtrlRegs.GPAPUD.bit.GPIO24 = 1; // Disable pull-up on GPIO24 (CAP1)// GpioCtrlRegs.GPBPUD.bit.GPIO34 = 0; // Enable pull-up on GPIO34 (CAP1)
// Inputs are synchronized to SYSCLKOUT by default.// Comment out other unwanted lines.
// GpioCtrlRegs.GPAQSEL1.bit.GPIO5 = 0; // Synch to SYSCLKOUT GPIO5 (CAP1) GpioCtrlRegs.GPAQSEL2.bit.GPIO24 = 0; // Synch to SYSCLKOUT GPIO24 (CAP1)// GpioCtrlRegs.GPBQSEL1.bit.GPIO34 = 0; // Synch to SYSCLKOUT GPIO34 (CAP1)
/* Configure eCAP-1 pins using GPIO regs*/// This specifies which of the possible GPIO pins will be eCAP1 functional pins.// Comment out other unwanted lines.
// GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 3; // Configure GPIO5 as CAP1 GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 1; // Configure GPIO24 as CAP1// GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 1; // Configure GPIO24 as CAP1
EDIS;}
#if DSP28_ECAP2void InitECap2Gpio(void){ EALLOW;/* Enable internal pull-up for the selected pins */// Pull-ups can be enabled or disabled by the user.// This will enable the pullups for the specified pins.// Comment out other unwanted lines.
// GpioCtrlRegs.GPAPUD.bit.GPIO7 = 0; // Enable pull-up on GPIO7 (CAP2) GpioCtrlRegs.GPAPUD.bit.GPIO25 = 0; // Enable pull-up on GPIO25 (CAP2)// GpioCtrlRegs.GPBPUD.bit.GPIO37 = 0; // Enable pull-up on GPIO37 (CAP2)
// Inputs are synchronized to SYSCLKOUT by default.// Comment out other unwanted lines.
// GpioCtrlRegs.GPAQSEL1.bit.GPIO7 = 0; // Synch to SYSCLKOUT GPIO7 (CAP2) GpioCtrlRegs.GPAQSEL2.bit.GPIO25 = 0; // Synch to SYSCLKOUT GPIO25 (CAP2)// GpioCtrlRegs.GPBQSEL1.bit.GPIO37 = 0; // Synch to SYSCLKOUT GPIO37 (CAP2)
/* Configure eCAP-2 pins using GPIO regs*/// This specifies which of the possible GPIO pins will be eCAP2 functional pins.// Comment out other unwanted lines.
// GpioCtrlRegs.GPAMUX1.bit.GPIO7 = 3; // Configure GPIO7 as CAP2 GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 1; // Configure GPIO25 as CAP2// GpioCtrlRegs.GPBMUX1.bit.GPIO37 = 3; // Configure GPIO37 as CAP2
EDIS;}#endif // endif DSP28_ECAP2
#if DSP28_ECAP3void InitECap3Gpio(void){ EALLOW;
/* Enable internal pull-up for the selected pins */// Pull-ups can be enabled or disabled by the user.// This will enable the pullups for the specified pins.// Comment out other unwanted lines.
// GpioCtrlRegs.GPAPUD.bit.GPIO9 = 0; // Enable pull-up on GPIO9 (CAP3) GpioCtrlRegs.GPAPUD.bit.GPIO26 = 0; // Enable pull-up on GPIO26 (CAP3)
// Inputs are synchronized to SYSCLKOUT by default.// Comment out other unwanted lines.
// GpioCtrlRegs.GPAQSEL1.bit.GPIO9 = 0; // Synch to SYSCLKOUT GPIO9 (CAP3) GpioCtrlRegs.GPAQSEL2.bit.GPIO26 = 0; // Synch to SYSCLKOUT GPIO26 (CAP3)
/* Configure eCAP-3 pins using GPIO regs*/// This specifies which of the possible GPIO pins will be eCAP3 functional pins.// Comment out other unwanted lines.
// GpioCtrlRegs.GPAMUX1.bit.GPIO9 = 3; // Configure GPIO9 as CAP3 GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 1; // Configure GPIO26 as CAP3
EDIS;}#endif // endif DSP28_ECAP3
#if DSP28_ECAP4void InitECap4Gpio(void){ EALLOW;
/* Enable internal pull-up for the selected pins */// Pull-ups can be enabled or disabled by the user.// This will enable the pullups for the specified pins.// Comment out other unwanted lines.
GpioCtrlRegs.GPAPUD.bit.GPIO11 = 0; // Enable pull-up on GPIO11 (CAP4)// GpioCtrlRegs.GPAPUD.bit.GPIO27 = 0; // Enable pull-up on GPIO27 (CAP4)
// Inputs are synchronized to SYSCLKOUT by default.// Comment out other unwanted lines.
GpioCtrlRegs.GPAQSEL1.bit.GPIO11 = 0; // Synch to SYSCLKOUT GPIO11 (CAP4)// GpioCtrlRegs.GPAQSEL2.bit.GPIO27 = 0; // Synch to SYSCLKOUT GPIO27 (CAP4)
/* Configure eCAP-4 pins using GPIO regs*/// This specifies which of the possible GPIO pins will be eCAP4 functional pins.// Comment out other unwanted lines.
GpioCtrlRegs.GPAMUX1.bit.GPIO11 = 3; // Configure GPIO11 as CAP4// GpioCtrlRegs.GPAMUX2.bit.GPIO27 = 1; // Configure GPIO27 as CAP4
EDIS;}#endif // endif DSP28_ECAP4
#if DSP28_ECAP5void InitECap5Gpio(void){ EALLOW;
/* Enable internal pull-up for the selected pins */// Pull-ups can be enabled or disabled by the user.// This will enable the pullups for the specified pins.// Comment out other unwanted lines.
// GpioCtrlRegs.GPAPUD.bit.GPIO3 = 0; // Enable pull-up on GPIO3 (CAP5) GpioCtrlRegs.GPBPUD.bit.GPIO48 = 1; // Disable pull-up on GPIO48 (CAP5)
// Inputs are synchronized to SYSCLKOUT by default.// Comment out other unwanted lines.
// GpioCtrlRegs.GPAQSEL1.bit.GPIO3 = 0; // Synch to SYSCLKOUT GPIO3 (CAP5) GpioCtrlRegs.GPBQSEL2.bit.GPIO48 = 0; // Synch to SYSCLKOUT GPIO48 (CAP5)
/* Configure eCAP-5 pins using GPIO regs*/// This specifies which of the possible GPIO pins will be eCAP5 functional pins.// Comment out other unwanted lines.
// GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 2; // Configure GPIO3 as CAP5 GpioCtrlRegs.GPBMUX2.bit.GPIO48 = 1; // Configure GPIO48 as CAP5
EDIS;}#endif // endif DSP28_ECAP5
#if DSP28_ECAP6void InitECap6Gpio(void){ EALLOW;
/* Enable internal pull-up for the selected pins */// Pull-ups can be enabled or disabled by the user.// This will enable the pullups for the specified pins.// Comment out other unwanted lines.
GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0; // Enable pull-up on GPIO1 (CAP6)// GpioCtrlRegs.GPBPUD.bit.GPIO49 = 0; // Enable pull-up on GPIO49 (CAP6)
// Inputs are synchronized to SYSCLKOUT by default.// Comment out other unwanted lines.
GpioCtrlRegs.GPAQSEL1.bit.GPIO1 = 0; // Synch to SYSCLKOUT GPIO1 (CAP6)// GpioCtrlRegs.GPBQSEL2.bit.GPIO49 = 0; // Synch to SYSCLKOUT GPIO49 (CAP6)
/* Configure eCAP-5 pins using GPIO regs*/// This specifies which of the possible GPIO pins will be eCAP6 functional pins.// Comment out other unwanted lines.
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 2; // Configure GPIO1 as CAP6// GpioCtrlRegs.GPBMUX2.bit.GPIO49 = 1; // Configure GPIO49 as CAP6
EDIS;}#endif // endif DSP28_ECAP6
//===========================================================================// End of file.//===========================================================================这是主函数程序:
// $Boot_Table:// GPIO87 GPIO86 GPIO85 GPIO84// XA15 XA14 XA13 XA12// PU PU PU PU// ==========================================// 1 1 1 1 Jump to Flash// 1 1 1 0 SCI-A boot// 1 1 0 1 SPI-A boot// 1 1 0 0 I2C-A boot// 1 0 1 1 eCAN-A boot// 1 0 1 0 McBSP-A boot// 1 0 0 1 Jump to XINTF x16// 1 0 0 0 Jump to XINTF x32// 0 1 1 1 Jump to OTP// 0 1 1 0 Parallel GPIO I/O boot// 0 1 0 1 Parallel XINTF boot// 0 1 0 0 Jump to SARAM <- "boot to SARAM"// 0 0 1 1 Branch to check boot mode// 0 0 1 0 Boot to flash, bypass ADC cal// 0 0 0 1 Boot to SARAM, bypass ADC cal// 0 0 0 0 Boot to SCI-A, bypass ADC cal// Boot_Table_End$// DESCRIPTION:// This example configures ePWM3A for:// – Up count// – Period starts at 2 and goes up to 1000// – Toggle output on PRD// eCAP1 is configured to capture the time between rising// and falling edge of the PWM3A output.//###########################################################################// $TI Release: DSP2833x/DSP2823x C/C++ Header Files V1.31 $// $Release Date: August 4, 2009 $//############################################################################include "DSP28x_Project.h" // Device Headerfile and Examples Include File#define PI 3.14159#define Radius 0.22#define LED1 GpioDataRegs.GPBDAT.bit.GPIO60#define LED2 GpioDataRegs.GPBDAT.bit.GPIO61// Configure the start/end period for the timer#define DIR_L GpioDataRegs.GPBDAT.bit.GPIO49#define DIR_R GpioDataRegs.GPADAT.bit.GPIO25// Prototype statements for functions found within this file.interrupt void ecap1_isr(void);interrupt void ecap5_isr(void);void InitECapture1(void);void InitECapture5(void);void InitLed(void);void InitDIR(void);// Global variables used in this exampleUint32 ECap1IntCount;Uint32 ECap5IntCount;Uint32 Period1 = 0;Uint32 Period5 = 0;Uint32 Time1[24]={0};Uint32 Time5[24]={0};Uint32 T_Per_L = 0;Uint32 T_Per_R = 0;Uint32 Turn_R = 0;Uint32 Turn_L = 0;float Spd_L = 0;float Spd_R = 0;// To keep track of which way the timer value is movingvoid main(void){
// Step 1. Initialize System Control:// PLL, WatchDog, enable Peripheral Clocks// This example function is found in the DSP2833x_SysCtrl.c file. InitSysCtrl(); InitLed(); InitDIR();// Step 2. Initalize GPIO: // This example function is found in the DSP2833x_Gpio.c file and// illustrates how to set the GPIO to it's default state.// InitGpio(); // Skipped for this example InitECap1Gpio(); InitECap5Gpio();// Step 3. Clear all interrupts and initialize PIE vector table:// Disable CPU interrupts DINT;
// Initialize the PIE control registers to their default state.// The default state is all PIE interrupts disabled and flags// are cleared. // This function is found in the DSP2833x_PieCtrl.c file. InitPieCtrl(); // Disable CPU interrupts and clear all CPU interrupt flags: IER = 0x0000; IFR = 0x0000;
// Initialize the PIE vector table with pointers to the shell Interrupt // Service Routines (ISR). // This will populate the entire table, even if the interrupt// is not used in this example. This is useful for debug purposes.// The shell ISR routines are found in DSP2833x_DefaultIsr.c.// This function is found in DSP2833x_PieVect.c. InitPieVectTable();
// Interrupts that are used in this example are re-mapped to// ISR functions found within this file. EALLOW; // This is needed to write to EALLOW protected registers PieVectTable.ECAP1_INT = &ecap1_isr; PieVectTable.ECAP5_INT = &ecap5_isr; EDIS; // This is needed to disable write to EALLOW protected registers
// Step 4. Initialize all the Device Peripherals:// This function is found in DSP2833x_InitPeripherals.c// InitPeripherals(); // Not required for this example
InitECapture1(); InitECapture5(); // Step 5. User specific code, enable interrupts:
// Initalize counters: ECap1IntCount = 0; ECap5IntCount = 0; // Enable CPU INT4 which is connected to ECAP1-4 INT: IER |= M_INT4;
// Enable eCAP INTn in the PIE: Group 4 interrupt 1-6 PieCtrlRegs.PIEIER4.bit.INTx1 = 1; PieCtrlRegs.PIEIER4.bit.INTx5 = 1;// Enable global Interrupts and higher priority real-time debug events: EINT; // Enable Global interrupt INTM ERTM; // Enable Global realtime interrupt DBGM
// Step 6. IDLE loop. Just sit and loop forever (optional): for(;;) { asm("NOP"); }
}
void InitECapture1(){ ECap1Regs.ECEINT.all = 0x0000; // Disable all capture interrupts 禁用所有中断使能寄存器 ECap1Regs.ECCLR.all = 0xFFFF; // Clear all CAP interrupt flags 清除所有CAP中断旗帜 ECap1Regs.ECCTL1.bit.CAPLDEN = 0; // Disable CAP1-CAP4 register loads 禁止在捕获事件中加载CAP1-4寄存器的时间 ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0; // Make sure the counter is stopped 计数器停止 // Configure peripheral registers ECap1Regs.ECCTL2.bit.CAP_APWM = 0; // CAP moudle ECAP模块工作于捕捉模式 ECap1Regs.ECCTL2.bit.CONT_ONESHT = 1; // One shot 单次模式 ECap1Regs.ECCTL2.bit.STOP_WRAP = 0; // Stop at 1 events 单次模式下,在CAP1的捕捉事件发生后产生停止信号 ECap1Regs.ECCTL1.bit.CAP1POL = 0; // Rising edge CAP1上升沿捕捉 // ECap1Regs.ECCTL1.bit.CAP2POL = 0; // Falling edge // ECap1Regs.ECCTL1.bit.CAP3POL = 0; // Rising edge //ECap1Regs.ECCTL1.bit.CAP4POL = 0; // Falling edge ECap1Regs.ECCTL1.bit.CTRRST1 = 1; // Difference operation 在CAP1捕获后重置计数器 // ECap1Regs.ECCTL1.bit.CTRRST2 = 1; // Difference operation //ECap1Regs.ECCTL1.bit.CTRRST3 = 1; // Difference operation //ECap1Regs.ECCTL1.bit.CTRRST4 = 1; // Difference operation ECap1Regs.ECCTL2.bit.SYNCI_EN = 0; // Disable sync 屏蔽同步输入操作 ECap1Regs.ECCTL2.bit.SYNCO_SEL = 2; // Disable sync out 屏蔽同步信号输出 ECap1Regs.ECCTL1.bit.CAPLDEN = 1; // Enable CAP1-CAP4 register loads 使能在捕获事件中加载CAP1-4寄存器的时间 ECap1Regs.ECCTL1.bit.PRESCALE = 0; //输入信号不分频
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1; // Start Counter 计数器计数 ECap1Regs.ECCTL2.bit.REARM = 1; // arm one-shot 以下情况将强制为单次模式 ECap1Regs.ECEINT.bit.CEVT1 = 1; // CEVENT = interrupt 捕获事件1中断使能}
void InitECapture5(){ ECap5Regs.ECEINT.all = 0x0000; // Disable all capture interrupts 禁用所有中断使能寄存器 ECap5Regs.ECCLR.all = 0xFFFF; // Clear all CAP interrupt flags 清除所有CAP中断旗帜 ECap5Regs.ECCTL1.bit.CAPLDEN = 0; // Disable CAP1-CAP4 register loads 禁止在捕获事件中加载CAP1-4寄存器的时间 ECap5Regs.ECCTL2.bit.TSCTRSTOP = 0; // Make sure the counter is stopped 计数器停止 // Configure peripheral registers ECap5Regs.ECCTL2.bit.CAP_APWM = 0; // CAP moudle ECAP模块工作于捕捉模式 ECap5Regs.ECCTL2.bit.CONT_ONESHT = 1; // One shot 单次模式 ECap5Regs.ECCTL2.bit.STOP_WRAP = 0; // Stop at 1 events 单次模式下,在CAP1的捕捉事件发生后产生停止信号 ECap5Regs.ECCTL1.bit.CAP1POL = 0; // Rising edge CAP1上升沿捕捉 //ECap5Regs.ECCTL1.bit.CAP2POL = 1; // Falling edge // ECap5Regs.ECCTL1.bit.CAP3POL = 0; // Rising edge //ECap5Regs.ECCTL1.bit.CAP4POL = 0; // Falling edge ECap5Regs.ECCTL1.bit.CTRRST1 = 1; // Difference operation 在CAP1捕获后重置计数器 //ECap5Regs.ECCTL1.bit.CTRRST2 = 1; // Difference operation //ECap5Regs.ECCTL1.bit.CTRRST3 = 1; // Difference operation //ECap5Regs.ECCTL1.bit.CTRRST4 = 1; // Difference operation ECap5Regs.ECCTL2.bit.SYNCI_EN = 0; // Disable sync 屏蔽同步输入操作 ECap5Regs.ECCTL2.bit.SYNCO_SEL = 2; // Disable sync out 屏蔽同步信号输出 ECap5Regs.ECCTL1.bit.CAPLDEN = 1; // Enable CAP1-CAP4 register loads 使能在捕获事件中加载CAP1-4寄存器的时间 ECap5Regs.ECCTL1.bit.PRESCALE = 0; //不分频
ECap5Regs.ECCTL2.bit.TSCTRSTOP = 1; // Start Counter 计数器计数 ECap5Regs.ECCTL2.bit.REARM = 1; // arm one-shot 以下情况将强制为单次模式 ECap5Regs.ECEINT.bit.CEVT1 = 1; //捕获事件4-1中断使能,1:使能 //ECap6Regs.ECEINT.bit.CEVT2 = 1; // CEVENT = interrupt }
interrupt void ecap1_isr(void){ Uint32 i; LED1=~LED1; ECap1IntCount++; Period1 = ECap1Regs.CAP1; if (ECap1IntCount<=24) { Time1[ECap1IntCount-1] = Period1; Period1 = 0; if(ECap1IntCount==24) { for(i=0;i<24;i++) { T_Per_R = T_Per_R + Time1[i]; } Spd_R = 2*PI*Radius/(float)T_Per_R/6.67*1000000000*60; T_Per_R = 0; } } else { Turn_R = Turn_R + 1; ECap1IntCount = 0; } ECap1Regs.ECCLR.bit.CEVT1 = 1; //捕捉事件4~1标志,清除该位标志位 ECap1Regs.ECCLR.bit.INT = 1; //全局中断标志,清除该位标志位,不影响中断的使能 ECap1Regs.ECCTL2.bit.REARM = 1; //以下情况下将强制为单次模式:复位Mod4计数器为0,允许Mod4计数器持续计数,使能捕捉寄存器加载
// Acknowledge this interrupt to receive more interrupts from group 4 PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;}
interrupt void ecap5_isr(void){ Uint32 j; LED2=~LED2; ECap5IntCount++; Period5 = ECap5Regs.CAP1; if (ECap5IntCount<=24) { Time5[ECap5IntCount-1] = Period5; Period5 = 0; if(ECap5IntCount==24) { for(j=0;j<24;j++) { T_Per_L = T_Per_L + Time5[j]; } Spd_L = 2*PI*Radius/(float)T_Per_L/6.67*1000000000*60; T_Per_L = 0; } } else { Turn_L = Turn_L + 1; ECap5IntCount = 0; } ECap5Regs.ECCLR.bit.CEVT1 = 1; //捕捉事件4~1标志,清除该位标志位 //ECap5Regs.ECCLR.bit.CEVT2 = 1; // CEVENT = interrupt ECap5Regs.ECCLR.bit.INT = 1; //全局中断标志,清除该位标志位,不影响中断的使能 ECap5Regs.ECCTL2.bit.REARM = 1; //以下情况下将强制为单次模式:复位Mod4计数器为0,允许Mod4计数器持续计数,使能捕捉寄存器加载 // Acknowledge this interrupt to receive more interrupts from group 4 PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
}
void InitLed(void){ EALLOW; GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 0; // GPIO60 = GPIO60 GpioCtrlRegs.GPBDIR.bit.GPIO60 = 1; //Output LED1=1; GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 0; // GPIO61 = GPIO61 GpioCtrlRegs.GPBDIR.bit.GPIO61 = 1; LED2=1; EDIS;}void InitDIR(void){ EALLOW; GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 0; // GPIO25 = GPIO25 GpioCtrlRegs.GPADIR.bit.GPIO25 = 0; // Intput GpioCtrlRegs.GPBMUX2.bit.GPIO49 = 0; // GPIO49 = GPIO49 GpioCtrlRegs.GPBDIR.bit.GPIO49 = 0; EDIS;}//===========================================================================// No more.//===========================================================================请问捕获脉冲是从什么地方进入的?
请问ECAP里面用来产生APWM的模块,捕获脉冲是从哪个GPIO口输入的?
Green Deng:请问你用的是哪款芯片?捕获脉冲是指什么?
请问ECAP里面用来产生APWM的模块,捕获脉冲是从哪个GPIO口输入的?
user5878224:
回复 Green Deng:
28335,就是说我是不是要先捕获一个脉冲,然后用捕获的脉冲才能产生APWM?
请问ECAP里面用来产生APWM的模块,捕获脉冲是从哪个GPIO口输入的?
Green Deng:
回复 user5878224:
APWM可以看成简化版的ePWM,你可以参考TI的例程配置:
C:\ti\controlSUITE\device_support\f2833x\v142\DSP2833x_examples_ccsv5\ecap_apwm
请问ECAP里面用来产生APWM的模块,捕获脉冲是从哪个GPIO口输入的?
user5878224:
回复 Green Deng:
就是这个例程我看不懂,这个例程里面,被捕获的脉冲是从什么地方输入的?