@@ -86,8 +86,7 @@ int gpio_read(gpio_t *obj)
86
86
}
87
87
}
88
88
89
-
90
- static void gpio_apply_config (uint8_t pin )
89
+ static void gpiote_pin_uninit (uint8_t pin )
91
90
{
92
91
if (m_gpio_initialized & (1UL << pin )) {
93
92
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)
97
96
nrf_drv_gpiote_in_uninit (pin );
98
97
}
99
98
}
99
+ }
100
100
101
+ static void gpio_apply_config (uint8_t pin )
102
+ {
101
103
if (m_gpio_cfg [pin ].used_as_gpio || m_gpio_cfg [pin ].used_as_irq ) {
102
104
if ((m_gpio_cfg [pin ].direction == PIN_INPUT )
103
105
|| (m_gpio_cfg [pin ].used_as_irq )) {
@@ -147,6 +149,9 @@ static void gpio_apply_config(uint8_t pin)
147
149
void gpio_mode (gpio_t * obj , PinMode mode )
148
150
{
149
151
MBED_ASSERT (obj -> pin <= GPIO_PIN_COUNT );
152
+
153
+ gpiote_pin_uninit (obj -> pin ); // try to uninitialize gpio before a change.
154
+
150
155
m_gpio_cfg [obj -> pin ].pull = mode ;
151
156
gpio_apply_config (obj -> pin );
152
157
}
@@ -155,6 +160,9 @@ void gpio_mode(gpio_t *obj, PinMode mode)
155
160
void gpio_dir (gpio_t * obj , PinDirection direction )
156
161
{
157
162
MBED_ASSERT (obj -> pin <= GPIO_PIN_COUNT );
163
+
164
+ gpiote_pin_uninit (obj -> pin ); // try to uninitialize gpio before a change.
165
+
158
166
m_gpio_cfg [obj -> pin ].direction = direction ;
159
167
gpio_apply_config (obj -> pin );
160
168
}
@@ -172,6 +180,8 @@ int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32
172
180
MBED_ASSERT ((uint32_t )pin < GPIO_PIN_COUNT );
173
181
(void ) nrf_drv_gpiote_init ();
174
182
183
+ gpiote_pin_uninit (pin ); // try to uninitialize gpio before a change.
184
+
175
185
m_gpio_cfg [pin ].used_as_irq = true;
176
186
m_channel_ids [pin ] = id ;
177
187
obj -> ch = pin ;
0 commit comments