Skip to content

Commit c377f4a

Browse files
authored
Merge pull request #57 from arduino/irq_10_14
Re-enable IRQ from 10 to 14
2 parents 2f5ee87 + 6b3825e commit c377f4a

File tree

4 files changed

+25
-15
lines changed

4 files changed

+25
-15
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: 10 additions & 10 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

@@ -219,8 +219,8 @@ int gpio_handle_data()
219219
uint16_t const copy_int_event_flags = int_event_flags;
220220
__enable_irq();
221221

222-
/* We have a total of 10 external interrupts. */
223-
for (uint8_t index = 0; index < 10; index++)
222+
/* We have a total of 15 external interrupts - IRQ15 is dedicated to SPI */
223+
for (uint8_t index = 0; index < 15; index++)
224224
{
225225
/* Check whether or not an external interrupt has occurred. */
226226
if (copy_int_event_flags & (1 << index))

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: 10 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
@@ -223,7 +225,7 @@ int get_available_enqueue()
223225
int enqueue_packet(uint8_t const peripheral, uint8_t const opcode, uint16_t const size, void * data)
224226
{
225227
/* Enter critical section: Since this function is called both from inside
226-
* interrupt context (handle_irq/gpio.c) as well as from normal execution
228+
* interrupt context (gpio_handle_irq/gpio.c) as well as from normal execution
227229
* context it is necessary not only to blindly re-enable interrupts, but
228230
* to store the current interrupt situation and restore it at the end of
229231
* the critical section.
@@ -368,7 +370,13 @@ void dma_load(bool const swap_tx_buf)
368370
void EXTI15_10_IRQHandler(void)
369371
{
370372
/* PA15 = nCS */
371-
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_15);
373+
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_15) == GPIO_PIN_SET && LL_EXTI_ReadFlag_0_31(LL_EXTI_LINE_15)) {
374+
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_15);
375+
spi_end();
376+
dma_load();
377+
} else {
378+
gpio_handle_irq();
379+
}
372380
}
373381

374382
void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi)

0 commit comments

Comments
 (0)