|
|
@ -40,8 +40,12 @@ void UFCAP_TimerHandler(void *arg) |
|
|
|
if (priv->opmode == OPMODE_PWM_CONT) { |
|
|
|
if (priv->opmode == OPMODE_PWM_CONT) { |
|
|
|
if (LL_TIM_IsActiveFlag_CC1(TIMx)) { |
|
|
|
if (LL_TIM_IsActiveFlag_CC1(TIMx)) { |
|
|
|
// assert_param(!LL_TIM_IsActiveFlag_CC1OVR(TIMx));
|
|
|
|
// assert_param(!LL_TIM_IsActiveFlag_CC1OVR(TIMx));
|
|
|
|
|
|
|
|
if (priv->n_skip > 0) { |
|
|
|
|
|
|
|
priv->n_skip--; |
|
|
|
|
|
|
|
} else { |
|
|
|
priv->pwm_cont.last_period = LL_TIM_IC_GetCaptureCH1(TIMx); |
|
|
|
priv->pwm_cont.last_period = LL_TIM_IC_GetCaptureCH1(TIMx); |
|
|
|
priv->pwm_cont.last_ontime = priv->pwm_cont.ontime; |
|
|
|
priv->pwm_cont.last_ontime = priv->pwm_cont.ontime; |
|
|
|
|
|
|
|
} |
|
|
|
LL_TIM_ClearFlag_CC1(TIMx); |
|
|
|
LL_TIM_ClearFlag_CC1(TIMx); |
|
|
|
LL_TIM_ClearFlag_CC1OVR(TIMx); |
|
|
|
LL_TIM_ClearFlag_CC1OVR(TIMx); |
|
|
|
} |
|
|
|
} |
|
|
@ -59,8 +63,8 @@ void UFCAP_TimerHandler(void *arg) |
|
|
|
const uint32_t period = LL_TIM_IC_GetCaptureCH1(TIMx); |
|
|
|
const uint32_t period = LL_TIM_IC_GetCaptureCH1(TIMx); |
|
|
|
const uint32_t ontime = priv->pwm_burst.ontime; |
|
|
|
const uint32_t ontime = priv->pwm_burst.ontime; |
|
|
|
|
|
|
|
|
|
|
|
if (priv->pwm_burst.n_skip > 0) { |
|
|
|
if (priv->n_skip > 0) { |
|
|
|
priv->pwm_burst.n_skip--; |
|
|
|
priv->n_skip--; |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
priv->pwm_burst.ontime_acu += ontime; |
|
|
|
priv->pwm_burst.ontime_acu += ontime; |
|
|
|
priv->pwm_burst.period_acu += period; |
|
|
|
priv->pwm_burst.period_acu += period; |
|
|
@ -108,21 +112,25 @@ static void UFCAP_ClearTimerConfig(Unit *unit) |
|
|
|
LL_TIM_GenerateEvent_UPDATE(TIMx); |
|
|
|
LL_TIM_GenerateEvent_UPDATE(TIMx); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* Reset all timer registers |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* @param unit |
|
|
|
|
|
|
|
*/ |
|
|
|
void UFCAP_StopMeasurement(Unit *unit) |
|
|
|
void UFCAP_StopMeasurement(Unit *unit) |
|
|
|
{ |
|
|
|
{ |
|
|
|
struct priv * const priv = unit->data; |
|
|
|
struct priv * const priv = unit->data; |
|
|
|
TIM_TypeDef * const TIMx = priv->TIMx; |
|
|
|
TIM_TypeDef * const TIMx = priv->TIMx; |
|
|
|
|
|
|
|
|
|
|
|
LL_TIM_DisableCounter(TIMx); |
|
|
|
LL_TIM_DeInit(TIMx); // clear all flags and settings
|
|
|
|
LL_TIM_DisableIT_CC1(TIMx); |
|
|
|
|
|
|
|
LL_TIM_DisableIT_CC2(TIMx); |
|
|
|
|
|
|
|
LL_TIM_ClearFlag_CC1(TIMx); |
|
|
|
|
|
|
|
LL_TIM_ClearFlag_CC2(TIMx); |
|
|
|
|
|
|
|
LL_TIM_ClearFlag_CC1OVR(TIMx); |
|
|
|
|
|
|
|
LL_TIM_ClearFlag_CC2OVR(TIMx); |
|
|
|
|
|
|
|
LL_TIM_SetCounter(TIMx, 0); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* Switch the FCAP module opmode |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* @param unit |
|
|
|
|
|
|
|
* @param opmode |
|
|
|
|
|
|
|
*/ |
|
|
|
void UFCAP_SwitchMode(Unit *unit, enum fcap_opmode opmode) |
|
|
|
void UFCAP_SwitchMode(Unit *unit, enum fcap_opmode opmode) |
|
|
|
{ |
|
|
|
{ |
|
|
|
struct priv * const priv = unit->data; |
|
|
|
struct priv * const priv = unit->data; |
|
|
@ -141,15 +149,16 @@ void UFCAP_SwitchMode(Unit *unit, enum fcap_opmode opmode) |
|
|
|
priv->pwm_cont.last_ontime = 0; |
|
|
|
priv->pwm_cont.last_ontime = 0; |
|
|
|
priv->pwm_cont.last_period = 0; |
|
|
|
priv->pwm_cont.last_period = 0; |
|
|
|
priv->pwm_cont.ontime = 0; |
|
|
|
priv->pwm_cont.ontime = 0; |
|
|
|
|
|
|
|
priv->n_skip = 1; // discard the first cycle (will be incomplete)
|
|
|
|
UFCAP_ConfigureForPWMCapture(unit); // is also stopped and restarted
|
|
|
|
UFCAP_ConfigureForPWMCapture(unit); // is also stopped and restarted
|
|
|
|
break; |
|
|
|
break; |
|
|
|
|
|
|
|
|
|
|
|
case OPMODE_PWM_BURST: |
|
|
|
case OPMODE_PWM_BURST: |
|
|
|
priv->pwm_burst.ontime = 0; |
|
|
|
priv->pwm_burst.ontime = 0; |
|
|
|
priv->pwm_burst.n_count = 0; |
|
|
|
priv->pwm_burst.n_count = 0; |
|
|
|
priv->pwm_burst.n_skip = 1; // discard the first cycle (will be incomplete)
|
|
|
|
|
|
|
|
priv->pwm_burst.period_acu = 0; |
|
|
|
priv->pwm_burst.period_acu = 0; |
|
|
|
priv->pwm_burst.ontime_acu = 0; |
|
|
|
priv->pwm_burst.ontime_acu = 0; |
|
|
|
|
|
|
|
priv->n_skip = 1; // discard the first cycle (will be incomplete)
|
|
|
|
UFCAP_ConfigureForPWMCapture(unit); // is also stopped and restarted
|
|
|
|
UFCAP_ConfigureForPWMCapture(unit); // is also stopped and restarted
|
|
|
|
break; |
|
|
|
break; |
|
|
|
default: |
|
|
|
default: |
|
|
@ -157,6 +166,10 @@ void UFCAP_SwitchMode(Unit *unit, enum fcap_opmode opmode) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* Configure peripherals for an indirect capture (PWM measurement) - continuous or burst |
|
|
|
|
|
|
|
* @param unit |
|
|
|
|
|
|
|
*/ |
|
|
|
void UFCAP_ConfigureForPWMCapture(Unit *unit) |
|
|
|
void UFCAP_ConfigureForPWMCapture(Unit *unit) |
|
|
|
{ |
|
|
|
{ |
|
|
|
struct priv * const priv = unit->data; |
|
|
|
struct priv * const priv = unit->data; |
|
|
|