尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

RT-Thread ES32F369x BSP 的 Arduino 生态兼容指南:RTduino 适配、引脚排布与功能测试

发布时间:2026/9/23 18:55:47

资讯中心
01
ARTICLE

RT-Thread ES32F369x BSP 的 Arduino 生态兼容指南:RTduino 适配、引脚排布与功能测试

RT-Thread ES32F369x BSP 的 Arduino 生态兼容指南:RTduino 适配、引脚排布与功能测试
RT-Thread ES32F369x BSP 的 Arduino 生态兼容指南RTduino 适配、引脚排布与功能测试【免费下载链接】rt-threadRT-Thread is an open source IoT Real-Time Operating System (RTOS). https://rt-thread.github.io/rt-thread/项目地址: https://gitcode.com/gh_mirrors/rt/rt-thread本文基于 RT-Thread 仓库中bsp/essemi/es32f369x的东软载波 ES-PDS-ES32F369x 开发板Cortex-M396MHzBSP系统讲解其 Arduino 生态兼容层 RTduino 的启用方法、Arduino 引脚排布、I2C/SPI 总线使用以及完整的功能测试流程。读完本文你将掌握如何在 KeilEnv 或 RT-Thread Studio 中为 ES32F3696 开启 RTduino 支持、正确使用 Arduino 标准 APIpinMode/digitalWrite/analogWrite/Wire/SPI驱动板载外设并能独立运行 GPIO、PWM、I2C、SPI、中断、ADC 等全套验证用例。1 RTduinoRT-Thread 的 Arduino 生态兼容层RTduino 是 RT-Thread 生态中的 Arduino 兼容层软件包它让开发者可以在 RT-Thread 上直接使用 Arduino 的编程模型setup()/loop()结构、digitalWrite、analogRead、Wire、SPI等 API从而复用庞大的 Arduino 第三方库生态。ES32F3696 芯片所在的 ES-PDS-ES32F369x BSP 已完整适配 RTduino支持 GPIO、PWM、I2C、SPI 等全部常用功能。除标准 Arduino UNO 接口外该开发板还额外扩展了4 个 LEDD16~D19和 1 组五向方向键D20~D24对应的 GPIO方便直接编写板载外设测试程序。从源码结构看BSP 的 Arduino 引脚适配代码集中在bsp/essemi/es32f369x/applications/arduino_pinout/目录pins_arduino.h定义 Arduino 引脚编号宏D0~D24、A0~A5、F_CPU、默认 I2C/SPI 总线名称与LED_BUILTINpins_arduino.c定义pin_map_table[]引脚映射表将 Arduino 引脚关联到 RT-Thread PIN 编号及对应外设SConscript以PKG_USING_RTDUINO为编译依赖条件启用 RTduino 后自动纳入构建。引脚映射表的核心结构如下摘自 pins_arduino.c/* {Arduino Pin, RT-Thread Pin [, Device Name, Channel]} [] means optional Digital pins must NOT give the device name and channel. Analog pins MUST give the device name and channel(ADC, PWM or DAC). Arduino Pin must keep in sequence. */ const pin_map_t pin_map_table[] { {D0, GET_PIN(E,3), uart2}, /* UART2-RX */ {D3, GET_PIN(A,2),pwm2,3}, /* PWM2 GP32C4T0 CH3 */ {D11, GET_PIN(B,5), spi0}, /* SPI0-MOSI */ {D14, GET_PIN(B,7), i2c0}, /* I2C0-SDA */ {A0, GET_PIN(C,0),adc0,0}, /* ADC0 */ /* ... */ };该表的约束规则非常清晰数字引脚只给 RT-Thread PIN 编号模拟/PWM/ADC 引脚必须额外给出设备名与通道号这也是理解后续对非数字 IO 管脚不要调用 pinMode注意事项的基础。2 启用 RTduino 的两种方式2.1 方式一Keil Env在 BSP 目录bsp/essemi/es32f369x打开 Env 工具输入menuconfig命令若使用 RT-Thread Studio则选择RT-Thread Settings进入以下配置项并勾选Hardware Drivers Config --- Onboard Peripheral Drivers --- [*] Compatible with Arduino Ecosystem (RTduino)进入 RTduino 配置菜单按需开启 SPI、I2C、Adafruit 等子功能RT-Thread online packages --- system packages --- RTduino: Arduino Ecological Compatibility Layer执行pkgs --update下载 RTduino 软件包。执行scons --targetmdk5重新生成 MDK5 工程编译下载即可。从 drivers/Kconfig 可以看到勾选BSP_USING_ARDUINO时会自动连带开启一系列依赖项config BSP_USING_ARDUINO bool Compatible with Arduino Ecosystem (RTduino) select PKG_USING_RTDUINO select BSP_USING_GPIO select BSP_USING_UART2 select BSP_USING_SPI0 select BSP_USING_I2C0 select BSP_USING_ADC0 select BSP_USING_GP32C4T0_PWM select RTDUINO_USING_WIRE select RTDUINO_USING_SPI imply RTDUINO_USING_SERVO default n即GPIO、UART2默认控制台串口、SPI0、I2C0、ADC0、PWMGP32C4T0以及 RTduino 的 Wire/SPI 兼容接口会被一次性选中这也印证了 README 中默认只开启了 spi0、i2c0 及 uart2的说明。2.2 方式二RT-Thread Studio选择文件 → 导入 → BSP 导入选择es32f369x的 BSP 路径填写工程名称芯片型号填es32f3696lx打开RT-Thread Settings在硬件配置中开启 RTduino 支持保存后稍等片刻Studio 会自动下载软件包并完成配置。2.3 Studio 编译常见问题与解决方案问题 1Unknown flag -T原因工程链接脚本未正确配置。解决进入项目 → 属性 → C/C 构建 → GNU ARM Cross C Linker → General在右侧添加链接脚本需先删除原有的再添加${workspace_loc:/${ProjName}/drivers/linker_scripts/link.lds}问题 2启动时直接进入 Fault原因C 编译选项缺少架构指定。解决进入项目 → 属性 → C/C 构建 → GNU ARM Cross C Complier → Miscellaneous在 Other compiler flags 中添加-mcpucortex-m3 -mthumb3 Arduino 引脚排布该 BSP 遵循 Arduino UNO 板的引脚排列方式并额外扩展了 LED 与按键。完整的引脚映射定义在 pins_arduino.c 与 pins_arduino.h 中。Arduino 引脚编号ES32 引脚编号备注D0PE3UART2 RXD1PE2UART2 TXD2PE4普通 IOD3PA2PWM2 通道 3D4PE5普通 IOD5PA1PWM2 通道 2D6PA0PWM2 通道 1D7PE6普通 IOD8PB8普通 IOD9PB9普通 IOD10PB0SPI 片选/普通 IOD11PB5SPI1_MOSI/普通 IOD12PB4SPI1_MISO/普通 IOD13PD3SPI1_SCK/普通 IOD14PB7I2C0_SDAD15PB6I2C0_SCLD16PC8LED4D17PC12LED5D18PC7LED6D19PC6LED7D20PF1KEY_UPD21PF4KEY_DOWND22PF6KEY_LEFTD23PF0KEY_RIGHTD24PF7KEY_CENTERA0PC0ADCA1PC1ADCA2PC2ADCA3PC3ADCA4PA4ADCA5PA5ADC对应地pins_arduino.h 中定义了与表格顺序一致的引脚编号宏#define D0 (0) ... #define D24 (24) #define A0 (25) ... #define A5 (30) #define RTDUINO_PIN_MAX_LIMIT A5 /* pin number max limit check */ #define F_CPU 96000000L /* CPU: 96MHz */ #define RTDUINO_DEFAULT_IIC_BUS_NAME i2c0 #define SS D10 #define RTDUINO_DEFAULT_SPI_BUS_NAME spi0 #define LED_BUILTIN D16几个值得注意的点引脚编号 D0~D24、A0~A5 必须按顺序递增RTDUINO_PIN_MAX_LIMIT用于引脚编号合法性检查LED_BUILTIN被定义为 D16PC8LED4因此arduino_main.cpp中默认的 LED 闪烁程序可以直接使用LED_BUILTINSS片选默认挂在 D10PB0上与 UNO 布局一致。4 I2C 总线ES32-Arduino 支持的 I2C 总线为i2c0引脚 SDAPB7、SCLPB6即 D14/D15。I2C 的引脚已被 RT-Thread I2C 设备框架接管无需直接操控这两个引脚直接引用 Arduino 官方头文件#include Wire.h即可使用也可以使用#include Adafruit_I2CDevice.h通过 Adafruit 库进行控制。默认 I2C 总线名称在 pins_arduino.h 中定义为RTDUINO_DEFAULT_IIC_BUS_NAME i2c0。5 SPI 总线ES32-Arduino 的 SPI 总线为spi0SCKPD3、MISOPB4、MOSIPB5引脚由 RT-Thread SPI 设备框架接管同样无需直接操控直接引用#include SPI.h即可使用或使用#include Adafruit_SPIDevice.h进行控制。按照 Arduino 编程标准片选信号SSD10需要用户自行控制。默认 SPI 总线名称在 pins_arduino.h 中定义为RTDUINO_DEFAULT_SPI_BUS_NAME spi0。6 功能测试说明在 examples/arduino_examples.cpp 中已经根据功能预设了一系列测试函数可通过取消/启用对应宏定义来开关各项测试。测试方法将该文件内容覆盖到 arduino_main.cpp 中即替换默认的setup()/loop()。6.1 RTduino 各功能测试宏宏定义名称描述ARDU_TEST_GPIO数字 GPIO 测试测试数字管脚的输出功能包括两个管脚输出高/低电平一个管脚输出 0.5s 周期的方波ARDU_TEST_PWM模拟 PWM 输出测试PWM 功能输出测试分别在三个 PWM 管脚输出不同的三种占空比的方波ARDU_TEST_ADAFRUIT_I2CAdafruitI2C 测试使用 AdafruitI2C 库发送数据测试正常可以收到不断发送的 ABtestabtestARDU_TEST_ADAFRUIT_SPIAdafruitSPI 测试使用 AdafruitSPI 库发送数据测试正常可收到不断的 testARDU_TEST_I2CI2C 测试通过 I2C 接口发送数据测试正常可收到不断的 testARDU_TEST_SPISPI 测试通过 SPI 接口发送和接收数据测试正常可收到不断的 testARDU_TEST_INT中断测试测试外部中断按下方向键的中键会打印相关信息ARDU_TEST_DIGITAL_READ数字读测试不断读取各个方向键的状态并在按下时输出信息ARDU_TEST_ADC_READADC 测试循环读取各个 ADC 的数据并通过串口打印ARDU_TEST_BMI160_PKG第三方 BMI160 包测试测试导入的 BMI160 库是否正常程序会不断读取传感器数据并通过串口打印6.2 测试实现的关键细节结合 examples/arduino_examples.cpp 源码各测试的核心逻辑如下GPIO 输出ARDU_TEST_GPIOpinMode(D2/D4/D7/D18, OUTPUT)后通过digitalWrite翻转电平并在loop()中配合delay(250)产生约 0.5s 周期的方波PWM 输出ARDU_TEST_PWM先调用analogWriteFrequency(10)设置 PWM 频率再对 D3、D5、D6 分别调用analogWrite(80/127/200)输出三种不同占空比中断测试ARDU_TEST_INTattachInterrupt(digitalPinToInterrupt(D24), test_int, FALLING)注册方向键中键KEY_CENTER的下降沿中断触发后串口打印Interrupt Triggered数字读测试ARDU_TEST_DIGITAL_READ将 D20~D23 配置为INPUTloop()中持续digitalRead并在检测到LOW时打印UP/DOWN/LEFT/RIGHTADC 测试ARDU_TEST_ADC_READanalogRead(A0 count % 6)循环采样 6 路 ADC 并通过rt_kprintf打印原始值SPI 收发ARDU_TEST_SPISPI.begin()后通过SPI.beginTransaction(SPISettings(100000, MSBFIRST, SPI_MODE1))配置 100kHz、高位先行、模式 1手动拉低 D10 片选执行SPI.transfer后再拉高I2C 收发ARDU_TEST_I2CWire.begin()后对地址0x2D执行beginTransmission/write/endTransmissionAdafruit 封装ARDU_TEST_ADAFRUIT_I2C/SPI实例化Adafruit_I2CDevice i2c_dev(0x2D)、Adafruit_BusIO_Register i2c_reg(i2c_dev, 0x6261, 2, 0, 2)、Adafruit_SPIDevice spi_dev(D10, 100000)等对象进行读写。6.3 第三方 Arduino 库导入测试DFRobot_BMI160以 DFRobot_BMI160 库为例BMI160 六轴传感器下载库后解压放到packages\RTduino-latest\libraries\user目录下该库存在一处函数重载歧义需要将第 856 行修改为Wire.requestFrom(dev-id,(uint8_t)len);使用 Keil 编译时还需处理两个问题缺少INT8_C和UINT8_C宏定义手动在 pins_arduino.h 或其他 Arduino 头文件中添加#ifndef INT8_C #define INT8_C(x) ((int8_t)x) #endif #ifndef UINT8_C #define UINT8_C(x) ((uint8_t)x) #endif编译报错Data initializer is not allowed若使用 AC5 编译器给arduino_main.cpp和DFRobot_BMI160.cpp添加--cpp11 --gnu若使用 AC6 编译器则需修改工程文件删掉所有的--cpp11 --c11 --gnu如果用 RT-Thread Studio 编译则不存在上述编译器问题只需修改重载歧义即可直接使用。测试代码中ARDU_TEST_BMI160_PKG通过bmi160-I2cInit()初始化并循环读取加速度计与陀螺仪数据int result bmi160-getAccelData(data); /* 读取加速度数据 */ int result bmi160-getAccelGyroData(data); /* 读取加速度陀螺仪数据 */7 使用注意事项7.1 ADC 返回原始值目前 ES32 的analogRead返回的是ADC 原始采样值需要自行计算转换为实际电压值暂时不支持分辨率调节启用时会输出警告信息可忽略。7.2 对非数字 IO 的管脚不要调用 pinMode非数字 IO 管脚如 PWM、ADC、I2C、SPI 引脚在其他地方已经完成初始化再次调用pinMode会使其变为普通管脚且该过程不可逆——原有的预设功能PWM/ADC/总线将会失效。即任何管脚都可以用pinMode变为数字 IO 管脚但不能再恢复为原来的外设功能。7.3 SPI/I2C/UART 使用规则默认只开启了spi0、i2c0 及 uart2默认控制台串口。如需使用其他 SPI/I2C/UART可以在配置中启用并在初始化时指定对应设备名称。若需要调整管脚信息可以使用东软载波的 ESCodeMaker 辅助工具生成但要注意打开对应的外设。另外SPI 必须先调用begin()才能使用其他函数。7.4 RTduino 编译报错 posix/xxx.h cannot find如果编译报错为posix/xxx.h cannot find说明当前 RT-Thread 版本较旧缺少 POSIX 头文件请将 RT-Thread 更新到最新版本从官方仓库拉取最新源码后再编译。8 默认示例程序在未启用任何测试宏的情况下arduino_main.cpp 提供了一个最简的 Arduino 风格闪烁程序可直接作为开发模板#include Arduino.h void setup(void) { pinMode(LED_BUILTIN, OUTPUT); /* LED_BUILTIN D16 PC8(LED4) */ } void loop(void) { digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); delay(250); }9 总结ES32F369x BSP 通过 RTduino 兼容层为开发者提供了完整的 Arduino 开发体验统一的 UNO 引脚排布、被设备框架接管的 I2C/SPI 总线、可直接运行的 GPIO/PWM/中断/ADC 测试用例以及板载 LED 与方向键的便捷扩展。无论是通过 KeilEnv 的命令行工作流还是 RT-Thread Studio 的图形化配置都能在数分钟内完成从配置到运行的整个过程。相关代码均可在仓库的bsp/essemi/es32f369x/applications/arduino_pinout/目录下查阅与复用。【免费下载链接】rt-threadRT-Thread is an open source IoT Real-Time Operating System (RTOS). https://rt-thread.github.io/rt-thread/项目地址: https://gitcode.com/gh_mirrors/rt/rt-thread创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。