MD2 etmr0配置成输出比较异常问题
-
初始化:
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
}
快速上手云途开发生态
发帖前请查看
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...