不能失能若定义函数__weak HAL_GPIO_EXT1_Callback ( uint16_t GPIO_Pin)
用 STM32 CubeIDE 和 Blue Pill 板。为了控制 main.c 的大小,我将函数组放到到几个 c/h 对文件中。其中一对是 'myirqcallbacks.c/h”。目前,我在这个 c/h 对中有两个 UART IRQ 和一个外部引脚 IRQ 回调。UART 工作正常,但 EXT IRQ 无法调用我定义的函数。会运行 stm32f1xx_hal_gpio.c 中 __weak函数。当函数定义在 main.c 中时,运行就正常。编译器似乎忽略 EXT IRQ 回调函数,而是调用 __weak。但是,可以看到其中的两个 UART 回调函数。GPIO 和 UART IRQ 的结构有什么不同吗?你确定 myirqcallbacks.c 被正确编译并链接了吗?有时候文件没加进工程就会出现这种情况。 检查下你自己定义的回调函数有没有用 extern "C"(如果是 C++ 项目的话)。 可能是函数名拼错了,HAL_EXTI_Callback 要拼得一字不差才能替代 __weak 的默认函数。 UART 和 GPIO 的回调调用方式其实是类似的,但你要确保你的 GPIO 回调函数是全局可见的。 建议你在你的 .h 文件中声明 HAL_GPIO_EXTI_Callback,看看有没有作用。 CubeIDE 有时候对 weak 覆盖识别不及时,尝试 Clean 再重新编译一次项目。 注意函数位置不要被 static 限制了作用域,不然不会替换到 __weak 实现。 确保你的 myirqcallbacks.c 没有被条件编译排除掉,Debug 里能看出来有没有编进去。 如果你放 main.c 就有效,那说明链接顺序可能有问题,试试把 myirqcallbacks.c 放前面一点编译。 我遇到类似问题是 .c 文件没加到 build 里面,导致函数没参与链接,被 weak 默认替代了。
页:
[1]