summaryrefslogtreecommitdiff
path: root/ports/stm/common-hal/pulseio/PulseIn.c
diff options
context:
space:
mode:
Diffstat (limited to 'ports/stm/common-hal/pulseio/PulseIn.c')
-rw-r--r--ports/stm/common-hal/pulseio/PulseIn.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/ports/stm/common-hal/pulseio/PulseIn.c b/ports/stm/common-hal/pulseio/PulseIn.c
index 478077eda..db01968c4 100644
--- a/ports/stm/common-hal/pulseio/PulseIn.c
+++ b/ports/stm/common-hal/pulseio/PulseIn.c
@@ -102,7 +102,9 @@ void pulsein_reset(void) {
}
memset(_objs, 0, sizeof(_objs));
+ HAL_TIM_Base_DeInit(&tim_handle);
tim_clock_disable(stm_peripherals_timer_get_index(tim_handle.Instance));
+ memset(&tim_handle, 0, sizeof(tim_handle));
refcount = 0;
}
@@ -133,21 +135,22 @@ void common_hal_pulseio_pulsein_construct(pulseio_pulsein_obj_t* self, const mcu
self->last_count = 0;
self->last_overflow = 0;
- if (HAL_TIM_Base_GetState(&tim_handle) == HAL_TIM_STATE_RESET) { //TODO: there's no state yet
+ if (HAL_TIM_Base_GetState(&tim_handle) == HAL_TIM_STATE_RESET) {
// Find a suitable timer
TIM_TypeDef * tim_instance = stm_peripherals_find_timer();
stm_peripherals_timer_reserve(tim_instance);
- // Calculate a 1ms period
+ // Set ticks to 1us
uint32_t source = stm_peripherals_timer_get_source_freq(tim_instance);
- uint32_t prescaler = source/1000000; // 1us intervals
+ uint32_t prescaler = source/1000000;
+ // Enable clocks and IRQ, set callback
stm_peripherals_timer_preinit(tim_instance, 4, pulsein_timer_event_handler);
// Set the new period
tim_handle.Instance = tim_instance;
- tim_handle.Init.Prescaler = prescaler; // divide down to 1mhz
- tim_handle.Init.Period = 0xffff;
+ tim_handle.Init.Prescaler = prescaler - 1;
+ tim_handle.Init.Period = 0x10000 - 1; //65 ms period (maximum)
HAL_TIM_Base_Init(&tim_handle);
// Set registers manually