You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C++库中使用树莓派Pico PIO I2C时遭遇枚举类型转换编译错误

问题解决:树莓派Pico PIO/I2C库编译报错(uint转pio_interrupt_source失败)

错误原因

C++对枚举类型的类型检查远严格于C:

  • 在C中,枚举成员可隐式转换为整数,整数也能隐式转回枚举类型;
  • 但C++中枚举是强类型,pis_interrupt0(pio_interrupt_source枚举成员)与sm(uint)相加后得到uint类型,无法直接隐式转换回pio_interrupt_source,因此触发编译错误。

解决方案

临时快速修复

找到编译报错的i2c.pio.h文件,将报错行修改为带显式类型转换的代码:

pio_set_irq0_source_enabled(pio, static_cast<pio_interrupt_source>(pis_interrupt0 + sm), false);

若偏好C风格转换,也可写成:

pio_set_irq0_source_enabled(pio, (pio_interrupt_source)(pis_interrupt0 + sm), false);

持久化修复(避免自动生成覆盖)

由于i2c.pio.h是由i2c.pio通过pioasm工具自动生成的,每次重新构建会覆盖手动修改内容,可通过以下方式持久化解决:

  • 在项目CMake配置中添加补丁步骤:生成i2c.pio.h后自动执行脚本修改目标代码行;
  • 自定义pioasm的代码生成模板,让生成的代码默认带上显式类型转换。

额外注意

确保库和主项目都正确引入了Pico SDK中定义pio_interrupt_source的hardware/pio.h头文件——从报错信息看头文件已正常引入,核心问题仍是C++的强类型枚举转换限制。

内容的提问来源于stack exchange,提问作者burton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 22:07:28