@@ -105,9 +105,12 @@ STATIC const uint8_t nvic_irq_channel[EXTI_NUM_VECTORS] = {
105105 OTG_HS_WKUP_IRQn , TAMP_STAMP_IRQn , RTC_WKUP_IRQn
106106};
107107
108+ // Set override_callback_obj to true if you want to unconditionally set the
109+ // callback function.
110+ //
108111// NOTE: param is for C callers. Python can use closure to get an object bound
109112// with the function.
110- uint exti_register (mp_obj_t pin_obj , mp_obj_t mode_obj , mp_obj_t pull_obj , mp_obj_t callback_obj , void * param ) {
113+ uint exti_register (mp_obj_t pin_obj , mp_obj_t mode_obj , mp_obj_t pull_obj , mp_obj_t callback_obj , bool override_callback_obj , void * param ) {
111114 const pin_obj_t * pin = NULL ;
112115 uint v_line ;
113116
@@ -143,7 +146,7 @@ uint exti_register(mp_obj_t pin_obj, mp_obj_t mode_obj, mp_obj_t pull_obj, mp_ob
143146 }
144147
145148 exti_vector_t * v = & exti_vector [v_line ];
146- if (v -> callback_obj != mp_const_none && callback_obj != mp_const_none ) {
149+ if (! override_callback_obj && v -> callback_obj != mp_const_none && callback_obj != mp_const_none ) {
147150 nlr_raise (mp_obj_new_exception_msg_varg (& mp_type_ValueError , "EXTI vector %d is already in use" , v_line ));
148151 }
149152
@@ -272,7 +275,7 @@ STATIC mp_obj_t exti_make_new(mp_obj_t type_in, uint n_args, uint n_kw, const mp
272275 mp_obj_t mode_obj = args [1 ];
273276 mp_obj_t trigger_obj = args [2 ];
274277 mp_obj_t callback_obj = args [3 ];
275- self -> line = exti_register (line_obj , mode_obj , trigger_obj , callback_obj , NULL );
278+ self -> line = exti_register (line_obj , mode_obj , trigger_obj , callback_obj , false, NULL );
276279
277280 return self ;
278281}
@@ -315,7 +318,8 @@ void Handle_EXTI_Irq(uint32_t line) {
315318 } else {
316319 // Uncaught exception; disable the callback so it doesn't run again.
317320 v -> callback_obj = mp_const_none ;
318- printf ("Uncaught exception in EXTI interrupt handler on line %lu\n" , line );
321+ exti_disable (line );
322+ printf ("Uncaught exception in EXTI interrupt handler line %lu\n" , line );
319323 mp_obj_print_exception ((mp_obj_t )nlr .ret_val );
320324 }
321325 gc_unlock ();
0 commit comments