@@ -86,8 +86,7 @@ int gpio_read(gpio_t *obj)
8686 }
8787}
8888
89-
90- static void gpio_apply_config (uint8_t pin )
89+ static void gpiote_pin_uninit (uint8_t pin )
9190{
9291 if (m_gpio_initialized & (1UL << pin )) {
9392 if ((m_gpio_cfg [pin ].direction == PIN_OUTPUT ) && (!m_gpio_cfg [pin ].used_as_irq )) {
@@ -97,7 +96,10 @@ static void gpio_apply_config(uint8_t pin)
9796 nrf_drv_gpiote_in_uninit (pin );
9897 }
9998 }
99+ }
100100
101+ static void gpio_apply_config (uint8_t pin )
102+ {
101103 if (m_gpio_cfg [pin ].used_as_gpio || m_gpio_cfg [pin ].used_as_irq ) {
102104 if ((m_gpio_cfg [pin ].direction == PIN_INPUT )
103105 || (m_gpio_cfg [pin ].used_as_irq )) {
@@ -147,6 +149,9 @@ static void gpio_apply_config(uint8_t pin)
147149void gpio_mode (gpio_t * obj , PinMode mode )
148150{
149151 MBED_ASSERT (obj -> pin <= GPIO_PIN_COUNT );
152+
153+ gpiote_pin_uninit (obj -> pin ); // try to uninitialize gpio before a change.
154+
150155 m_gpio_cfg [obj -> pin ].pull = mode ;
151156 gpio_apply_config (obj -> pin );
152157}
@@ -155,6 +160,9 @@ void gpio_mode(gpio_t *obj, PinMode mode)
155160void gpio_dir (gpio_t * obj , PinDirection direction )
156161{
157162 MBED_ASSERT (obj -> pin <= GPIO_PIN_COUNT );
163+
164+ gpiote_pin_uninit (obj -> pin ); // try to uninitialize gpio before a change.
165+
158166 m_gpio_cfg [obj -> pin ].direction = direction ;
159167 gpio_apply_config (obj -> pin );
160168}
@@ -172,6 +180,8 @@ int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32
172180 MBED_ASSERT ((uint32_t )pin < GPIO_PIN_COUNT );
173181 (void ) nrf_drv_gpiote_init ();
174182
183+ gpiote_pin_uninit (pin ); // try to uninitialize gpio before a change.
184+
175185 m_gpio_cfg [pin ].used_as_irq = true;
176186 m_channel_ids [pin ] = id ;
177187 obj -> ch = pin ;
0 commit comments