Skip to content

feat(stm32): Add hard I2C mode selection and I2C4 support#11255

Open
wdfk-prog wants to merge 2 commits intoRT-Thread:masterfrom
wdfk-prog:pr/02-stm32-hard-i2c-transfer-refactor
Open

feat(stm32): Add hard I2C mode selection and I2C4 support#11255
wdfk-prog wants to merge 2 commits intoRT-Thread:masterfrom
wdfk-prog:pr/02-stm32-hard-i2c-transfer-refactor

Conversation

@wdfk-prog
Copy link
Contributor

为什么提交这份PR (why to submit this PR)

当前 STM32 硬件 I2C 驱动对传输模式的支持不够清晰,发送和接收路径主要依赖固定的 IT / DMA 逻辑,缺少对 POLL、INT、DMA 的统一区分与按配置选择;同时现有实现对 I2C4 的支持不完整,初始化、DMA/IRQ 处理、传输流程和错误恢复路径也存在可维护性不足的问题。

因此提交本 PR,用于完善 STM32 硬件 I2C 驱动的模式选择机制,并补齐 I2C4 支持,提升代码可配置性、可扩展性和稳定性。

你的解决方案是什么 (what is your solution)

本 PR 主要完成了以下改动:

  1. 统一硬件 I2C 能力宏定义

    • 在头文件中新增 BSP_HARDWARE_I2CBSP_I2C_USING_POLLBSP_I2C_USING_INTBSP_I2C_USING_DMABSP_I2C_USING_IRQ 等聚合宏;
    • 将不同 I2C 实例的 TX/RX 传输方式统一抽象,便于按配置选择实现路径。
  2. 增加 I2C4 支持

    • 扩展 i2c_index_ti2c_config[]、DMA/IRQ 中断处理与初始化逻辑;
    • 使 BSP_USING_HARD_I2C4 场景能够进入完整的总线注册和收发流程。
  3. 重构主传输流程

    • 拆分出 stm32_i2c_master_receive_start()stm32_i2c_master_transmit_start()
    • 根据配置在 DMA / INT / POLL 三种方式中自动选择;
    • 对短数据传输增加 DMA 长度门限控制,避免不必要的 DMA 启动。
  4. 优化顺序传输与模式判断

    • 新增 stm32_i2c_get_xfer_mode() 统一计算 HAL 顺序传输模式;
    • 规范处理 RT_I2C_NO_START / RT_I2C_NO_STOP 的组合逻辑;
    • 增加 stm32_i2c_mode_name() 便于日志分析。
  5. 完善初始化和错误处理

    • 按实际启用的 DMA / INT 配置初始化 NVIC 与 completion;
    • 在总线配置和注册失败时输出明确日志;
    • 改进 NACK / BUS ERROR 处理逻辑,补充 H7 与非 H7 平台差异化 STOP 行为;
    • 修正部分注释、日志和代码风格问题。
  6. 兼容更多 STM32 系列初始化细节

    • 调整 H7 与非 H7 的 I2C 初始化参数设置;
    • 保持不同 SoC 系列下的初始化逻辑更清晰。

