news 2026/9/28 20:32:14

NUCLEO-H503RB(stm32h503-st-nucleo)BSP 的 Arduino 生态兼容与引脚排布指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
NUCLEO-H503RB(stm32h503-st-nucleo)BSP 的 Arduino 生态兼容与引脚排布指南
  • 操作系统
  • 嵌入式
  • 物联网
  • 嵌入式OS
  • RTOS

【免费下载链接】rt-thread

RT-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开发板的 RTduino(RT-Thread Arduino 生态兼容层)适配展开,系统讲解如何在 NUCLEO-H503RB 上开启 Arduino 兼容模式、D0~D15 与 A0~A5 的完整引脚映射关系,以及这些映射在pins_arduino.c/pins_arduino.h源码中的具体实现与底层设备接管逻辑。读完本文,你将能够像写 Arduino 程序一样操作这块 STM32H503 开发板,并直接复用 Arduino 社区的海量传感器、显示与通信库。

1 RTduino:RT-Thread 的 Arduino 生态兼容层

stm32h503-st-nucleoBSP 已完整适配 RTduino 软件包。RTduino 是运行在 RT-Thread 之上的一层 Arduino 兼容封装:它把 RT-Thread 的pin(GPIO)、serial(UART)、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 目录下执行menuconfig;
  • RT-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 使用的 uart1
