Skip to content

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

Merged
Rbb666 merged 2 commits intoRT-Thread:masterfrom
wdfk-prog:pr/02-stm32-hard-i2c-transfer-refactor
Apr 7, 2026
Merged

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

Conversation

@wdfk-prog
Copy link
Copy Markdown
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
Copy Markdown

👋 感谢您对 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
Copy Markdown

📌 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.

@Rbb666 Rbb666 added this to the v5.3.1 milestone Apr 7, 2026
@Rbb666 Rbb666 merged commit 0861ee1 into RT-Thread:master Apr 7, 2026
37 checks passed
@wdfk-prog wdfk-prog deleted the pr/02-stm32-hard-i2c-transfer-refactor branch April 7, 2026 05:46
@kurisaW kurisaW removed this from the v5.3.1 milestone Apr 7, 2026
@kurisaW kurisaW added the 5.3.0 label Apr 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

5.3.0 BSP: STM32 BSP related with ST/STM32 BSP

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants