TI中文支持网
TI专业的中文技术问题搜集分享网站

28377s ecap 和外部中断这样初始化有什么问题?

/* 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,中断也不会进入

赞(0)
未经允许不得转载:TI中文支持网 » 28377s ecap 和外部中断这样初始化有什么问题?
分享到: 更多 (0)