BSP_USING_GPIO数字引脚(pin 设备)
BSP_USING_ADC/BSP_USING_ADC1模拟输入 A0~A5 对应的 adc1
BSP_USING_PWM/BSP_USING_PWM1/2/3及其 CH 通道D5、D6、D9、D10、D11 对应的 PWM 输出
RT_USING_I2C、BSP_USING_SOFT_I2C/SOFT_I2C1软件 I2C 总线 swi2c1(Wire 库依赖)
RTDUINO_USING_WIRE、RTDUINO_USING_SERVO(imply)Arduino Wire(I2C)与 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)是板载用户 LED
14 (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 接管

注意:

  1. 数字引脚与模拟引脚的 Arduino 编号是连续的:D0~D15 依次为 0~15,A0~A5 依次为 16~21,任何情况下都不应打乱该顺序,否则会导致 RTduino 引脚映射错位(详见下文的源码约束)。
  2. 所有引出引脚均为 5V 容忍:可直接与 5V 逻辑的 Arduino 模块互连,但板载电平仍为 3.3V,供电与逻辑参考电平请以 3.3V 为准。

3 源码级解读:引脚映射表与设备接管

3.1 引脚编号宏与设备名(pins_arduino.h)

pins_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~A5:Arduino 引脚别名,必须按序定义且不可更改。RTDUINO_PIN_MAX_LIMIT作为引脚合法性检查上限(值为A5,即 21),RTduino 内部会用它与引脚编号做边界校验;
  • F_CPU:声明 CPU 主频为 250MHz(与 NUCLEO-H503RB 的 STM32H503RB 最高主频一致,详见 README_zh.md),供依赖延时计算(如delayMicroseconds)的 Arduino 库使用;
  • LED_BUILTIN:指定板载用户 LED 对应 D13(GPIO A5),Arduino 的LED_BUILTIN惯用法由此生效;
  • RTDUINO_DEFAULT_IIC_BUS_NAME:Wire(I2C)默认总线名。注意本 BSP 使用的是软件 I2C 总线swi2c1(引脚 PB7-SDA / PB6-SCL),而非硬件 I2C;
  • RTDUINO_SERIAL2_DEVICE_NAME:ArduinoSerial2对象对应的 RT-Thread 串口设备名uart1(PB14-TX / PB15-RX)。

3.2 pin_map_table:引脚映射的核心数据结构(pins_arduino.c)

pins_arduino.c 中的pin_map_table[]是 RTduino 解析引脚功能的唯一事实来源,其条目格式为:

{ Arduino Pin, RT-Thread Pin [, Device Name, Channel] }

其中[]表示可选字段。源码注释明确给出了两条约束:

  • 数字引脚(Digital)严禁携带设备名与通道号——它们只走 GPIO(pin)设备;
  • 模拟/复用引脚(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 */ };

几点值得注意的底层细节:

  • UART:D0/D1 被绑定到uart1,与 board/Kconfig 中BSP_USING_STLINK_TO_USART+BSP_USING_UART1的自动使能配合,实现即插即用的串口调试与通信。
  • PWM:D5/D6/D9/D10/D11 分别路由到pwm1-CH2、pwm2-CH3、pwm3-CH1、pwm3-CH4、pwm3-CH2。调用 Arduino 的analogWrite()时,RTduino 会依据该表把占空比写入对应 PWM 设备通道。
  • I2C(Wire):D14/D15 绑定到软件 I2C 总线swi2c1,其 SCL/SDA 默认引脚号(22/23)由 board/Kconfig 中的RT_SOFT_I2C1_SCL_PIN_DEFAULT/RT_SOFT_I2C1_SDA_PIN_DEFAULT提供,可在 menuconfig 中调整。
  • ADC:A0~A5 的 ADC 通道号与 STM32 外设的通道编号并不连续(0、1、14、9、11、10),这是由 STM32H503 的 ADC1 通道复用关系决定的,映射时必须严格照表填写,不能按顺序想当然地递增。

4 使用建议与注意事项

结合上文源码与 BSP 配置,实际使用时请留意以下几点:

  1. 引脚编号顺序不可改变:pins_arduino.h中 D/A 别名与pins_arduino.c中pin_map_table[]的条目顺序必须严格对应且连续,否则 RTduino 无法正确解析引脚功能;
  2. 被设备框架接管的引脚不能当普通 GPIO 用:如 D0/D1(uart1)、D5/D6/D9/D10/D11(PWM)、D14/D15(swi2c1)、A0~A5(adc1)。若用户代码在setup()中将这些引脚重新pinMode()为普通输出,会与底层设备驱动产生冲突,通常应先通过 RT-Thread 设备接口(rt_device_find等)或关闭相应外设配置后再使用;
  3. 板载 LED 与 D13 共用:LED_BUILTIN即 D13(PA5),对 D13 执行digitalWrite(LED_BUILTIN, HIGH/LOW)可直接点亮/熄灭板载用户 LED;
  4. Wire 走软件 I2C:RTDUINO_DEFAULT_IIC_BUS_NAME为swi2c1,速率与稳定性受软件时序影响,对时序敏感的外设建议优先使用硬件 I2C 外设或调整软 I2C 引脚配置;
  5. 首次编译前更新软件包:如 BSP README_zh.md 所述,使用前需在 ENV 中执行pkgs --update拉取 HAL 库、CMSIS 库及 RTduino 软件包,否则编译无法通过;
  6. 引脚表为只读事实来源:如需增删或改接引脚,应同步修改pin_map_table[]与pins_arduino.h中的别名宏、RTDUINO_PIN_MAX_LIMIT,并保持两文件一致,改动后重新执行scons构建。

5 小结

本文完整梳理了 NUCLEO-H503RB(stm32h503-st-nucleo)BSP 的 RTduino Arduino 生态兼容能力:通过 board/Kconfig 一键开启兼容层,即可获得 D0~D15、A0~A5 共 22 个标准 Arduino 引脚,其中 UART(uart1)、PWM(pwm1/2/3)、软件 I2C(swi2c1)、ADC(adc1)均已被底层设备框架自动接管,映射实现在 pins_arduino.c 与 pins_arduino.h 中。在此基础上,开发者可以像使用 Arduino UNO 一样编写setup()/loop()程序并复用 Arduino 社区库,快速构建基于 RT-Thread 的 IoT 原型与产品。

  • 操作系统
  • 嵌入式
  • 物联网
  • 嵌入式OS
  • RTOS

【免费下载链接】rt-thread

RT-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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/28 20:31:29

OpenMV+STM32+YOLO11+PaddleOCR车牌识别系统实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/28 20:29:13

2026 面试必问 Java 知识点|八股文完整整理,附详细答案

今年的行情&#xff0c;让招聘面试变得雪上加霜。已经有不少大厂&#xff0c;如腾讯、字节跳动的招聘名额明显减少&#xff0c;面试门槛却一再拔高&#xff0c;如果不用心准备&#xff0c;很可能就被面试官怼得哑口无言&#xff0c;甚至失去了难得的机会。 现如今&#xff0c;…

作者头像 李华
网站建设 2026/9/28 20:29:09

出货翻板偶尔卡在半开位置,拆开发现转轴套磨出了椭圆~YH

2026年Q2&#xff0c;一台设备的出货翻板出现了偶发卡滞问题——翻板打开后&#xff0c;偶尔卡在半开位置无法完全复位&#xff0c;导致下一次出货时商品被挡住。拆开翻板组件检查&#xff0c;发现转轴套已经磨成了椭圆形。一、现象&#xff1a;翻板偶发卡滞&#xff0c;出货失…

作者头像 李华
网站建设 2026/9/28 20:29:01

国内大型DD精密转台核心生产基地盘点

在DD精密转台领域&#xff0c;“大型生产基地”不仅代表产能规模&#xff0c;更意味着企业具备从底层核心部件自研、规模化量产到品控交付的全链路实力。结合2026年最新的行业数据&#xff0c;以下是国内在大型DD精密转台制造领域具备显著产能与技术优势的源头厂家&#xff1a;…

作者头像 李华
网站建设 2026/9/28 20:28:02

基础B(队列)(第?+1课)

1.前言 在前几分钟&#xff0c;我写完了关于栈的介绍具体情况请点这里。 毕竟&#xff08;也是&#xff09;一年前的知识了&#xff0c;有点遗忘&#xff0c;所以如有错误请大家在评论区指出&#xff0c;我会修改的。 趁着手感火热&#xff0c;赶紧再来写一篇关于队列的文章…

作者头像 李华