Skip to content

Commit 138189b

Browse files
committed
Free timers when modules de-init
1 parent dc6902a commit 138189b

File tree

9 files changed

+16
-17
lines changed

9 files changed

+16
-17
lines changed

ports/stm/.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,5 @@ build-*/
55
# Reference files
66
#####################
77
ref/
8-
_working*
98

109
.gdb_history

ports/stm/common-hal/microcontroller/Pin.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,10 @@ bool pin_number_is_free(uint8_t pin_port, uint8_t pin_number) {
116116
return !(claimed_pins[pin_port] & 1<<pin_number);
117117
}
118118

119+
bool pin_number_is_resettable(uint8_t pin_port, uint8_t pin_number) {
120+
return !(never_reset_pins[pin_port] & 1<<pin_number);
121+
}
122+
119123
bool common_hal_mcu_pin_is_free(const mcu_pin_obj_t *pin) {
120124
#ifdef MICROPY_HW_NEOPIXEL
121125
if (pin == MICROPY_HW_NEOPIXEL) {

ports/stm/common-hal/microcontroller/Pin.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ void reset_all_pins(void);
4545
void reset_pin_number(uint8_t pin_port, uint8_t pin_number);
4646
void claim_pin(const mcu_pin_obj_t* pin);
4747
bool pin_number_is_free(uint8_t pin_port, uint8_t pin_number);
48+
bool pin_number_is_resettable(uint8_t pin_port, uint8_t pin_number)
4849
void never_reset_pin_number(uint8_t pin_port, uint8_t pin_number);
4950
GPIO_TypeDef * pin_port(uint8_t pin_port);
5051
uint16_t pin_mask(uint8_t pin_number);

ports/stm/common-hal/pulseio/PWMOut.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ void common_hal_pulseio_pwmout_deinit(pulseio_pwmout_obj_t* self) {
244244
//if reserved timer has no active channels, we can disable it
245245
if (!reserved_tim[self->tim->tim_index - 1]) {
246246
tim_frequencies[self->tim->tim_index - 1] = 0x00;
247-
tim_clock_disable(1 << (self->tim->tim_index - 1));
247+
stm_peripherals_timer_free(self->handle.Instance);
248248
}
249249
}
250250

ports/stm/common-hal/pulseio/PulseIn.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,14 +186,13 @@ void common_hal_pulseio_pulsein_deinit(pulseio_pulsein_obj_t* self) {
186186
return;
187187
}
188188
//Remove pulsein slot from shared array
189-
HAL_NVIC_DisableIRQ(self->irq);
190189
_objs[self->pin->number] = NULL;
191190
reset_pin_number(self->pin->port, self->pin->number);
192191
self->pin = NULL;
193192

194193
refcount--;
195194
if (refcount == 0) {
196-
tim_clock_disable(1<< stm_peripherals_timer_get_index(tim_handle.Instance));
195+
stm_peripherals_timer_free(tim_handle.Instance);
197196
}
198197
}
199198

ports/stm/common-hal/pulseio/PulseOut.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ void common_hal_pulseio_pulseout_deinit(pulseio_pulseout_obj_t* self) {
152152

153153
refcount--;
154154
if (refcount == 0) {
155-
tim_clock_disable(1<< stm_peripherals_timer_get_index(tim_handle.Instance));
155+
stm_peripherals_timer_free(tim_handle.Instance);
156156
}
157157
}
158158

ports/stm/common-hal/rgbmatrix/RGBMatrix.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,20 +34,23 @@
3434
extern void _PM_IRQ_HANDLER(void);
3535

3636
void *common_hal_rgbmatrix_timer_allocate() {
37-
return stm_peripherals_find_timer();
37+
TIM_TypeDef * timer = stm_peripherals_find_timer();
38+
stm_peripherals_timer_reserve(timer);
39+
return timer;
3840
}
3941

4042
void common_hal_rgbmatrix_timer_enable(void* ptr) {
41-
HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);
43+
TIM_TypeDef *tim = (TIM_TypeDef*)ptr;
44+
HAL_NVIC_EnableIRQ(stm_peripherals_timer_get_irqnum(tim));
4245
}
4346

4447
void common_hal_rgbmatrix_timer_disable(void* ptr) {
4548
TIM_TypeDef *tim = (TIM_TypeDef*)ptr;
4649
tim->DIER &= ~TIM_DIER_UIE;
47-
HAL_NVIC_DisableIRQ(TIM6_DAC_IRQn);
4850
}
4951

5052
void common_hal_rgbmatrix_timer_free(void* ptr) {
53+
TIM_TypeDef *tim = (TIM_TypeDef*)ptr;
54+
stm_peripherals_timer_free(tim);
5155
common_hal_rgbmatrix_timer_disable(ptr);
52-
// TODO(jepler) properly handle resource allocation including never-reset
5356
}

ports/stm/peripherals/timers.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@ void stm_peripherals_timer_set_callback(void(*callback)(void), TIM_TypeDef * tim
233233

234234
void stm_peripherals_timer_free(TIM_TypeDef * instance) {
235235
size_t tim_idx = stm_peripherals_timer_get_index(instance);
236+
HAL_NVIC_DisableIRQ(irq_map[tim_idx]);
236237
stm_timer_callback[tim_idx] = NULL;
237238
tim_clock_disable(1 << tim_idx);
238239
stm_timer_reserved[tim_idx] = false;

ports/stm/peripherals/timers.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,6 @@
2424
* THE SOFTWARE.
2525
*/
2626

27-
// typedef struct {
28-
// TIM_TypeDef * timer;
29-
// bool reserved;
30-
// bool never_reset;
31-
// void (*stm_timer_callback)(void);
32-
// size_t irq;
33-
// } stm_timer_t;
34-
3527
#include <stdint.h>
3628
#include "py/mphal.h"
3729
#include "peripherals/periph.h"

0 commit comments

Comments
 (0)