SocialButterfly 发表于 2025-5-14 13:00

不能失能若定义函数__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 的结构有什么不同吗?

公羊子丹 发表于 2025-5-24 09:05

你确定 myirqcallbacks.c 被正确编译并链接了吗?有时候文件没加进工程就会出现这种情况。

周半梅 发表于 2025-5-24 09:06

检查下你自己定义的回调函数有没有用 extern "C"(如果是 C++ 项目的话)。

帛灿灿 发表于 2025-5-24 09:06

可能是函数名拼错了,HAL_EXTI_Callback 要拼得一字不差才能替代 __weak 的默认函数。

童雨竹 发表于 2025-5-24 09:07

UART 和 GPIO 的回调调用方式其实是类似的,但你要确保你的 GPIO 回调函数是全局可见的。

万图 发表于 2025-5-24 09:08

建议你在你的 .h 文件中声明 HAL_GPIO_EXTI_Callback,看看有没有作用。

Wordsworth 发表于 2025-5-24 09:08

CubeIDE 有时候对 weak 覆盖识别不及时,尝试 Clean 再重新编译一次项目。

Bblythe 发表于 2025-5-24 09:09

注意函数位置不要被 static 限制了作用域,不然不会替换到 __weak 实现。

Pulitzer 发表于 2025-5-24 09:10

确保你的 myirqcallbacks.c 没有被条件编译排除掉,Debug 里能看出来有没有编进去。

Uriah 发表于 2025-5-24 09:11

如果你放 main.c 就有效,那说明链接顺序可能有问题,试试把 myirqcallbacks.c 放前面一点编译。

Clyde011 发表于 2025-5-24 09:12

我遇到类似问题是 .c 文件没加到 build 里面,导致函数没参与链接,被 weak 默认替代了。
页: [1]
查看完整版本: 不能失能若定义函数__weak HAL_GPIO_EXT1_Callback ( uint16_t GPIO_Pin)