Skip to content

Commit 805b033

Browse files
committed
Re-enable IRQ from 10 to 14
1 parent 555d7b4 commit 805b033

File tree

4 files changed

+19
-13
lines changed

4 files changed

+19
-13
lines changed

include/gpio.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,6 @@ void gpio_enable_irq(uint16_t pin);
5757
void gpio_disable_irq(uint16_t pin);
5858
void gpio_set_handler(uint16_t pin);
5959

60+
void gpio_handle_irq();
61+
6062
#endif /* GPIO_H */

src/gpio.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -93,12 +93,12 @@ static void MX_GPIO_Init(void) {
9393
__HAL_RCC_GPIOG_CLK_ENABLE();
9494
}
9595

96-
static void handle_irq() {
96+
void gpio_handle_irq() {
9797
uint32_t pr = EXTI->PR1;
9898
uint8_t index = 0;
9999
while (pr != 0) {
100100
if (pr & 0x1) {
101-
dbg_printf("handle_irq: index = %d (%x)\n", index, 1<<index);
101+
dbg_printf("gpio_handle_irq: index = %d (%x)\n", index, 1<<index);
102102
/* Set the flag variable which leads to a transmission
103103
* of a interrupt event within gpio_handle_data.
104104
*/
@@ -153,17 +153,17 @@ void gpio_enable_irq(uint16_t pin) {
153153
void gpio_set_handler(uint16_t pin)
154154
{
155155
if (pin == GPIO_PIN_0) {
156-
NVIC_SetVector(EXTI0_IRQn, (uint32_t)&handle_irq);
156+
NVIC_SetVector(EXTI0_IRQn, (uint32_t)&gpio_handle_irq);
157157
} else if (pin == GPIO_PIN_1) {
158-
NVIC_SetVector(EXTI1_IRQn, (uint32_t)&handle_irq);
158+
NVIC_SetVector(EXTI1_IRQn, (uint32_t)&gpio_handle_irq);
159159
} else if (pin == GPIO_PIN_2) {
160-
NVIC_SetVector(EXTI2_IRQn, (uint32_t)&handle_irq);
160+
NVIC_SetVector(EXTI2_IRQn, (uint32_t)&gpio_handle_irq);
161161
} else if (pin == GPIO_PIN_3) {
162-
NVIC_SetVector(EXTI3_IRQn, (uint32_t)&handle_irq);
162+
NVIC_SetVector(EXTI3_IRQn, (uint32_t)&gpio_handle_irq);
163163
} else if (pin == GPIO_PIN_4) {
164-
NVIC_SetVector(EXTI4_IRQn, (uint32_t)&handle_irq);
164+
NVIC_SetVector(EXTI4_IRQn, (uint32_t)&gpio_handle_irq);
165165
} else if (pin >= GPIO_PIN_5 && pin <= GPIO_PIN_9) {
166-
NVIC_SetVector(EXTI9_5_IRQn, (uint32_t)&handle_irq);
166+
NVIC_SetVector(EXTI9_5_IRQn, (uint32_t)&gpio_handle_irq);
167167
}
168168
}
169169

src/gpio_handler.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,8 @@ int gpio_handler(uint8_t const opcode, uint8_t const * data, uint16_t const size
9696
case IRQ_TYPE:
9797
GPIO_InitStruct.Pin = GPIO_pinmap[index].pin;
9898

99-
if (GPIO_InitStruct.Pin > GPIO_PIN_9) {
100-
// IRQs from 10 to 15 are exclusively used by SPI
99+
if (GPIO_InitStruct.Pin == GPIO_PIN_15) {
100+
// IRQ15 is used for SPI
101101
return 0;
102102
}
103103

@@ -139,7 +139,7 @@ int gpio_handler(uint8_t const opcode, uint8_t const * data, uint16_t const size
139139
case IRQ_ACK:
140140
dbg_printf("GPIO%d: IRQ_ACK %d\n", index, value);
141141
/* Re-enable the interrupt that was disabled within
142-
* handle_irq to prevent firing of another interrupt
142+
* gpio_handle_irq to prevent firing of another interrupt
143143
* until this one has been signaled to the application.
144144
*/
145145
gpio_enable_irq(GPIO_pinmap[index].pin);

src/system.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
#include <string.h>
2929
#include "rpc.h"
3030
#include "spi.h"
31+
#include "gpio.h"
32+
#include "stm32h7xx_ll_exti.h"
3133

3234
/**************************************************************************************
3335
* GLOBAL VARIABLES
@@ -219,7 +221,7 @@ int get_available_enqueue() {
219221
int enqueue_packet(uint8_t const peripheral, uint8_t const opcode, uint16_t const size, void * data)
220222
{
221223
/* Enter critical section: Since this function is called both from inside
222-
* interrupt context (handle_irq/gpio.c) as well as from normal execution
224+
* interrupt context (gpio_handle_irq/gpio.c) as well as from normal execution
223225
* context it is necessary not only to blindly re-enable interrupts, but
224226
* to store the current interrupt situation and restore it at the end of
225227
* the critical section.
@@ -347,10 +349,12 @@ void dma_load() {
347349

348350
void EXTI15_10_IRQHandler(void)
349351
{
350-
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_15) == GPIO_PIN_SET) {
352+
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_15) == GPIO_PIN_SET && LL_EXTI_ReadFlag_0_31(LL_EXTI_LINE_15)) {
351353
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_15);
352354
spi_end();
353355
dma_load();
356+
} else {
357+
gpio_handle_irq();
354358
}
355359
}
356360

0 commit comments

Comments
 (0)