我修改`VENC_SDCard_ThreadX`示例工程,用按键触发一些动作:按惯用的 HAL + BSP 辅助函数初始化 GPIO,并创建一个针对下降沿的中断回调处理函数。
于是我调用:
BSP_PB_Init(BUTTON_USER1, BUTTON_MODE_EXTI);
并且实现了`BSP_PB_Callback()`。
按下按键后程序卡死,回调函数根本没有被调用。
我查看了 BSP 实现代码,又改用纯 HAL 函数重新做了一遍,现象完全一样。`BSP_PB_Init()`里的这段代码
(void)HAL_EXTI_GetHandle(&hpb_exti[Button], BUTTON_EXTI_LINE[Button]);
(void)HAL_EXTI_RegisterCallback(&hpb_exti[Button], HAL_EXTI_COMMON_CB_ID, ButtonCallback[Button]);
上面代码注册了回调函数;但顺着代码往下,在 stm32n6xx-hal-driver-exti.c 这个文件里,存在一个 函数,却从来没有被调用过。
这个示例代码似乎缺少针对实际`EXTIxx_IRQHandler`中断处理函数的初始化。
// GPIO C13 USER button / exti channel 13
void EXTI13_IRQHandler(void) {
HAL_EXTI_ClearPending(&hpb_exti_user, EXTI_TRIGGER_FALLING);
btnCallback(); // in my code I simply perform the action needed not going through HAL
}
这个 IRQ 中断处理函数需要引用 EXTI 配置句柄,而该句柄正是 BSP 代码初始化过的:
static EXTI_HandleTypeDef hpb_exti_user;
//... near the top of main(), after calling BSP_PB_Init():
HAL_EXTI_GetHandle(&hpb_exti_user, EXTI_LINE_13); // USER
我看过新建的 CubeMX 工程,`EXTI...IRQHandler`这些中断处理函数似乎也没有生成出来。
|
|