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*/
4859typedef 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