Skip to content

Commit 04d4468

Browse files
committed
chore(wb0): exti support
Signed-off-by: Frederic Pillon <[email protected]>
1 parent a64fdb0 commit 04d4468

File tree

2 files changed

+97
-6
lines changed

2 files changed

+97
-6
lines changed

cores/arduino/WInterrupts.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,21 @@ void attachInterrupt(uint32_t pin, callback_function_t callback, uint32_t mode)
3232
case CHANGE :
3333
it_mode = GPIO_MODE_IT_RISING_FALLING;
3434
break;
35-
case FALLING :
3635
case LOW :
36+
#ifdef GPIO_MODE_IT_LEVEL_LOW
37+
it_mode = GPIO_MODE_IT_LEVEL_LOW;
38+
break;
39+
#endif
40+
case FALLING :
3741
it_mode = GPIO_MODE_IT_FALLING;
3842
break;
39-
case RISING :
4043
case HIGH :
41-
it_mode = GPIO_MODE_IT_RISING;
44+
#ifdef GPIO_MODE_IT_LEVEL_HIGH
45+
it_mode = GPIO_MODE_IT_LEVEL_HIGH;
4246
break;
47+
#endif
4348
default:
49+
case RISING :
4450
it_mode = GPIO_MODE_IT_RISING;
4551
break;
4652
}

libraries/SrcWrapper/src/stm32/interrupt.cpp

Lines changed: 88 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,18 @@
4343
#if !defined(HAL_EXTI_MODULE_DISABLED)
4444

4545
/* Private Types */
46-
46+
#if defined(STM32WB0x)
47+
static std::function<void(void)> gpio_callback[2][16] = {
48+
{
49+
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
50+
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
51+
},
52+
{
53+
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
54+
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
55+
}
56+
};
57+
#else
4758
/*As we can have only one interrupt/pin id, don't need to get the port info*/
4859
typedef struct {
4960
IRQn_Type irqnb;
@@ -118,6 +129,7 @@ static const uint32_t ll_exti_lines[NB_EXTI] = {
118129
LL_EXTI_LINE_8, LL_EXTI_LINE_9, LL_EXTI_LINE_10, LL_EXTI_LINE_11,
119130
LL_EXTI_LINE_12, LL_EXTI_LINE_13, LL_EXTI_LINE_14, LL_EXTI_LINE_15
120131
};
132+
#endif /* STM32WB0x */
121133
/* Private Functions */
122134
/**
123135
* @brief This function returns the pin ID function of the HAL PIN definition
@@ -152,10 +164,23 @@ void stm32_interrupt_enable(PinName pn, callback_function_t callback, uint32_t m
152164
HAL_GPIO_Init(port, &GPIO_InitStruct);
153165
hsem_unlock(CFG_HW_GPIO_SEMID);
154166
}
167+
IRQn_Type irqnb;
168+
#ifdef STM32WB0x
169+
if (port == GPIOA) {
170+
irqnb = GPIOA_IRQn;
171+
gpio_callback[0][id] = callback;
172+
} else {
173+
irqnb = GPIOB_IRQn;
174+
gpio_callback[1][id] = callback;
175+
}
176+
#else
155177
gpio_irq_conf[id].callback = callback;
178+
irqnb = gpio_irq_conf[id].irqnb;
179+
#endif /* STM32WB0x */
156180
// Enable and set EXTI Interrupt
157-
HAL_NVIC_SetPriority(gpio_irq_conf[id].irqnb, EXTI_IRQ_PRIO, EXTI_IRQ_SUBPRIO);
158-
HAL_NVIC_EnableIRQ(gpio_irq_conf[id].irqnb);
181+
HAL_NVIC_SetPriority(irqnb, EXTI_IRQ_PRIO, EXTI_IRQ_SUBPRIO);
182+
HAL_NVIC_EnableIRQ(irqnb);
183+
159184
}
160185

161186
/**
@@ -183,6 +208,25 @@ void stm32_interrupt_disable(GPIO_TypeDef *port, uint16_t pin)
183208
{
184209
UNUSED(port);
185210
uint8_t id = get_pin_id(pin);
211+
#ifdef STM32WB0x
212+
uint8_t pid = 0;
213+
IRQn_Type irqnb;
214+
if (port == GPIOA) {
215+
irqnb = GPIOA_IRQn;
216+
gpio_callback[0][id] = NULL;
217+
} else {
218+
irqnb = GPIOB_IRQn;
219+
gpio_callback[1][id] = NULL;
220+
pid = 1;
221+
}
222+
/* Check if irq always required */
223+
for (int i = 0; i < 16; i++) {
224+
if (gpio_callback[pid][i] != NULL) {
225+
return;
226+
}
227+
}
228+
HAL_NVIC_DisableIRQ(irqnb);
229+
#else
186230
gpio_irq_conf[id].callback = NULL;
187231
for (int i = 0; i < NB_EXTI; i++) {
188232
if (gpio_irq_conf[id].irqnb == gpio_irq_conf[i].irqnb
@@ -192,8 +236,47 @@ void stm32_interrupt_disable(GPIO_TypeDef *port, uint16_t pin)
192236
}
193237
LL_EXTI_DisableIT_0_31(ll_exti_lines[id]);
194238
HAL_NVIC_DisableIRQ(gpio_irq_conf[id].irqnb);
239+
#endif /* STM32WB0x */
195240
}
196241

242+
243+
#if defined(STM32WB0x)
244+
#ifdef __cplusplus
245+
extern "C" {
246+
#endif
247+
void HAL_GPIO_EXTI_Callback(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
248+
{
249+
uint8_t id = get_pin_id(GPIO_Pin);
250+
uint8_t pid = (GPIOx == GPIOA) ? 0 : 1;
251+
252+
if (gpio_callback[pid][id] != NULL) {
253+
gpio_callback[pid][id]();
254+
}
255+
}
256+
257+
void GPIOA_IRQHandler(void)
258+
{
259+
uint32_t line = SYSCFG_IO_DTR_PA0_DT;
260+
for (uint16_t GPIO_Pin = 0; GPIO_Pin < 16; GPIO_Pin++, line <<= 1) {
261+
if (LL_EXTI_IsActiveFlag(line) != 0) {
262+
HAL_GPIO_EXTI_IRQHandler(GPIOA, 1 << GPIO_Pin);
263+
}
264+
}
265+
}
266+
267+
void GPIOB_IRQHandler(void)
268+
{
269+
uint32_t line = SYSCFG_IO_DTR_PB0_DT;
270+
for (uint16_t GPIO_Pin = 0; GPIO_Pin < 16; GPIO_Pin++, line <<= 1) {
271+
if (LL_EXTI_IsActiveFlag(line) != 0) {
272+
HAL_GPIO_EXTI_IRQHandler(GPIOB, 1 << GPIO_Pin);
273+
}
274+
}
275+
}
276+
#ifdef __cplusplus
277+
}
278+
#endif
279+
#else
197280
/**
198281
* @brief This function his called by the HAL if the IRQ is valid
199282
* @param GPIO_Pin : one of the gpio pin
@@ -477,6 +560,8 @@ void EXTI15_IRQHandler(void)
477560
#ifdef __cplusplus
478561
}
479562
#endif
563+
#endif /* !STM32WB0x */
564+
480565
#endif /* !HAL_EXTI_MODULE_DISABLED */
481566
#endif
482567
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

0 commit comments

Comments
 (0)