打印
[STM32G0]

STM32CubeIDE LL GPIO 错误?

[复制链接]
92|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lvluoo|  楼主 | 2025-4-1 10:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式



这些不应该是 (Pin * 2U) 或 (Pin + Pin)

__STATIC_INLINE void LL_GPIO_SetPinMode(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Mode){  MODIFY_REG(GPIOx->MODER, ((Pin * Pin) * GPIO_MODER_MODE0), ((Pin * Pin) * Mode));} __STATIC_INLINE uint32_t LL_GPIO_GetPinMode(GPIO_TypeDef *GPIOx, uint32_t Pin){  return (uint32_t)(READ_BIT(GPIOx->MODER, ((Pin * Pin) * GPIO_MODER_MODE0)) / (Pin * Pin));}

使用特权

评论回复
沙发
onlycook| | 2025-4-1 12:05 | 只看该作者
LL_GPIO_SetPinMode 和 LL_GPIO_GetPinMode 函数实现中,确实存在错误。

使用特权

评论回复
板凳
onlycook| | 2025-4-1 12:05 | 只看该作者
(Pin * Pin) 和 (Pin + Pin) 这样的表达式并不适用于 GPIO 引脚配置,因为它们不会正确地定位到 MODER 寄存器中的相应位。

使用特权

评论回复
地板
公羊子丹| | 2025-4-2 07:44 | 只看该作者
这个 (Pin * Pin) 确实有点奇怪,感觉应该是 (Pin * 2U),你是在哪个 CubeG0 版本里看到的?

使用特权

评论回复
5
周半梅| | 2025-4-2 07:45 | 只看该作者
这个计算方式会导致位移错误吧,比如 Pin = 2 的时候 (2 * 2) = 4,MODER 的位移全错了。

使用特权

评论回复
6
帛灿灿| | 2025-4-2 07:46 | 只看该作者
这个代码是 ST 官方的 LL 库吗?如果是的话,感觉像是 ST 的 Bug,得看看他们最新版本有没有修复。

使用特权

评论回复
7
童雨竹| | 2025-4-2 07:47 | 只看该作者
试试手动改成 (Pin * 2U) 看看效果,或者用 (1U << (Pin * 2U)) 可能更直观。

使用特权

评论回复
8
万图| | 2025-4-2 07:48 | 只看该作者
你用的是 LL_GPIO_SetPinMode() 还是自己封装了一层?看看 ST 的参考手册,确认 MODER 计算逻辑。

使用特权

评论回复
9
Wordsworth| | 2025-4-2 07:49 | 只看该作者
CubeG0 里有可能是某个旧版本的问题,可以去 ST 官方论坛看看有没有类似反馈。

使用特权

评论回复
10
Bblythe| | 2025-4-2 07:50 | 只看该作者
你可以试试 printf("Pin=%u, Shift=%u\n", Pin, (Pin * Pin));,看看是不是得到的值和预期的不一样。

使用特权

评论回复
11
Pulitzer| | 2025-4-2 07:50 | 只看该作者
这个 (Pin * Pin) 在 Pin = 0 时还好,但 Pin = 15 时就完全错位了,应该是 Bug 吧?

使用特权

评论回复
12
Uriah| | 2025-4-2 07:52 | 只看该作者
GPIO_MODER 是每个 Pin 占 2 位的,Pin * 2U 计算应该是对的,这个 (Pin * Pin) 确实像是笔误。

使用特权

评论回复
13
Clyde011| | 2025-4-2 07:53 | 只看该作者
ST 有时候 LL 库的实现也会有些奇怪的地方,建议看看 HAL 版本的实现是不是正常的,或者干脆直接操作寄存器。

使用特权

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

本版积分规则

9

主题

10

帖子

0

粉丝