打印
[STM32F4]

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

[复制链接]
404|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 的默认函数。

使用特权

评论回复
5
童雨竹| | 2025-5-24 09:07 | 只看该作者
UART 和 GPIO 的回调调用方式其实是类似的,但你要确保你的 GPIO 回调函数是全局可见的。

使用特权

评论回复
6
万图| | 2025-5-24 09:08 | 只看该作者
建议你在你的 .h 文件中声明 HAL_GPIO_EXTI_Callback,看看有没有作用。

使用特权

评论回复
7
Wordsworth| | 2025-5-24 09:08 | 只看该作者
CubeIDE 有时候对 weak 覆盖识别不及时,尝试 Clean 再重新编译一次项目。

使用特权

评论回复
8
Bblythe| | 2025-5-24 09:09 | 只看该作者
注意函数位置不要被 static 限制了作用域,不然不会替换到 __weak 实现。

使用特权

评论回复
9
Pulitzer| | 2025-5-24 09:10 | 只看该作者
确保你的 myirqcallbacks.c 没有被条件编译排除掉,Debug 里能看出来有没有编进去。

使用特权

评论回复
10
Uriah| | 2025-5-24 09:11 | 只看该作者
如果你放 main.c 就有效,那说明链接顺序可能有问题,试试把 myirqcallbacks.c 放前面一点编译。

使用特权

评论回复
11
Clyde011| | 2025-5-24 09:12 | 只看该作者
我遇到类似问题是 .c 文件没加到 build 里面,导致函数没参与链接,被 weak 默认替代了。

使用特权

评论回复
12
gaonaiweng| | 2025-5-31 17:57 | 只看该作者
只要在你的代码中提供了正确的回调函数实现,链接器会自动找到,并调用你的函数。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

20

帖子

0

粉丝