mod fcap to always fully deinit the timer when IDLE

pcap
Ondřej Hruška 7 years ago
parent 1a6dd4b5ae
commit 20dfa7e158
Signed by: MightyPork
GPG Key ID: 2C5FD5035250423D
  1. 39
      units/fcap/_fcap_core.c
  2. 2
      units/fcap/_fcap_internal.h

@ -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));
priv->pwm_cont.last_period = LL_TIM_IC_GetCaptureCH1(TIMx); if (priv->n_skip > 0) {
priv->pwm_cont.last_ontime = priv->pwm_cont.ontime; priv->n_skip--;
} else {
priv->pwm_cont.last_period = LL_TIM_IC_GetCaptureCH1(TIMx);
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;

@ -33,6 +33,7 @@ struct priv {
enum fcap_opmode opmode; enum fcap_opmode opmode;
TF_ID request_id; TF_ID request_id;
uint8_t n_skip; //!< Periods to skip before starting the real capture
union { union {
struct { struct {
@ -47,7 +48,6 @@ struct priv {
uint64_t ontime_acu; //!< length of the last captured ontime, sum uint64_t ontime_acu; //!< length of the last captured ontime, sum
uint16_t n_count; //!< Periods captured uint16_t n_count; //!< Periods captured
uint16_t n_target; //!< Periods captured - requested count uint16_t n_target; //!< Periods captured - requested count
uint8_t n_skip; //!< Periods to skip before starting the real capture
} pwm_burst; } pwm_burst;
}; };
}; };

Loading…
Cancel
Save