summaryrefslogtreecommitdiff
path: root/ports/stm32/timer.c
diff options
context:
space:
mode:
Diffstat (limited to 'ports/stm32/timer.c')
-rw-r--r--ports/stm32/timer.c198
1 files changed, 121 insertions, 77 deletions
diff --git a/ports/stm32/timer.c b/ports/stm32/timer.c
index 0c120e74d..1b32d8ada 100644
--- a/ports/stm32/timer.c
+++ b/ports/stm32/timer.c
@@ -94,8 +94,8 @@ typedef enum {
} pyb_channel_mode;
STATIC const struct {
- qstr name;
- uint32_t oc_mode;
+ qstr name;
+ uint32_t oc_mode;
} channel_mode_info[] = {
{ MP_QSTR_PWM, TIM_OCMODE_PWM1 },
{ MP_QSTR_PWM_INVERTED, TIM_OCMODE_PWM2 },
@@ -295,7 +295,7 @@ STATIC uint32_t compute_prescaler_period_from_freq(pyb_timer_obj_t *self, mp_obj
mp_int_t freq = mp_obj_get_int(freq_in);
if (freq <= 0) {
goto bad_freq;
- bad_freq:
+ bad_freq:
mp_raise_ValueError("must have positive freq");
}
period = source_freq / freq;
@@ -471,19 +471,19 @@ STATIC mp_int_t compute_ticks_from_dtg(uint32_t dtg) {
STATIC void config_deadtime(pyb_timer_obj_t *self, mp_int_t ticks, mp_int_t brk) {
TIM_BreakDeadTimeConfigTypeDef deadTimeConfig;
- deadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
+ deadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
deadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
- deadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
- deadTimeConfig.DeadTime = compute_dtg_from_ticks(ticks);
- deadTimeConfig.BreakState = brk == BRK_OFF ? TIM_BREAK_DISABLE : TIM_BREAK_ENABLE;
- deadTimeConfig.BreakPolarity = brk == BRK_LOW ? TIM_BREAKPOLARITY_LOW : TIM_BREAKPOLARITY_HIGH;
+ deadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
+ deadTimeConfig.DeadTime = compute_dtg_from_ticks(ticks);
+ deadTimeConfig.BreakState = brk == BRK_OFF ? TIM_BREAK_DISABLE : TIM_BREAK_ENABLE;
+ deadTimeConfig.BreakPolarity = brk == BRK_LOW ? TIM_BREAKPOLARITY_LOW : TIM_BREAKPOLARITY_HIGH;
#if defined(STM32F7) || defined(STM32H7) | defined(STM32L4)
- deadTimeConfig.BreakFilter = 0;
- deadTimeConfig.Break2State = TIM_BREAK_DISABLE;
- deadTimeConfig.Break2Polarity = TIM_BREAKPOLARITY_LOW;
- deadTimeConfig.Break2Filter = 0;
+ deadTimeConfig.BreakFilter = 0;
+ deadTimeConfig.Break2State = TIM_BREAK_DISABLE;
+ deadTimeConfig.Break2Polarity = TIM_BREAKPOLARITY_LOW;
+ deadTimeConfig.Break2Filter = 0;
#endif
- deadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
+ deadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
HAL_TIMEx_ConfigBreakDeadTime(&self->tim, &deadTimeConfig);
}
@@ -632,8 +632,8 @@ STATIC mp_obj_t pyb_timer_init_helper(pyb_timer_obj_t *self, size_t n_args, cons
}
init->ClockDivision = args[ARG_div].u_int == 2 ? TIM_CLOCKDIVISION_DIV2 :
- args[ARG_div].u_int == 4 ? TIM_CLOCKDIVISION_DIV4 :
- TIM_CLOCKDIVISION_DIV1;
+ args[ARG_div].u_int == 4 ? TIM_CLOCKDIVISION_DIV4 :
+ TIM_CLOCKDIVISION_DIV1;
#if !defined(STM32L0)
init->RepetitionCounter = 0;
@@ -642,68 +642,112 @@ STATIC mp_obj_t pyb_timer_init_helper(pyb_timer_obj_t *self, size_t n_args, cons
// enable TIM clock
switch (self->tim_id) {
#if defined(TIM1)
- case 1: __HAL_RCC_TIM1_CLK_ENABLE(); break;
+ case 1:
+ __HAL_RCC_TIM1_CLK_ENABLE();
+ break;
#endif
- case 2: __HAL_RCC_TIM2_CLK_ENABLE(); break;
+ case 2:
+ __HAL_RCC_TIM2_CLK_ENABLE();
+ break;
#if defined(TIM3)
- case 3: __HAL_RCC_TIM3_CLK_ENABLE(); break;
+ case 3:
+ __HAL_RCC_TIM3_CLK_ENABLE();
+ break;
#endif
#if defined(TIM4)
- case 4: __HAL_RCC_TIM4_CLK_ENABLE(); break;
+ case 4:
+ __HAL_RCC_TIM4_CLK_ENABLE();
+ break;
#endif
#if defined(TIM5)
- case 5: __HAL_RCC_TIM5_CLK_ENABLE(); break;
+ case 5:
+ __HAL_RCC_TIM5_CLK_ENABLE();
+ break;
#endif
#if defined(TIM6)
- case 6: __HAL_RCC_TIM6_CLK_ENABLE(); break;
+ case 6:
+ __HAL_RCC_TIM6_CLK_ENABLE();
+ break;
#endif
#if defined(TIM7)
- case 7: __HAL_RCC_TIM7_CLK_ENABLE(); break;
+ case 7:
+ __HAL_RCC_TIM7_CLK_ENABLE();
+ break;
#endif
#if defined(TIM8)
- case 8: __HAL_RCC_TIM8_CLK_ENABLE(); break;
+ case 8:
+ __HAL_RCC_TIM8_CLK_ENABLE();
+ break;
#endif
#if defined(TIM9)
- case 9: __HAL_RCC_TIM9_CLK_ENABLE(); break;
+ case 9:
+ __HAL_RCC_TIM9_CLK_ENABLE();
+ break;
#endif
#if defined(TIM10)
- case 10: __HAL_RCC_TIM10_CLK_ENABLE(); break;
+ case 10:
+ __HAL_RCC_TIM10_CLK_ENABLE();
+ break;
#endif
#if defined(TIM11)
- case 11: __HAL_RCC_TIM11_CLK_ENABLE(); break;
+ case 11:
+ __HAL_RCC_TIM11_CLK_ENABLE();
+ break;
#endif
#if defined(TIM12)
- case 12: __HAL_RCC_TIM12_CLK_ENABLE(); break;
+ case 12:
+ __HAL_RCC_TIM12_CLK_ENABLE();
+ break;
#endif
#if defined(TIM13)
- case 13: __HAL_RCC_TIM13_CLK_ENABLE(); break;
+ case 13:
+ __HAL_RCC_TIM13_CLK_ENABLE();
+ break;
#endif
#if defined(TIM14)
- case 14: __HAL_RCC_TIM14_CLK_ENABLE(); break;
+ case 14:
+ __HAL_RCC_TIM14_CLK_ENABLE();
+ break;
#endif
#if defined(TIM15)
- case 15: __HAL_RCC_TIM15_CLK_ENABLE(); break;
+ case 15:
+ __HAL_RCC_TIM15_CLK_ENABLE();
+ break;
#endif
#if defined(TIM16)
- case 16: __HAL_RCC_TIM16_CLK_ENABLE(); break;
+ case 16:
+ __HAL_RCC_TIM16_CLK_ENABLE();
+ break;
#endif
#if defined(TIM17)
- case 17: __HAL_RCC_TIM17_CLK_ENABLE(); break;
+ case 17:
+ __HAL_RCC_TIM17_CLK_ENABLE();
+ break;
#endif
#if defined(TIM18)
- case 18: __HAL_RCC_TIM18_CLK_ENABLE(); break;
+ case 18:
+ __HAL_RCC_TIM18_CLK_ENABLE();
+ break;
#endif
#if defined(TIM19)
- case 19: __HAL_RCC_TIM19_CLK_ENABLE(); break;
+ case 19:
+ __HAL_RCC_TIM19_CLK_ENABLE();
+ break;
#endif
#if defined(TIM20)
- case 20: __HAL_RCC_TIM20_CLK_ENABLE(); break;
+ case 20:
+ __HAL_RCC_TIM20_CLK_ENABLE();
+ break;
#endif
#if defined(TIM21)
- case 21: __HAL_RCC_TIM21_CLK_ENABLE(); break;
+ case 21:
+ __HAL_RCC_TIM21_CLK_ENABLE();
+ break;
#endif
#if defined(TIM22)
- case 22: __HAL_RCC_TIM22_CLK_ENABLE(); break;
+ case 22:
+ __HAL_RCC_TIM22_CLK_ENABLE();
+ break;
#endif
}
@@ -730,7 +774,7 @@ STATIC mp_obj_t pyb_timer_init_helper(pyb_timer_obj_t *self, size_t n_args, cons
if (IS_TIM_BREAK_INSTANCE(self->tim.Instance)) {
#else
if (0) {
- #endif
+ #endif
config_deadtime(self, args[ARG_deadtime].u_int, args[ARG_brk].u_int);
}
@@ -858,7 +902,7 @@ STATIC mp_obj_t pyb_timer_make_new(const mp_obj_type_t *type, size_t n_args, siz
tim->is_32bit = tim_id == 2 || tim_id == 5;
tim->callback = mp_const_none;
uint32_t ti = tim_instance_table[tim_id - 1];
- tim->tim.Instance = (TIM_TypeDef*)(ti & 0xffffff00);
+ tim->tim.Instance = (TIM_TypeDef *)(ti & 0xffffff00);
tim->irqn = ti & 0xff;
MP_STATE_PORT(pyb_timer_obj_all)[tim_id - 1] = tim;
} else {
@@ -1085,11 +1129,11 @@ STATIC mp_obj_t pyb_timer_channel(size_t n_args, const mp_obj_t *pos_args, mp_ma
// use absolute pulse width value (defaults to 0 if nothing given)
oc_config.Pulse = args[3].u_int;
}
- oc_config.OCPolarity = TIM_OCPOLARITY_HIGH;
- oc_config.OCFastMode = TIM_OCFAST_DISABLE;
+ oc_config.OCPolarity = TIM_OCPOLARITY_HIGH;
+ oc_config.OCFastMode = TIM_OCFAST_DISABLE;
#if !defined(STM32L0)
- oc_config.OCNPolarity = TIM_OCNPOLARITY_HIGH;
- oc_config.OCIdleState = TIM_OCIDLESTATE_SET;
+ oc_config.OCNPolarity = TIM_OCNPOLARITY_HIGH;
+ oc_config.OCIdleState = TIM_OCIDLESTATE_SET;
oc_config.OCNIdleState = TIM_OCNIDLESTATE_SET;
#endif
@@ -1115,20 +1159,20 @@ STATIC mp_obj_t pyb_timer_channel(size_t n_args, const mp_obj_t *pos_args, mp_ma
case CHANNEL_MODE_OC_FORCED_ACTIVE:
case CHANNEL_MODE_OC_FORCED_INACTIVE: {
TIM_OC_InitTypeDef oc_config;
- oc_config.OCMode = channel_mode_info[chan->mode].oc_mode;
- oc_config.Pulse = args[5].u_int;
- oc_config.OCPolarity = args[6].u_int;
+ oc_config.OCMode = channel_mode_info[chan->mode].oc_mode;
+ oc_config.Pulse = args[5].u_int;
+ oc_config.OCPolarity = args[6].u_int;
if (oc_config.OCPolarity == 0xffffffff) {
oc_config.OCPolarity = TIM_OCPOLARITY_HIGH;
}
- oc_config.OCFastMode = TIM_OCFAST_DISABLE;
+ oc_config.OCFastMode = TIM_OCFAST_DISABLE;
#if !defined(STM32L0)
if (oc_config.OCPolarity == TIM_OCPOLARITY_HIGH) {
- oc_config.OCNPolarity = TIM_OCNPOLARITY_HIGH;
+ oc_config.OCNPolarity = TIM_OCNPOLARITY_HIGH;
} else {
- oc_config.OCNPolarity = TIM_OCNPOLARITY_LOW;
+ oc_config.OCNPolarity = TIM_OCNPOLARITY_LOW;
}
- oc_config.OCIdleState = TIM_OCIDLESTATE_SET;
+ oc_config.OCIdleState = TIM_OCIDLESTATE_SET;
oc_config.OCNIdleState = TIM_OCNIDLESTATE_SET;
#endif
@@ -1153,13 +1197,13 @@ STATIC mp_obj_t pyb_timer_channel(size_t n_args, const mp_obj_t *pos_args, mp_ma
case CHANNEL_MODE_IC: {
TIM_IC_InitTypeDef ic_config;
- ic_config.ICPolarity = args[6].u_int;
+ ic_config.ICPolarity = args[6].u_int;
if (ic_config.ICPolarity == 0xffffffff) {
ic_config.ICPolarity = TIM_ICPOLARITY_RISING;
}
ic_config.ICSelection = TIM_ICSELECTION_DIRECTTI;
ic_config.ICPrescaler = TIM_ICPSC_DIV1;
- ic_config.ICFilter = 0;
+ ic_config.ICFilter = 0;
if (!IS_TIM_IC_POLARITY(ic_config.ICPolarity)) {
mp_raise_msg_varg(&mp_type_ValueError, "invalid polarity (%d)", ic_config.ICPolarity);
@@ -1179,41 +1223,41 @@ STATIC mp_obj_t pyb_timer_channel(size_t n_args, const mp_obj_t *pos_args, mp_ma
TIM_Encoder_InitTypeDef enc_config;
enc_config.EncoderMode = channel_mode_info[chan->mode].oc_mode;
- enc_config.IC1Polarity = args[6].u_int;
+ enc_config.IC1Polarity = args[6].u_int;
if (enc_config.IC1Polarity == 0xffffffff) {
enc_config.IC1Polarity = TIM_ICPOLARITY_RISING;
}
- enc_config.IC2Polarity = enc_config.IC1Polarity;
+ enc_config.IC2Polarity = enc_config.IC1Polarity;
enc_config.IC1Selection = TIM_ICSELECTION_DIRECTTI;
enc_config.IC2Selection = TIM_ICSELECTION_DIRECTTI;
enc_config.IC1Prescaler = TIM_ICPSC_DIV1;
enc_config.IC2Prescaler = TIM_ICPSC_DIV1;
- enc_config.IC1Filter = 0;
- enc_config.IC2Filter = 0;
+ enc_config.IC1Filter = 0;
+ enc_config.IC2Filter = 0;
if (!IS_TIM_IC_POLARITY(enc_config.IC1Polarity)) {
mp_raise_msg_varg(&mp_type_ValueError, "invalid polarity (%d)", enc_config.IC1Polarity);
}
// Only Timers 1, 2, 3, 4, 5, and 8 support encoder mode
if (
- #if defined(TIM1)
+ #if defined(TIM1)
self->tim.Instance != TIM1
- &&
- #endif
+ &&
+ #endif
self->tim.Instance != TIM2
- #if defined(TIM3)
- && self->tim.Instance != TIM3
- #endif
- #if defined(TIM4)
- && self->tim.Instance != TIM4
- #endif
- #if defined(TIM5)
- && self->tim.Instance != TIM5
- #endif
- #if defined(TIM8)
- && self->tim.Instance != TIM8
- #endif
- ) {
+ #if defined(TIM3)
+ && self->tim.Instance != TIM3
+ #endif
+ #if defined(TIM4)
+ && self->tim.Instance != TIM4
+ #endif
+ #if defined(TIM5)
+ && self->tim.Instance != TIM5
+ #endif
+ #if defined(TIM8)
+ && self->tim.Instance != TIM8
+ #endif
+ ) {
mp_raise_msg_varg(&mp_type_ValueError, "encoder not supported on timer %d", self->tim_id);
}
@@ -1394,7 +1438,7 @@ const mp_obj_type_t pyb_timer_type = {
.name = MP_QSTR_Timer,
.print = pyb_timer_print,
.make_new = pyb_timer_make_new,
- .locals_dict = (mp_obj_dict_t*)&pyb_timer_locals_dict,
+ .locals_dict = (mp_obj_dict_t *)&pyb_timer_locals_dict,
};
/// \moduleref pyb
@@ -1407,9 +1451,9 @@ STATIC void pyb_timer_channel_print(const mp_print_t *print, mp_obj_t self_in, m
pyb_timer_channel_obj_t *self = MP_OBJ_TO_PTR(self_in);
mp_printf(print, "TimerChannel(timer=%u, channel=%u, mode=%s)",
- self->timer->tim_id,
- self->channel,
- qstr_str(channel_mode_info[self->mode].name));
+ self->timer->tim_id,
+ self->channel,
+ qstr_str(channel_mode_info[self->mode].name));
}
/// \method capture([value])
@@ -1529,7 +1573,7 @@ STATIC const mp_obj_type_t pyb_timer_channel_type = {
{ &mp_type_type },
.name = MP_QSTR_TimerChannel,
.print = pyb_timer_channel_print,
- .locals_dict = (mp_obj_dict_t*)&pyb_timer_channel_locals_dict,
+ .locals_dict = (mp_obj_dict_t *)&pyb_timer_channel_locals_dict,
};
STATIC void timer_handle_irq_channel(pyb_timer_obj_t *tim, uint8_t channel, mp_obj_t callback) {