Part Number:TMS320F28388DOther Parts Discussed in Thread:C2000WARE
大家好,
我想要使用28388配置epwm5并执行中断配置,我按照例程interrupt_ex4_epwm_realtime_interrupt进行配置,在debug发现无法进入中断,但在debug时候我停止调试然后点击restart后又能重新进入中断,如果烧写离线程序又无法进入中断,不知道我的代码配置是否有问题,麻烦各位帮忙解答一下,谢谢。
下面附上我的代码,我使用的是ccs12.0版本,c2000Ware是4.03版本
主函数:
void main(void) {Device_init();//// Boot CPU2 core// #ifDEBUG #ifdef _FLASH// Send boot command to allow the CPU2 application to begin executionDevice_bootCPU2(BOOTMODE_BOOT_TO_FLASH_SECTOR0);Device_bootCM(BOOTMODE_BOOT_TO_FLASH_SECTOR0); #else// Send boot command to allow the CPU2 application to begin executionDevice_bootCPU2(BOOTMODE_BOOT_TO_M0RAM);Device_bootCM(BOOTMODE_BOOT_TO_S0RAM); #endif #endif //Device_initGPIO();// syscfg配置调用Board_init();//// Initialize PIE and clear PIE registers. Disables CPU interrupts.//Interrupt_initModule();//// Initialize the PIE vector table with pointers to the shell Interrupt// Service Routines (ISR).//Interrupt_initVectorTable();EPWM_init();INTERRUPT_init();//// Enable Global Interrupt (INTM) and realtime interrupt (DBGM)//EINT;ERTM;//// Loop Forever//for(;;){} }
Epwm初始化函数:
void EPWM_init(){SysCtl_setEPWMClockDivider(SYSCTL_EPWMCLK_DIV_1);SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);EPWM_setClockPrescaler(EPWM5_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1);EPWM_disablePhaseShiftLoad(EPWM5_BASE);EPWM_setPhaseShift(EPWM5_BASE, 0);EPWM_setEmulationMode(EPWM5_BASE, EPWM_EMULATION_STOP_AFTER_FULL_CYCLE);EPWM_setTimeBasePeriod(EPWM5_BASE, myEPWM5_TBPRD);EPWM_setTimeBaseCounterMode(EPWM5_BASE, EPWM_COUNTER_MODE_UP_DOWN);EPWM_setTimeBaseCounter(EPWM5_BASE, 0U);EPWM_setPeriodLoadMode(EPWM5_BASE, EPWM_PERIOD_DIRECT_LOAD);EPWM_setInterruptSource(EPWM5_BASE, EPWM_INT_TBCTR_ZERO_OR_PERIOD);EPWM_enableInterrupt(EPWM5_BASE);EPWM_setInterruptEventCount(EPWM5_BASE, 1);SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC); }
使能中断:
void INTERRUPT_init(){// Interrupt Setings for INT_myEPWM5Interrupt_register(INT_myEPWM5, &INT_myEPWM5_ISR);Interrupt_enable(INT_myEPWM5); }
中断服务函数:
__interrupt void INT_myEPWM5_ISR(void) {count ++;if(count >= 8000){GPIO_togglePin(DEVICE_GPIO_PIN_LED_3);count = 0;}EPWM_clearEventTriggerInterruptFlag(EPWM5_BASE);Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP3); }
TFTMing:
经过排查,问题已经找到,是因为添加了
EPWM_setPeriodLoadMode(EPWM5_BASE, EPWM_PERIOD_DIRECT_LOAD);
这条语句导致的,如果注释掉该条语句能够成功进入中断,但是不明白为什么?为什么不能不用影子寄存器
,
Yale Li:
你有没有试过直接导入例程?你的工程是在例程的基础上修改的?还是自己创建工程然后从例程复制粘贴的?
,
TFTMing:
是自己创建的工程,一开始是自己从syscfg上配置的,发现无法进入中断,然后再对照例程来设置,发现例程没有下面这段代码
EPWM_setPeriodLoadMode(EPWM5_BASE, EPWM_PERIOD_DIRECT_LOAD);
我把上面这段去掉后就可以正常进入中断了,但还不清楚是什么原因
因为我需要200M的epwm时钟,只能自己配置。
,
Yale Li:
我还是建议你在例程的基础上修改,会避免很多不必要的麻烦。
需要200MHz的时钟,修改TBCTL[HSPCLKDIV ]以及PERCLKDIVSEL[EPWMCLKDIV]应该就可以了。
TFTMing 说:EPWM_setPeriodLoadMode(EPWM5_BASE, EPWM_PERIOD_DIRECT_LOAD);
这一句代码和中断并没有直接的关系,所以很难去定位问题出在哪里。
,
TFTMing:
我基本是按照例程上的来配置的,但我想改成不使用影子寄存器才配置了上面那句代码,然后就无法进入中断了。
,
Yale Li:
你能提供一下你的工程吗?
,
TFTMing:
可以,稍后我整理一下
,
Yale Li:
好的
,
TFTMing:
28388D_TEMP_CPU1.zip
你好,这是我配置epwm中断的工程,关于添加EPWM_setPeriodLoadMode(EPWM5_BASE, EPWM_PERIOD_DIRECT_LOAD);代码后无法进入中断的问题
,
Yale Li:
好的,我需要时间来看一下