/* global (called in other files) */ extern void int_rx_mnm1221_m(void); /* use in INTRX interrupt */ extern short ctrl_mnm1221_m(void); /* use in timer interrupt for NC */ __interrupt void xintrx_ISR(void) { int_rx_mnm1221_m(); PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; } __interrupt void ecap3_ISR(void) {ECap3Regs.ECCLR.bit.CEVT1 = 1;ECap3Regs.ECCLR.bit.CEVT2 = 1;ECap3Regs.ECCLR.bit.CEVT3 = 1;ECap3Regs.ECCLR.bit.CEVT4 = 1;ECap3Regs.ECCLR.bit.INT = 1;phase_monitor = ctrl_mnm1221_m ();// Acknowledge this interrupt to receive more interrupts from group 3PieCtrlRegs.PIEACK.all = PIEACK_GROUP4; } short monitor_phase (void) { return phase_monitor; } static void InitEPwm5 (void) { EALLOW; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0; EDIS; EPwm5Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // Count up EPwm5Regs.TBPRD = 37499; EPwm5Regs.TBPHS.all = 0x00000000; EPwm5Regs.AQCTLA.bit.PRD = AQ_TOGGLE;// Toggle on PRD // // TBCLK = SYSCLKOUT // EPwm5Regs.TBCTL.bit.HSPCLKDIV = 1; EPwm5Regs.TBCTL.bit.CLKDIV = 0; // EPwm5TimerDirection = EPWM_TIMER_UP; EALLOW; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1; EDIS; } static void InitECap3(void) { ECap3Regs.ECEINT.all = 0x0000;// Disable all capture __interrupts ECap3Regs.ECCLR.all = 0xFFFF;// Clear all CAP __interrupt flags ECap3Regs.ECCTL1.bit.CAPLDEN = 0;// Disable CAP1-CAP4 register loads ECap3Regs.ECCTL2.bit.TSCTRSTOP = 0;// Make sure the counter is stopped // // Configure peripheral registers // ECap3Regs.ECCTL2.bit.CONT_ONESHT = 1;// One-shot ECap3Regs.ECCTL2.bit.STOP_WRAP = 3;// Stop at 4 events ECap3Regs.ECCTL1.bit.CAP1POL = 1;// Falling edge ECap3Regs.ECCTL1.bit.CAP2POL = 0;// Rising edge ECap3Regs.ECCTL1.bit.CAP3POL = 1;// Falling edge ECap3Regs.ECCTL1.bit.CAP4POL = 0;// Rising edge ECap3Regs.ECCTL1.bit.CTRRST1 = 1;// Difference operation ECap3Regs.ECCTL1.bit.CTRRST2 = 1;// Difference operation ECap3Regs.ECCTL1.bit.CTRRST3 = 1;// Difference operation ECap3Regs.ECCTL1.bit.CTRRST4 = 1;// Difference operation ECap3Regs.ECCTL2.bit.SYNCI_EN = 1;// Enable sync in ECap3Regs.ECCTL2.bit.SYNCO_SEL = 0;// Pass through ECap3Regs.ECCTL1.bit.CAPLDEN = 1;// Enable capture units ECap3Regs.ECCTL2.bit.TSCTRSTOP = 1;// Start Counter ECap3Regs.ECCTL2.bit.REARM = 1;// arm one-shot ECap3Regs.ECCTL1.bit.CAPLDEN = 1;// Enable CAP1-CAP4 register loads ECap3Regs.ECEINT.bit.CEVT4 = 1;// 4 events = __interrupt } /// ---------------------------------------------------------------------------------- static void IoInit(void) { EALLOW; // nOE/nCS 默认拉为高电平,其余GPIO默认拉为低电平 // 经过 InitGpio 初始化后, // 所有端口默认都是GPIO口,且IO口已经开启上拉使能,默认时需要拉低电平 // GPIO8特殊用途,当需要允许控制IO板的第4排输出时,需要拉低,否则拉高 GpioDataRegs.GPACLEAR.all = 0x3900ul; // 拉低端口 // GpioDataRegs.GPASET.bit.GPIO8 = 1; // 拉高端口 GpioCtrlRegs.GPADIR.all = 0xf980ul; // GPIO8、GPIO11-15 配置为输出 //DIR = GPIO16 GpioCtrlRegs.GPAPUD.bit.GPIO16 = 0; GpioDataRegs.GPADAT.bit.GPIO16 = 0; GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 0; GpioCtrlRegs.GPADIR.bit.GPIO16 = 1; // nCSIO = GPIO17 GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0; GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 0; GpioDataRegs.GPADAT.bit.GPIO17 = 1; GpioCtrlRegs.GPADIR.bit.GPIO17 = 1; // cs0 = GPIO32 GpioCtrlRegs.GPBPUD.bit.GPIO32 = 0; GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 0; GpioDataRegs.GPBDAT.bit.GPIO32 = 1; GpioCtrlRegs.GPBDIR.bit.GPIO32 = 1; // cs2 = GPIO34 GpioCtrlRegs.GPBPUD.bit.GPIO34 = 0; GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0; GpioDataRegs.GPBDAT.bit.GPIO34 = 1; GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1; // cs3 = GPIO35 GpioCtrlRegs.GPBPUD.bit.GPIO35 = 0; GpioCtrlRegs.GPBMUX1.bit.GPIO35 = 0; GpioDataRegs.GPBDAT.bit.GPIO35 = 1; GpioCtrlRegs.GPBDIR.bit.GPIO35 = 1; // cs4 = GPIO28 GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0; GpioDataRegs.GPADAT.bit.GPIO28 = 0; GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1; GpioCtrlRegs.GPADIR.bit.GPIO28 = 1; // nRESET = GPIO13 // Enable an GPIO output on GPIO13, set it high GpioCtrlRegs.GPAPUD.bit.GPIO13 = 0;// Enable pullup on GPIO13 GpioDataRegs.GPASET.bit.GPIO13 = 1;// Load output latch GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 0; // GPIO13 = GPIO13 GpioCtrlRegs.GPADIR.bit.GPIO13 = 1;// GPIO13 = output //初始化 pwm和ecap InitEPwm5Gpio(); InitECap3Gpio(9); GPIO_SetupPinOptions(9, GPIO_INPUT, GPIO_ASYNC); EALLOW; // This is needed to write to EALLOW protected registers PieVectTable.ECAP3_INT = &ecap3_ISR; EDIS;// This is needed to disable write to EALLOW protected registers InitEPwm5(); InitECap3(); //XINTRX = GPIO10 // Make GPIO10 the input source for Xint1 EALLOW; PieVectTable.XINT1_INT = &xintrx_ISR; EDIS; GPIO_SetupXINT1Gpio(10);// Xint1 connected to GPIO10 XintRegs.XINT1CR.bit.POLARITY = 1; XintRegs.XINT1CR.bit.ENABLE = 1; // Configure GPIO48 as a GPIO output pin EALLOW; GpioCtrlRegs.GPBMUX2.bit.GPIO48 = 0; GpioCtrlRegs.GPBDIR.bit.GPIO48 = 1; EDIS; IER |= M_INT1; // PieCtrlRegs.PIEIER1.bit.INTx4 = 1; IER |= M_INT4; PieCtrlRegs.PIEIER4.bit.INTx3 = 1; EINT; ERTM; CreateSysTimerInterface()->Start(inport,2u); }
Green Deng:你是指实现程序中用中文描写的功能吗?
芯片功能配置方面你都可以参考例程,如eCAP配置可以参考:
C:\ti\c2000\C2000Ware_2_00_00_03\device_support\f2837xs\examples\cpu1\ecap_capture_pwm
/* global (called in other files) */ extern void int_rx_mnm1221_m(void); /* use in INTRX interrupt */ extern short ctrl_mnm1221_m(void); /* use in timer interrupt for NC */ __interrupt void xintrx_ISR(void) { int_rx_mnm1221_m(); PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; } __interrupt void ecap3_ISR(void) {ECap3Regs.ECCLR.bit.CEVT1 = 1;ECap3Regs.ECCLR.bit.CEVT2 = 1;ECap3Regs.ECCLR.bit.CEVT3 = 1;ECap3Regs.ECCLR.bit.CEVT4 = 1;ECap3Regs.ECCLR.bit.INT = 1;phase_monitor = ctrl_mnm1221_m ();// Acknowledge this interrupt to receive more interrupts from group 3PieCtrlRegs.PIEACK.all = PIEACK_GROUP4; } short monitor_phase (void) { return phase_monitor; } static void InitEPwm5 (void) { EALLOW; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0; EDIS; EPwm5Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // Count up EPwm5Regs.TBPRD = 37499; EPwm5Regs.TBPHS.all = 0x00000000; EPwm5Regs.AQCTLA.bit.PRD = AQ_TOGGLE;// Toggle on PRD // // TBCLK = SYSCLKOUT // EPwm5Regs.TBCTL.bit.HSPCLKDIV = 1; EPwm5Regs.TBCTL.bit.CLKDIV = 0; // EPwm5TimerDirection = EPWM_TIMER_UP; EALLOW; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1; EDIS; } static void InitECap3(void) { ECap3Regs.ECEINT.all = 0x0000;// Disable all capture __interrupts ECap3Regs.ECCLR.all = 0xFFFF;// Clear all CAP __interrupt flags ECap3Regs.ECCTL1.bit.CAPLDEN = 0;// Disable CAP1-CAP4 register loads ECap3Regs.ECCTL2.bit.TSCTRSTOP = 0;// Make sure the counter is stopped // // Configure peripheral registers // ECap3Regs.ECCTL2.bit.CONT_ONESHT = 1;// One-shot ECap3Regs.ECCTL2.bit.STOP_WRAP = 3;// Stop at 4 events ECap3Regs.ECCTL1.bit.CAP1POL = 1;// Falling edge ECap3Regs.ECCTL1.bit.CAP2POL = 0;// Rising edge ECap3Regs.ECCTL1.bit.CAP3POL = 1;// Falling edge ECap3Regs.ECCTL1.bit.CAP4POL = 0;// Rising edge ECap3Regs.ECCTL1.bit.CTRRST1 = 1;// Difference operation ECap3Regs.ECCTL1.bit.CTRRST2 = 1;// Difference operation ECap3Regs.ECCTL1.bit.CTRRST3 = 1;// Difference operation ECap3Regs.ECCTL1.bit.CTRRST4 = 1;// Difference operation ECap3Regs.ECCTL2.bit.SYNCI_EN = 1;// Enable sync in ECap3Regs.ECCTL2.bit.SYNCO_SEL = 0;// Pass through ECap3Regs.ECCTL1.bit.CAPLDEN = 1;// Enable capture units ECap3Regs.ECCTL2.bit.TSCTRSTOP = 1;// Start Counter ECap3Regs.ECCTL2.bit.REARM = 1;// arm one-shot ECap3Regs.ECCTL1.bit.CAPLDEN = 1;// Enable CAP1-CAP4 register loads ECap3Regs.ECEINT.bit.CEVT4 = 1;// 4 events = __interrupt } /// ---------------------------------------------------------------------------------- static void IoInit(void) { EALLOW; // nOE/nCS 默认拉为高电平,其余GPIO默认拉为低电平 // 经过 InitGpio 初始化后, // 所有端口默认都是GPIO口,且IO口已经开启上拉使能,默认时需要拉低电平 // GPIO8特殊用途,当需要允许控制IO板的第4排输出时,需要拉低,否则拉高 GpioDataRegs.GPACLEAR.all = 0x3900ul; // 拉低端口 // GpioDataRegs.GPASET.bit.GPIO8 = 1; // 拉高端口 GpioCtrlRegs.GPADIR.all = 0xf980ul; // GPIO8、GPIO11-15 配置为输出 //DIR = GPIO16 GpioCtrlRegs.GPAPUD.bit.GPIO16 = 0; GpioDataRegs.GPADAT.bit.GPIO16 = 0; GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 0; GpioCtrlRegs.GPADIR.bit.GPIO16 = 1; // nCSIO = GPIO17 GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0; GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 0; GpioDataRegs.GPADAT.bit.GPIO17 = 1; GpioCtrlRegs.GPADIR.bit.GPIO17 = 1; // cs0 = GPIO32 GpioCtrlRegs.GPBPUD.bit.GPIO32 = 0; GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 0; GpioDataRegs.GPBDAT.bit.GPIO32 = 1; GpioCtrlRegs.GPBDIR.bit.GPIO32 = 1; // cs2 = GPIO34 GpioCtrlRegs.GPBPUD.bit.GPIO34 = 0; GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0; GpioDataRegs.GPBDAT.bit.GPIO34 = 1; GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1; // cs3 = GPIO35 GpioCtrlRegs.GPBPUD.bit.GPIO35 = 0; GpioCtrlRegs.GPBMUX1.bit.GPIO35 = 0; GpioDataRegs.GPBDAT.bit.GPIO35 = 1; GpioCtrlRegs.GPBDIR.bit.GPIO35 = 1; // cs4 = GPIO28 GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0; GpioDataRegs.GPADAT.bit.GPIO28 = 0; GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1; GpioCtrlRegs.GPADIR.bit.GPIO28 = 1; // nRESET = GPIO13 // Enable an GPIO output on GPIO13, set it high GpioCtrlRegs.GPAPUD.bit.GPIO13 = 0;// Enable pullup on GPIO13 GpioDataRegs.GPASET.bit.GPIO13 = 1;// Load output latch GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 0; // GPIO13 = GPIO13 GpioCtrlRegs.GPADIR.bit.GPIO13 = 1;// GPIO13 = output //初始化 pwm和ecap InitEPwm5Gpio(); InitECap3Gpio(9); GPIO_SetupPinOptions(9, GPIO_INPUT, GPIO_ASYNC); EALLOW; // This is needed to write to EALLOW protected registers PieVectTable.ECAP3_INT = &ecap3_ISR; EDIS;// This is needed to disable write to EALLOW protected registers InitEPwm5(); InitECap3(); //XINTRX = GPIO10 // Make GPIO10 the input source for Xint1 EALLOW; PieVectTable.XINT1_INT = &xintrx_ISR; EDIS; GPIO_SetupXINT1Gpio(10);// Xint1 connected to GPIO10 XintRegs.XINT1CR.bit.POLARITY = 1; XintRegs.XINT1CR.bit.ENABLE = 1; // Configure GPIO48 as a GPIO output pin EALLOW; GpioCtrlRegs.GPBMUX2.bit.GPIO48 = 0; GpioCtrlRegs.GPBDIR.bit.GPIO48 = 1; EDIS; IER |= M_INT1; // PieCtrlRegs.PIEIER1.bit.INTx4 = 1; IER |= M_INT4; PieCtrlRegs.PIEIER4.bit.INTx3 = 1; EINT; ERTM; CreateSysTimerInterface()->Start(inport,2u); }
user5784884:
回复 Green Deng:
是的,在133行开始初始化pwm和ecap ,调用了的28377的自带函数,不知道为什么无法产生pwm,中断也不会进入