43
43
#if !defined(HAL_EXTI_MODULE_DISABLED)
44
44
45
45
/* 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
47
58
/* As we can have only one interrupt/pin id, don't need to get the port info*/
48
59
typedef struct {
49
60
IRQn_Type irqnb;
@@ -118,6 +129,7 @@ static const uint32_t ll_exti_lines[NB_EXTI] = {
118
129
LL_EXTI_LINE_8, LL_EXTI_LINE_9, LL_EXTI_LINE_10, LL_EXTI_LINE_11,
119
130
LL_EXTI_LINE_12, LL_EXTI_LINE_13, LL_EXTI_LINE_14, LL_EXTI_LINE_15
120
131
};
132
+ #endif /* STM32WB0x */
121
133
/* Private Functions */
122
134
/* *
123
135
* @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
152
164
HAL_GPIO_Init (port, &GPIO_InitStruct);
153
165
hsem_unlock (CFG_HW_GPIO_SEMID);
154
166
}
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
155
177
gpio_irq_conf[id].callback = callback;
178
+ irqnb = gpio_irq_conf[id].irqnb ;
179
+ #endif /* STM32WB0x */
156
180
// 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
+
159
184
}
160
185
161
186
/* *
@@ -183,6 +208,25 @@ void stm32_interrupt_disable(GPIO_TypeDef *port, uint16_t pin)
183
208
{
184
209
UNUSED (port);
185
210
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
186
230
gpio_irq_conf[id].callback = NULL ;
187
231
for (int i = 0 ; i < NB_EXTI; i++) {
188
232
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)
192
236
}
193
237
LL_EXTI_DisableIT_0_31 (ll_exti_lines[id]);
194
238
HAL_NVIC_DisableIRQ (gpio_irq_conf[id].irqnb );
239
+ #endif /* STM32WB0x */
195
240
}
196
241
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
197
280
/* *
198
281
* @brief This function his called by the HAL if the IRQ is valid
199
282
* @param GPIO_Pin : one of the gpio pin
@@ -477,6 +560,8 @@ void EXTI15_IRQHandler(void)
477
560
#ifdef __cplusplus
478
561
}
479
562
#endif
563
+ #endif /* !STM32WB0x */
564
+
480
565
#endif /* !HAL_EXTI_MODULE_DISABLED */
481
566
#endif
482
567
/* *********************** (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
0 commit comments