[STM32F4] 不能失能若定义函数__weak HAL_GPIO_EXT1_Callback ( uint16_t GPIO_Pin)

[复制链接]
697|12
 楼主| SocialButterfly 发表于 2025-5-14 13:00 | 显示全部楼层 |阅读模式
用 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 默认替代了。
gaonaiweng 发表于 2025-5-31 17:57 | 显示全部楼层
只要在你的代码中提供了正确的回调函数实现,链接器会自动找到,并调用你的函数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

57

主题

57

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部