请提供验证的bsp和config (provide the config and bsp)

  • BSP:

    • bsp/stm32/[请填写你实际验证的 BSP 路径]
  • .config:

    • [请填写你实际验证时启用的配置,例如]
    • BSP_USING_HARD_I2C1
    • BSP_I2C1_TX_USING_POLL
    • BSP_I2C1_RX_USING_POLL
    • BSP_I2C1_TX_USING_INT
    • BSP_I2C1_RX_USING_INT
    • BSP_I2C1_TX_USING_DMA
    • BSP_I2C1_RX_USING_DMA
    • 如有 I2C4 验证,请补充对应 BSP_USING_HARD_I2C4 及相关配置
        menuconfig BSP_USING_I2C
            bool "Enable I2C"
            default n
            select RT_USING_I2C
            if BSP_USING_I2C
                choice
                    prompt "Choice I2C mode"
                    default BSP_SOFTWARE_I2C
                    config BSP_SOFTWARE_I2C
                        bool "Enable I2C BUS (software simulation)"
                        select RT_USING_I2C_BITOPS
                        select RT_USING_PIN
                    config BSP_HARDWARE_I2C
                        bool "Enable I2C BUS (hardware)"
                endchoice
                if BSP_SOFTWARE_I2C
                    menuconfig BSP_USING_I2C1
                        bool "Enable I2C1 BUS (software simulation)"
                        default n
                        if BSP_USING_I2C1
                            comment "Notice: PB6 --> 22; PB7 --> 23" 
                            config BSP_I2C1_SCL_PIN
                                int "I2C1 scl pin number"
                                range 0 175
                                default 22
                            config BSP_I2C1_SDA_PIN
                                int "I2C1 sda pin number"
                                range 0 175
                                default 23
                        endif
                    menuconfig BSP_USING_I2C2
                        bool "Enable I2C2 BUS (software simulation)"
                        default n
                        if BSP_USING_I2C2
                            comment "Notice: PH13 --> 125; PH15 --> 127"
                            config BSP_I2C2_SCL_PIN
                                int "i2c2 scl pin number"
                                range 1 176
                                default 127
                            config BSP_I2C2_SDA_PIN
                                int "I2C2 sda pin number"
                                range 0 175
                                default 125
                        endif
                    menuconfig BSP_USING_I2C3
                        bool "Enable I2C3 BUS (software simulation)"
                        default n
                        if BSP_USING_I2C3
                            comment "Notice: PH12 --> 124; PH11 --> 123"
                            config BSP_I2C3_SCL_PIN
                                int "i2c3 scl pin number"
                                range 0 175
                                default 123
                            config BSP_I2C3_SDA_PIN
                                int "I2C3 sda pin number"
                                range 0 175
                                default 124
                        endif
                endif

                if BSP_HARDWARE_I2C
                    menuconfig BSP_USING_HARD_I2C1
                        bool "Enable I2C1 BUS (hardware)"
                        default n
                        if BSP_USING_HARD_I2C1
                            config BSP_I2C1_TX_USING_POLL
                                bool "BSP_I2C1_TX_USING_POLL"
                            config BSP_I2C1_TX_USING_INT
                                bool "BSP_I2C1_TX_USING_INT"
                            config BSP_I2C1_TX_USING_DMA
                                bool "BSP_I2C1_TX_USING_DMA"
                                select BSP_I2C1_TX_USING_INT

                            config BSP_I2C1_RX_USING_POLL
                                bool "BSP_I2C1_RX_USING_POLL"
                            config BSP_I2C1_RX_USING_INT
                                bool "BSP_I2C1_RX_USING_INT"
                            config BSP_I2C1_RX_USING_DMA
                                bool "BSP_I2C1_RX_USING_DMA"
                                select BSP_I2C1_RX_USING_INT
                        endif

                    menuconfig BSP_USING_HARD_I2C2
                        bool "Enable I2C2 BUS (hardware)"
                        default n
                        if BSP_USING_HARD_I2C2
                            config BSP_I2C2_TX_USING_POLL
                                bool "BSP_I2C2_TX_USING_POLL"
                            config BSP_I2C2_TX_USING_INT
                                bool "BSP_I2C2_TX_USING_INT"
                            config BSP_I2C2_TX_USING_DMA
                                bool "BSP_I2C2_TX_USING_DMA"
                                select BSP_I2C2_TX_USING_INT

                            config BSP_I2C2_RX_USING_POLL
                                bool "BSP_I2C2_RX_USING_POLL"
                            config BSP_I2C2_RX_USING_INT
                                bool "BSP_I2C2_RX_USING_INT"
                            config BSP_I2C2_RX_USING_DMA
                                bool "BSP_I2C2_RX_USING_DMA"
                                select BSP_I2C2_RX_USING_INT
                        endif
                    menuconfig BSP_USING_HARD_I2C3
                        bool "Enable I2C3 BUS (hardware)"
                        default n
                        if BSP_USING_HARD_I2C3
                            config BSP_I2C3_TX_USING_POLL
                                bool "BSP_I2C3_TX_USING_POLL"
                            config BSP_I2C3_TX_USING_INT
                                bool "BSP_I2C3_TX_USING_INT"
                            config BSP_I2C3_TX_USING_DMA
                                bool "BSP_I2C3_TX_USING_DMA"
                                select BSP_I2C3_TX_USING_INT

                            config BSP_I2C3_RX_USING_POLL
                                bool "BSP_I2C3_RX_USING_POLL"
                            config BSP_I2C3_RX_USING_INT
                                bool "BSP_I2C3_RX_USING_INT"
                            config BSP_I2C3_RX_USING_DMA
                                bool "BSP_I2C3_RX_USING_DMA"
                                select BSP_I2C3_RX_USING_INT
                        endif
                    menuconfig BSP_USING_HARD_I2C4
                        bool "Enable I2C4 BUS (hardware)"
                        default n
                        if BSP_USING_HARD_I2C4
                            config BSP_I2C4_TX_USING_POLL
                                bool "BSP_I2C4_TX_USING_POLL"
                            config BSP_I2C4_TX_USING_INT
                                bool "BSP_I2C4_TX_USING_INT"
                            config BSP_I2C4_TX_USING_DMA
                                bool "BSP_I2C4_TX_USING_DMA"
                                select BSP_I2C4_TX_USING_INT

                            config BSP_I2C4_RX_USING_POLL
                                bool "BSP_I2C4_RX_USING_POLL"
                            config BSP_I2C4_RX_USING_INT
                                bool "BSP_I2C4_RX_USING_INT"
                            config BSP_I2C4_RX_USING_DMA
                                bool "BSP_I2C4_RX_USING_DMA"
                                select BSP_I2C4_RX_USING_INT
                        endif
                endif
            endif
  • action:
    • [请填写你自己仓库该 PR branch 触发的 action 编译成功链接]

@github-actions github-actions bot added BSP: STM32 BSP related with ST/STM32 BSP labels Mar 16, 2026
@github-actions
Copy link

👋 感谢您对 RT-Thread 的贡献!Thank you for your contribution to RT-Thread!

为确保代码符合 RT-Thread 的编码规范,请在你的仓库中执行以下步骤运行代码格式化工作流(如果格式化CI运行失败)。
To ensure your code complies with RT-Thread's coding style, please run the code formatting workflow by following the steps below (If the formatting of CI fails to run).


🛠 操作步骤 | Steps

  1. 前往 Actions 页面 | Go to the Actions page
    点击进入工作流 → | Click to open workflow →

  2. 点击 Run workflow | Click Run workflow

  • 设置需排除的文件/目录(目录请以"/"结尾)
    Set files/directories to exclude (directories should end with "/")
  • 将目标分支设置为 \ Set the target branch to:pr/02-stm32-hard-i2c-transfer-refactor
  • 设置PR number为 \ Set the PR number to:11255
  1. 等待工作流完成 | Wait for the workflow to complete
    格式化后的代码将自动推送至你的分支。
    The formatted code will be automatically pushed to your branch.

完成后,提交将自动更新至 pr/02-stm32-hard-i2c-transfer-refactor 分支,关联的 Pull Request 也会同步更新。
Once completed, commits will be pushed to the pr/02-stm32-hard-i2c-transfer-refactor branch automatically, and the related Pull Request will be updated.

如有问题欢迎联系我们,再次感谢您的贡献!💐
If you have any questions, feel free to reach out. Thanks again for your contribution!

@github-actions
Copy link

📌 Code Review Assignment

🏷️ Tag: bsp_stm32

Reviewers: @Liang1795 @hamburger-os @wdfk-prog

Changed Files (Click to expand)
  • bsp/stm32/libraries/HAL_Drivers/drivers/drv_hard_i2c.c
  • bsp/stm32/libraries/HAL_Drivers/drivers/drv_hard_i2c.h

📊 Current Review Status (Last Updated: 2026-03-16 10:33 CST)


📝 Review Instructions

  1. 维护者可以通过单击此处来刷新审查状态: 🔄 刷新状态
    Maintainers can refresh the review status by clicking here: 🔄 Refresh Status

  2. 确认审核通过后评论 LGTM/lgtm
    Comment LGTM/lgtm after confirming approval

  3. PR合并前需至少一位维护者确认
    PR must be confirmed by at least one maintainer before merging

ℹ️ 刷新CI状态操作需要具备仓库写入权限。
ℹ️ Refresh CI status operation requires repository Write permission.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

BSP: STM32 BSP related with ST/STM32 BSP

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant