操作系统嵌入式物联网嵌入式OSRTOS【免费下载链接】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/stm32/stm32h503-st-nucleo开发板的 RTduinoRT-Thread Arduino 生态兼容层适配展开系统讲解如何在 NUCLEO-H503RB 上开启 Arduino 兼容模式、D0~D15 与 A0~A5 的完整引脚映射关系以及这些映射在pins_arduino.c/pins_arduino.h源码中的具体实现与底层设备接管逻辑。读完本文你将能够像写 Arduino 程序一样操作这块 STM32H503 开发板并直接复用 Arduino 社区的海量传感器、显示与通信库。1 RTduinoRT-Thread 的 Arduino 生态兼容层stm32h503-st-nucleoBSP 已完整适配 RTduino 软件包。RTduino 是运行在 RT-Thread 之上的一层 Arduino 兼容封装它把 RT-Thread 的pinGPIO、serialUART、adc、pwm、i2c等设备框架接口映射为 Arduino 风格的pinMode()、digitalWrite()、digitalRead()、analogRead()、analogWrite()、Serial2、Wire等 API同时提供setup()/loop()应用入口让熟悉 Arduino 的开发者可以零成本迁移到 RT-Thread 平台并复用 Arduino 社区丰富的第三方库显著增强 RT-Thread 生态。这一层的入口代码位于 BSP 的applications/arduino_main.cpp源码入口其默认实现即为标准 Arduino 骨架#include Arduino.h void setup(void) { /* put your setup code here, to run once: */ Serial2.begin(); } void loop(void) { /* put your main code here, to run repeatedly: */ Serial2.println(Hello Arduino!); delay(800); }即系统启动后通过Serial2对应下文引脚表中的 D0/D1持续输出 Hello Arduino!每 800ms 一次——编译烧录后即可在串口终端直接观察到效果。1.1 如何开启针对本 BSP 的 Arduino 生态兼容层开启方式有两种任选其一Env 工具在 BSP 目录下执行menuconfigRT-Thread Studio IDE在项目资源管理器中双击RT-Thread Settings。随后按如下路径勾选Hardware Drivers Config --- Onboard Peripheral Drivers --- [*] Compatible with Arduino Ecosystem (RTduino)勾选该选项后BSP 的 board/Kconfig 会自动连锁使能一组配套外设开发者无需手动逐个配置自动使能项说明PKG_USING_RTDUINO拉取并编译 RTduino 软件包BSP_USING_STLINK_TO_USART、BSP_USING_UART1板载 ST-LINK 虚拟串口链路与 Arduino Serial2 使用的 uart1BSP_USING_GPIO数字引脚pin 设备BSP_USING_ADC/BSP_USING_ADC1模拟输入 A0~A5 对应的 adc1BSP_USING_PWM/BSP_USING_PWM1/2/3及其 CH 通道D5、D6、D9、D10、D11 对应的 PWM 输出RT_USING_I2C、BSP_USING_SOFT_I2C/SOFT_I2C1软件 I2C 总线 swi2c1Wire 库依赖RTDUINO_USING_WIRE、RTDUINO_USING_SERVOimplyArduino WireI2C与 Servo 功能组件从构建脚本 applications/arduino_pinout/SConscript 可以看到引脚映射文件仅在PKG_USING_RTDUINO使能时参与编译而 applications/SConscript 则进一步通过RTDUINO_NO_SETUP_LOOP开关控制是否编译arduino_main.cpp即是否启用setup()/loop()入口。2 Arduino 引脚排布总览NUCLEO-H503RB 通过板载 Zio/Arduino UNO V3 兼容连接器引出 16 个数字引脚D0~D15与 6 个模拟引脚A0~A5完整映射定义位于 pins_arduino.c 与 pins_arduino.h。以下表格逐项列出对应关系GET_PIN(X, y)为 RT-Thread 的引脚编号宏表示 GPIOX 的第 y 脚Arduino引脚编号STM32引脚编号5V容忍备注0 (D0)GET_PIN(B, 15)是Serial2-RX默认被 RT-Thread 的 UART 设备框架 uart1 接管1 (D1)GET_PIN(B, 14)是Serial2-TX默认被 RT-Thread 的 UART 设备框架 uart1 接管2 (D2)GET_PIN(A, 10)是3 (D3)GET_PIN(B, 3)是4 (D4)GET_PIN(B, 5)是5 (D5)GET_PIN(B, 4)是PWM1-CH2默认被 RT-Thread 的 PWM 设备框架 pwm1 接管6 (D6)GET_PIN(B, 10)是PWM2-CH3默认被 RT-Thread 的 PWM 设备框架 pwm2 接管7 (D7)GET_PIN(A, 8)是8 (D8)GET_PIN(C, 7)是9 (D9)GET_PIN(C, 6)是PWM3-CH1默认被 RT-Thread 的 PWM 设备框架 pwm3 接管10 (D10)GET_PIN(C, 9)是PWM3-CH4默认被 RT-Thread 的 PWM 设备框架 pwm3 接管11 (D11)GET_PIN(A, 7)是PWM3-CH2默认被 RT-Thread 的 PWM 设备框架 pwm3 接管12 (D12)GET_PIN(A, 6)是13 (D13)GET_PIN(A, 5)是板载用户 LED14 (D14)GET_PIN(B, 7)是I2C1-SDA默认被 RT-Thread 的 I2C 设备框架 swi2c1 接管15 (D15)GET_PIN(B, 6)是I2C1-SCL默认被 RT-Thread 的 I2C 设备框架 swi2c1 接管16 (A0)GET_PIN(A, 0)是ADC1-CH0默认被 RT-Thread 的 ADC 设备框架 adc1 接管17 (A1)GET_PIN(A, 1)是ADC1-CH1默认被 RT-Thread 的 ADC 设备框架 adc1 接管18 (A2)GET_PIN(A, 2)是ADC1-CH14默认被 RT-Thread 的 ADC 设备框架 adc1 接管19 (A3)GET_PIN(B, 0)是ADC1-CH9默认被 RT-Thread 的 ADC 设备框架 adc1 接管20 (A4)GET_PIN(C, 1)是ADC1-CH11默认被 RT-Thread 的 ADC 设备框架 adc1 接管21 (A5)GET_PIN(C, 0)是ADC1-CH10默认被 RT-Thread 的 ADC 设备框架 adc1 接管注意数字引脚与模拟引脚的 Arduino 编号是连续的D0~D15 依次为 0~15A0~A5 依次为 16~21任何情况下都不应打乱该顺序否则会导致 RTduino 引脚映射错位详见下文的源码约束。所有引出引脚均为 5V 容忍可直接与 5V 逻辑的 Arduino 模块互连但板载电平仍为 3.3V供电与逻辑参考电平请以 3.3V 为准。3 源码级解读引脚映射表与设备接管3.1 引脚编号宏与设备名pins_arduino.hpins_arduino.h 定义了 RTduino 与用户代码共享的关键宏#define D0 (0) /* ... D1~D15 依序递增 ... */ #define A0 (16) /* ... A1~A5 依序递增 ... */ #define RTDUINO_PIN_MAX_LIMIT A5 /* pin number max limit check */ #define F_CPU 250000000L /* CPU:250MHz */ #define LED_BUILTIN D13 /* Default Built-in LED */ /* swi2c1 : PB.7-SDA PB.6-SCL */ #define RTDUINO_DEFAULT_IIC_BUS_NAME swi2c1 /* Serial2(uart1) : PB.14-TX PB.15-RX */ #define RTDUINO_SERIAL2_DEVICE_NAME uart1各宏含义D0~D15、A0~A5Arduino 引脚别名必须按序定义且不可更改。RTDUINO_PIN_MAX_LIMIT作为引脚合法性检查上限值为A5即 21RTduino 内部会用它与引脚编号做边界校验F_CPU声明 CPU 主频为 250MHz与 NUCLEO-H503RB 的 STM32H503RB 最高主频一致详见 README_zh.md供依赖延时计算如delayMicroseconds的 Arduino 库使用LED_BUILTIN指定板载用户 LED 对应 D13GPIO A5Arduino 的LED_BUILTIN惯用法由此生效RTDUINO_DEFAULT_IIC_BUS_NAMEWireI2C默认总线名。注意本 BSP 使用的是软件 I2C 总线swi2c1引脚 PB7-SDA / PB6-SCL而非硬件 I2CRTDUINO_SERIAL2_DEVICE_NAMEArduinoSerial2对象对应的 RT-Thread 串口设备名uart1PB14-TX / PB15-RX。3.2 pin_map_table引脚映射的核心数据结构pins_arduino.cpins_arduino.c 中的pin_map_table[]是 RTduino 解析引脚功能的唯一事实来源其条目格式为{ Arduino Pin, RT-Thread Pin [, Device Name, Channel] }其中[]表示可选字段。源码注释明确给出了两条约束数字引脚Digital严禁携带设备名与通道号——它们只走 GPIOpin设备模拟/复用引脚Analog必须携带设备名与通道号ADC、PWM 或 DAC用于把引脚绑定到对应设备实例。完整映射表如下与上文引脚总览一一对应const pin_map_t pin_map_table[] { { D0, GET_PIN(B, 15), uart1 }, /* Serial-RX */ { D1, GET_PIN(B, 14), uart1 }, /* Serial-TX */ { D2, GET_PIN(A, 10) }, { D3, GET_PIN(B, 3) }, { D4, GET_PIN(B, 5) }, { D5, GET_PIN(B, 4), pwm1, 2 }, /* PWM */ { D6, GET_PIN(B, 10), pwm2, 3 }, /* PWM */ { D7, GET_PIN(A, 8) }, { D8, GET_PIN(C, 7) }, { D9, GET_PIN(C, 6), pwm3, 1 }, /* PWM */ { D10, GET_PIN(C, 9), pwm3, 4 }, /* PWM */ { D11, GET_PIN(A, 7), pwm3, 2 }, /* PWM */ { D12, GET_PIN(A, 6) }, { D13, GET_PIN(A, 5) }, { D14, GET_PIN(B, 7), swi2c1 }, /* I2C-SDA (Wire) */ { D15, GET_PIN(B, 6), swi2c1 }, /* I2C-SCL (Wire) */ { A0, GET_PIN(A, 0), adc1, 0 }, /* ADC */ { A1, GET_PIN(A, 1), adc1, 1 }, /* ADC */ { A2, GET_PIN(A, 2), adc1, 14 }, /* ADC */ { A3, GET_PIN(B, 0), adc1, 9 }, /* ADC */ { A4, GET_PIN(C, 1), adc1, 11 }, /* ADC */ { A5, GET_PIN(C, 0), adc1, 10 }, /* ADC */ };几点值得注意的底层细节UARTD0/D1 被绑定到uart1与 board/Kconfig 中BSP_USING_STLINK_TO_USARTBSP_USING_UART1的自动使能配合实现即插即用的串口调试与通信。PWMD5/D6/D9/D10/D11 分别路由到pwm1-CH2、pwm2-CH3、pwm3-CH1、pwm3-CH4、pwm3-CH2。调用 Arduino 的analogWrite()时RTduino 会依据该表把占空比写入对应 PWM 设备通道。I2CWireD14/D15 绑定到软件 I2C 总线swi2c1其 SCL/SDA 默认引脚号22/23由 board/Kconfig 中的RT_SOFT_I2C1_SCL_PIN_DEFAULT/RT_SOFT_I2C1_SDA_PIN_DEFAULT提供可在 menuconfig 中调整。ADCA0~A5 的 ADC 通道号与 STM32 外设的通道编号并不连续0、1、14、9、11、10这是由 STM32H503 的 ADC1 通道复用关系决定的映射时必须严格照表填写不能按顺序想当然地递增。4 使用建议与注意事项结合上文源码与 BSP 配置实际使用时请留意以下几点引脚编号顺序不可改变pins_arduino.h中 D/A 别名与pins_arduino.c中pin_map_table[]的条目顺序必须严格对应且连续否则 RTduino 无法正确解析引脚功能被设备框架接管的引脚不能当普通 GPIO 用如 D0/D1uart1、D5/D6/D9/D10/D11PWM、D14/D15swi2c1、A0~A5adc1。若用户代码在setup()中将这些引脚重新pinMode()为普通输出会与底层设备驱动产生冲突通常应先通过 RT-Thread 设备接口rt_device_find等或关闭相应外设配置后再使用板载 LED 与 D13 共用LED_BUILTIN即 D13PA5对 D13 执行digitalWrite(LED_BUILTIN, HIGH/LOW)可直接点亮/熄灭板载用户 LEDWire 走软件 I2CRTDUINO_DEFAULT_IIC_BUS_NAME为swi2c1速率与稳定性受软件时序影响对时序敏感的外设建议优先使用硬件 I2C 外设或调整软 I2C 引脚配置首次编译前更新软件包如 BSP README_zh.md 所述使用前需在 ENV 中执行pkgs --update拉取 HAL 库、CMSIS 库及 RTduino 软件包否则编译无法通过引脚表为只读事实来源如需增删或改接引脚应同步修改pin_map_table[]与pins_arduino.h中的别名宏、RTDUINO_PIN_MAX_LIMIT并保持两文件一致改动后重新执行scons构建。5 小结本文完整梳理了 NUCLEO-H503RBstm32h503-st-nucleoBSP 的 RTduino Arduino 生态兼容能力通过 board/Kconfig 一键开启兼容层即可获得 D0~D15、A0~A5 共 22 个标准 Arduino 引脚其中 UARTuart1、PWMpwm1/2/3、软件 I2Cswi2c1、ADCadc1均已被底层设备框架自动接管映射实现在 pins_arduino.c 与 pins_arduino.h 中。在此基础上开发者可以像使用 Arduino UNO 一样编写setup()/loop()程序并复用 Arduino 社区库快速构建基于 RT-Thread 的 IoT 原型与产品。赞分享操作系统嵌入式物联网嵌入式OSRTOS【免费下载链接】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点击查看免费下载相关推荐为什么Thorium浏览器正在改变Chromium生态的游戏规则为什么Thorium浏览器正在改变Chromium生态的游戏规则 Thorium是一款基于Chromium开源项目的浏览器分支以元素周期表中第90号元素钍操作系统嵌入式物联网嵌入式OSRTOSSTM32F401 Nucleo 的 Arduino 生态兼容实战RT-Thread RTduino 引脚排布与编程指南STM32F401 Nucleo 的 Arduino 生态兼容实战RT Thread RTduino 引脚排布与编程指南 RT Thread 官方 BSP s操作系统嵌入式物联网嵌入式OSRTOSSTM32F410 Nucleo 的 RTduino 引脚映射与 Arduino 生态兼容实战指南STM32F410 Nucleo 的 RTduino 引脚映射与 Arduino 生态兼容实战指南 本篇指南以 RT Thread 仓库中 bsp/stm32/操作系统嵌入式物联网嵌入式OSRTOS创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考