[STM32G0] STM32CubeIDE LL GPIO 错误?

[复制链接]
677|12
 楼主| lvluoo 发表于 2025-4-1 10:00 | 显示全部楼层 |阅读模式
本帖最后由 lvluoo 于 2025-7-28 21:52 编辑



这些不应该是 (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 版本里看到的?
周半梅 发表于 2025-4-2 07:45 | 显示全部楼层
这个计算方式会导致位移错误吧,比如 Pin = 2 的时候 (2 * 2) = 4,MODER 的位移全错了。
帛灿灿 发表于 2025-4-2 07:46 | 显示全部楼层
这个代码是 ST 官方的 LL 库吗?如果是的话,感觉像是 ST 的 Bug,得看看他们最新版本有没有修复。
童雨竹 发表于 2025-4-2 07:47 | 显示全部楼层
试试手动改成 (Pin * 2U) 看看效果,或者用 (1U << (Pin * 2U)) 可能更直观。
万图 发表于 2025-4-2 07:48 | 显示全部楼层
你用的是 LL_GPIO_SetPinMode() 还是自己封装了一层?看看 ST 的参考手册,确认 MODER 计算逻辑。
Wordsworth 发表于 2025-4-2 07:49 | 显示全部楼层
CubeG0 里有可能是某个旧版本的问题,可以去 ST 官方论坛看看有没有类似反馈。
Bblythe 发表于 2025-4-2 07:50 | 显示全部楼层
你可以试试 printf("Pin=%u, Shift=%u\n", Pin, (Pin * Pin));,看看是不是得到的值和预期的不一样。
Pulitzer 发表于 2025-4-2 07:50 | 显示全部楼层
这个 (Pin * Pin) 在 Pin = 0 时还好,但 Pin = 15 时就完全错位了,应该是 Bug 吧?
Uriah 发表于 2025-4-2 07:52 | 显示全部楼层
GPIO_MODER 是每个 Pin 占 2 位的,Pin * 2U 计算应该是对的,这个 (Pin * Pin) 确实像是笔误。
Clyde011 发表于 2025-4-2 07:53 | 显示全部楼层
ST 有时候 LL 库的实现也会有些奇怪的地方,建议看看 HAL 版本的实现是不是正常的,或者干脆直接操作寄存器。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

59

主题

85

帖子

0

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