初始化:
eTMR_DRV_Deinit(eTMR_INST_oc);
eTMR_DRV_Init(eTMR_INST_oc, &eTMR_Config, &etmrState_oc);
eTMR_DRV_InitOutputCompare(eTMR_INST_oc, &eTMR_OutputCmpParamConfig);
INT_SYS_InstallHandler(eTMR0_Ch0_Ch1_IRQn, eTMR0_Ch0_Ch1_IRQHandler_OutputCompare, NULL);
INT_SYS_InstallHandler(eTMR0_Ch4_Ch5_IRQn, eTMR0_Ch4_Ch5_IRQHandler_OutputCompare, NULL);
INT_SYS_InstallHandler(eTMR0_Ch6_Ch7_IRQn, eTMR0_Ch6_Ch7_IRQHandler_OutputCompare, NULL);
/* set priority */
INT_SYS_SetPriority(eTMR0_Ch0_Ch1_IRQn,2);
INT_SYS_SetPriority(eTMR0_Ch4_Ch5_IRQn,2);
INT_SYS_SetPriority(eTMR0_Ch6_Ch7_IRQn,2);
/* Enable IRQ in NVIC level */
INT_SYS_EnableIRQ(eTMR0_Ch0_Ch1_IRQn);
INT_SYS_EnableIRQ(eTMR0_Ch4_Ch5_IRQn);
INT_SYS_EnableIRQ(eTMR0_Ch6_Ch7_IRQn);
eTMR0->INTE |= eTMR_INTE_CH0IE_MASK;
eTMR0->INTE |= eTMR_INTE_CH1IE_MASK;
eTMR0->INTE |= eTMR_INTE_CH4IE_MASK;
eTMR0->INTE |= eTMR_INTE_CH5IE_MASK;
eTMR0->INTE |= eTMR_INTE_CH6IE_MASK;
eTMR0->INTE |= eTMR_INTE_CH7IE_MASK;
eTMR_DRV_Enable(eTMR_INST_oc);
中断:
uint32_t statusFlags = 0U;
statusFlags = g_etmrBase[eTMR0_INST_PWM]->STS; //read channel status flags.
if( (statusFlags&eTMR_STS_CH6F_MASK) == eTMR_STS_CH6F_MASK ) //channel2
{
g_etmrBase[eTMR0_INST_PWM]->STS = eTMR_STS_CH6F_MASK;
//g_etmrBase[eTMR0_INST_PWM]->SYNC |= eTMR_SYNC_LDOK_MASK|eTMR_SYNC_SWTRIG_MASK;
//点火2
OC_IGN2_OnInterrupt(g_etmrBase[eTMR0_INST_PWM]->CNT);
}
if( (statusFlags&eTMR_STS_CH7F_MASK) == eTMR_STS_CH7F_MASK )
{
g_etmrBase[eTMR0_INST_PWM]->STS = eTMR_STS_CH7F_MASK;
//g_etmrBase[eTMR0_INST_PWM]->SYNC |= eTMR_SYNC_LDOK_MASK|eTMR_SYNC_SWTRIG_MASK;
//点火1
OC_IGN_OnInterrupt(g_etmrBase[eTMR0_INST_PWM]->CNT);
}
void OC_IGN_OnInterrupt(uint32_t c_val)//ch7
{
switch(MCU_PWMSignal_7_PD10_st)
{
case 0:
break;
case 1:
dri_FUN_oc_ch7_Trig(500,1);
MCU_PWMSignal_7_PD10_st = 2;
break;
case 2:
dri_FUN_oc_ch7_Trig(500,0);
MCU_PWMSignal_7_PD10_st = 1;
break;
default:
break;
}
}
触发:
void dri_FUN_oc_ch0_Trig(uint32_t time, uint32_t ST)
{
#if (M_OC_Mode == M_OC_out_PWM_Mode)
uint32_t val0_set_v;
eTMR_Type * const etmrBase = g_etmrBase[eTMR_INST_oc];
eTMR_DRV_ClearLdok(eTMR_INST_oc);
val0_set_v = etmrBase->CNT + time;
if( val0_set_v >= (etmrBase->MOD+1) )
{
val0_set_v = val0_set_v - (etmrBase->MOD+1); //correct new val0
}
eTMR_DRV_UpdateOutputCompareChannel(eTMR_INST_oc,M_MCU_ocSignal_0_ch,val0_set_v,val0_set_v,ST,ST,1);
#endif
}