Skip to content

Commit 1c2c121

Browse files
authored
Merge pull request #3303 from adustm/stm_fix_interrupt_in
Fix #2956 #2939 #2957 #2959 #2960: Add HAL_DeInit function in gpio_irq destructor
2 parents 72b1fa7 + 0219b64 commit 1c2c121

File tree

9 files changed

+51
-24
lines changed

9 files changed

+51
-24
lines changed

targets/TARGET_STM/TARGET_STM32F0/gpio_irq_api.c

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,8 @@ static uint32_t pin_base_nr[16] = {
8282

8383
static gpio_irq_handler irq_handler;
8484

85-
static void handle_interrupt_in(uint32_t irq_index, uint32_t max_num_pin_line) {
85+
static void handle_interrupt_in(uint32_t irq_index, uint32_t max_num_pin_line)
86+
{
8687
gpio_channel_t *gpio_channel = &channels[irq_index];
8788
uint32_t gpio_idx;
8889

@@ -112,24 +113,28 @@ static void handle_interrupt_in(uint32_t irq_index, uint32_t max_num_pin_line) {
112113
}
113114

114115
// EXTI lines 0 to 1
115-
static void gpio_irq0(void) {
116+
static void gpio_irq0(void)
117+
{
116118
handle_interrupt_in(0, 2);
117119
}
118120

119121
// EXTI lines 2 to 3
120-
static void gpio_irq1(void) {
122+
static void gpio_irq1(void)
123+
{
121124
handle_interrupt_in(1, 2);
122125
}
123126

124127
// EXTI lines 4 to 15
125-
static void gpio_irq2(void) {
128+
static void gpio_irq2(void)
129+
{
126130
handle_interrupt_in(2, 12);
127131
}
128132

129133
extern uint32_t Set_GPIO_Clock(uint32_t port_idx);
130134
extern void pin_function_gpiomode(PinName pin, uint32_t gpiomode);
131135

132-
int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32_t id) {
136+
int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32_t id)
137+
{
133138
IRQn_Type irq_n = (IRQn_Type)0;
134139
uint32_t vector = 0;
135140
uint32_t irq_index;
@@ -187,11 +192,14 @@ int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32
187192
return 0;
188193
}
189194

190-
void gpio_irq_free(gpio_irq_t *obj) {
195+
void gpio_irq_free(gpio_irq_t *obj)
196+
{
191197
gpio_channel_t *gpio_channel = &channels[obj->irq_index];
192198
uint32_t pin_index = STM_PIN(obj->pin);
199+
uint32_t gpio_addr = GPIOA_BASE + (GPIOB_BASE-GPIOA_BASE) * STM_PORT(obj->pin);
193200
uint32_t gpio_idx = pin_base_nr[pin_index];
194-
201+
202+
HAL_GPIO_DeInit((GPIO_TypeDef *)gpio_addr, (1<<pin_index));
195203
gpio_channel->pin_mask &= ~(1 << gpio_idx);
196204
gpio_channel->channel_ids[gpio_idx] = 0;
197205
gpio_channel->channel_gpio[gpio_idx] = 0;
@@ -202,7 +210,8 @@ void gpio_irq_free(gpio_irq_t *obj) {
202210
obj->event = EDGE_NONE;
203211
}
204212

205-
void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable) {
213+
void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable)
214+
{
206215
uint32_t mode = STM_MODE_IT_EVT_RESET;
207216
uint32_t pull = GPIO_NOPULL;
208217

@@ -249,11 +258,13 @@ void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable) {
249258
pin_function_gpiomode(obj->pin, mode);
250259
}
251260

252-
void gpio_irq_enable(gpio_irq_t *obj) {
261+
void gpio_irq_enable(gpio_irq_t *obj)
262+
{
253263
NVIC_EnableIRQ(obj->irq_n);
254264
}
255265

256-
void gpio_irq_disable(gpio_irq_t *obj) {
266+
void gpio_irq_disable(gpio_irq_t *obj)
267+
{
257268
NVIC_DisableIRQ(obj->irq_n);
258269
obj->event = EDGE_NONE;
259270
}

targets/TARGET_STM/TARGET_STM32F1/gpio_irq_api.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,8 +261,10 @@ void gpio_irq_free(gpio_irq_t *obj)
261261
{
262262
gpio_channel_t *gpio_channel = &channels[obj->irq_index];
263263
uint32_t pin_index = STM_PIN(obj->pin);
264+
uint32_t gpio_addr = GPIOA_BASE + (GPIOB_BASE-GPIOA_BASE) * STM_PORT(obj->pin);
264265
uint32_t gpio_idx = pin_base_nr[pin_index];
265-
266+
267+
HAL_GPIO_DeInit((GPIO_TypeDef *)gpio_addr, (1<<pin_index));
266268
gpio_channel->pin_mask &= ~(1 << gpio_idx);
267269
gpio_channel->channel_ids[gpio_idx] = 0;
268270
gpio_channel->channel_gpio[gpio_idx] = 0;

targets/TARGET_STM/TARGET_STM32F2/gpio_irq_api.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,8 +261,10 @@ void gpio_irq_free(gpio_irq_t *obj)
261261
{
262262
gpio_channel_t *gpio_channel = &channels[obj->irq_index];
263263
uint32_t pin_index = STM_PIN(obj->pin);
264+
uint32_t gpio_addr = GPIOA_BASE + (GPIOB_BASE-GPIOA_BASE) * STM_PORT(obj->pin);
264265
uint32_t gpio_idx = pin_base_nr[pin_index];
265-
266+
267+
HAL_GPIO_DeInit((GPIO_TypeDef *)gpio_addr, (1<<pin_index));
266268
gpio_channel->pin_mask &= ~(1 << gpio_idx);
267269
gpio_channel->channel_ids[gpio_idx] = 0;
268270
gpio_channel->channel_gpio[gpio_idx] = 0;

targets/TARGET_STM/TARGET_STM32F3/gpio_irq_api.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,8 +261,10 @@ void gpio_irq_free(gpio_irq_t *obj)
261261
{
262262
gpio_channel_t *gpio_channel = &channels[obj->irq_index];
263263
uint32_t pin_index = STM_PIN(obj->pin);
264+
uint32_t gpio_addr = GPIOA_BASE + (GPIOB_BASE-GPIOA_BASE) * STM_PORT(obj->pin);
264265
uint32_t gpio_idx = pin_base_nr[pin_index];
265-
266+
267+
HAL_GPIO_DeInit((GPIO_TypeDef *)gpio_addr, (1<<pin_index));
266268
gpio_channel->pin_mask &= ~(1 << gpio_idx);
267269
gpio_channel->channel_ids[gpio_idx] = 0;
268270
gpio_channel->channel_gpio[gpio_idx] = 0;

targets/TARGET_STM/TARGET_STM32F4/gpio_irq_api.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/* mbed Microcontroller Library
22
*******************************************************************************
3-
* Copyright (c) 2014, STMicroelectronics
3+
* Copyright (c) 2016, STMicroelectronics
44
* All rights reserved.
55
*
66
* Redistribution and use in source and binary forms, with or without
@@ -261,8 +261,10 @@ void gpio_irq_free(gpio_irq_t *obj)
261261
{
262262
gpio_channel_t *gpio_channel = &channels[obj->irq_index];
263263
uint32_t pin_index = STM_PIN(obj->pin);
264+
uint32_t gpio_addr = GPIOA_BASE + (GPIOB_BASE-GPIOA_BASE) * STM_PORT(obj->pin);
264265
uint32_t gpio_idx = pin_base_nr[pin_index];
265-
266+
267+
HAL_GPIO_DeInit((GPIO_TypeDef *)gpio_addr, (1<<pin_index));
266268
gpio_channel->pin_mask &= ~(1 << gpio_idx);
267269
gpio_channel->channel_ids[gpio_idx] = 0;
268270
gpio_channel->channel_gpio[gpio_idx] = 0;

targets/TARGET_STM/TARGET_STM32F7/gpio_irq_api.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/* mbed Microcontroller Library
22
*******************************************************************************
3-
* Copyright (c) 2015, STMicroelectronics
3+
* Copyright (c) 2016, STMicroelectronics
44
* All rights reserved.
55
*
66
* Redistribution and use in source and binary forms, with or without
@@ -261,8 +261,10 @@ void gpio_irq_free(gpio_irq_t *obj)
261261
{
262262
gpio_channel_t *gpio_channel = &channels[obj->irq_index];
263263
uint32_t pin_index = STM_PIN(obj->pin);
264+
uint32_t gpio_addr = GPIOA_BASE + (GPIOB_BASE-GPIOA_BASE) * STM_PORT(obj->pin);
264265
uint32_t gpio_idx = pin_base_nr[pin_index];
265-
266+
267+
HAL_GPIO_DeInit((GPIO_TypeDef *)gpio_addr, (1<<pin_index));
266268
gpio_channel->pin_mask &= ~(1 << gpio_idx);
267269
gpio_channel->channel_ids[gpio_idx] = 0;
268270
gpio_channel->channel_gpio[gpio_idx] = 0;

targets/TARGET_STM/TARGET_STM32L0/gpio_irq_api.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/* mbed Microcontroller Library
22
*******************************************************************************
3-
* Copyright (c) 2015, STMicroelectronics
3+
* Copyright (c) 2016, STMicroelectronics
44
* All rights reserved.
55
*
66
* Redistribution and use in source and binary forms, with or without
@@ -196,8 +196,10 @@ void gpio_irq_free(gpio_irq_t *obj)
196196
{
197197
gpio_channel_t *gpio_channel = &channels[obj->irq_index];
198198
uint32_t pin_index = STM_PIN(obj->pin);
199+
uint32_t gpio_addr = GPIOA_BASE + (GPIOB_BASE-GPIOA_BASE) * STM_PORT(obj->pin);
199200
uint32_t gpio_idx = pin_base_nr[pin_index];
200-
201+
202+
HAL_GPIO_DeInit((GPIO_TypeDef *)gpio_addr, (1<<pin_index));
201203
gpio_channel->pin_mask &= ~(1 << gpio_idx);
202204
gpio_channel->channel_ids[gpio_idx] = 0;
203205
gpio_channel->channel_gpio[gpio_idx] = 0;

targets/TARGET_STM/TARGET_STM32L1/gpio_irq_api.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/* mbed Microcontroller Library
22
*******************************************************************************
3-
* Copyright (c) 2014, STMicroelectronics
3+
* Copyright (c) 2016, STMicroelectronics
44
* All rights reserved.
55
*
66
* Redistribution and use in source and binary forms, with or without
@@ -261,8 +261,10 @@ void gpio_irq_free(gpio_irq_t *obj)
261261
{
262262
gpio_channel_t *gpio_channel = &channels[obj->irq_index];
263263
uint32_t pin_index = STM_PIN(obj->pin);
264+
uint32_t gpio_addr = GPIOA_BASE + (GPIOB_BASE-GPIOA_BASE) * STM_PORT(obj->pin);
264265
uint32_t gpio_idx = pin_base_nr[pin_index];
265-
266+
267+
HAL_GPIO_DeInit((GPIO_TypeDef *)gpio_addr, (1<<pin_index));
266268
gpio_channel->pin_mask &= ~(1 << gpio_idx);
267269
gpio_channel->channel_ids[gpio_idx] = 0;
268270
gpio_channel->channel_gpio[gpio_idx] = 0;

targets/TARGET_STM/TARGET_STM32L4/gpio_irq_api.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/* mbed Microcontroller Library
22
*******************************************************************************
3-
* Copyright (c) 2015, STMicroelectronics
3+
* Copyright (c) 2016, STMicroelectronics
44
* All rights reserved.
55
*
66
* Redistribution and use in source and binary forms, with or without
@@ -225,7 +225,7 @@ int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32
225225
irq_index = 6;
226226
break;
227227
default:
228-
error("InterruptIn error: pin not supported\n");
228+
error("InterruptIn error: pin not supported.\n");
229229
return -1;
230230
}
231231

@@ -261,8 +261,10 @@ void gpio_irq_free(gpio_irq_t *obj)
261261
{
262262
gpio_channel_t *gpio_channel = &channels[obj->irq_index];
263263
uint32_t pin_index = STM_PIN(obj->pin);
264+
uint32_t gpio_addr = GPIOA_BASE + (GPIOB_BASE-GPIOA_BASE) * STM_PORT(obj->pin);
264265
uint32_t gpio_idx = pin_base_nr[pin_index];
265-
266+
267+
HAL_GPIO_DeInit((GPIO_TypeDef *)gpio_addr, (1<<pin_index));
266268
gpio_channel->pin_mask &= ~(1 << gpio_idx);
267269
gpio_channel->channel_ids[gpio_idx] = 0;
268270
gpio_channel->channel_gpio[gpio_idx] = 0;

0 commit comments

Comments
 (0)