ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

STM32F407 星火一号开发板 RTduino 引脚排布与 Arduino 生态兼容指南

STM32F407 星火一号开发板 RTduino 引脚排布与 Arduino 生态兼容指南 操作系统嵌入式物联网嵌入式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/stm32f407-rt-spark这一 BSP 的 Arduino 兼容适配文档为核心完整梳理 stm32f407-rt-spark星火一号开发板如何通过 RTduino 生态兼容层接入 Arduino 编程习惯与社区库系统讲解 RTduino 的开启方式、45 个 Arduino 引脚的完整排布表、引脚映射表的数据结构以及串口、PWM、ADC、DAC、I2C、SPI 等外设与 RT-Thread 设备框架的对应关系帮助读者快速上手用 Arduino 语法驱动这块开发板。1 RTduinoRT-Thread 的 Arduino 生态兼容层stm32f407-rt-spark 开发板已经完整适配了RTduino软件包即 RT-Thread 的 Arduino 生态兼容层。RTduino 的目标是让用户能够按照 Arduino 的编程习惯setup()/loop()、pinMode()、digitalWrite()、analogRead()等来操作该 BSP同时直接复用 Arduino 社区中大量的第三方库这是对 RT-Thread 生态的极大增强。本 BSP 的 Arduino 兼容说明与引脚映射的权威依据为 arduino_pinout/README.md引脚实现细节可进一步阅读 pins_arduino.c 与 pins_arduino.h。1.1 RTduino 的工作方式从源码结构看RTduino 兼容层在 BSP 内的接入分为两部分引脚映射表applications/arduino_pinout/pins_arduino.c定义了pin_map_table[]数组把 Arduino 引脚编号逐一映射到 RT-Thread 的 GPIO 引脚GET_PIN(port, pin)及对应的设备框架UART / PWM / ADC / DAC / SPI / I2C编译组控制applications/arduino_pinout/SConscript中该目录的pins_arduino.c、pins_arduino.h通过depend [PKG_USING_RTDUINO]仅在使能 RTduino 软件包时才参与构建group DefineGroup(RTduino-pinout, src, depend [PKG_USING_RTDUINO], CPPPATH inc)同时 applications/SConscript 在PKG_USING_RTDUINO且未定义RTDUINO_NO_SETUP_LOOP时会把 arduino_main.cpp 加入构建——这是默认的 Arduino 入口内含标准的setup()与loop()函数void setup(void) { /* put your setup code here, to run once: */ Serial.begin(); } void loop(void) { /* put your main code here, to run repeatedly: */ Serial.println(Hello Arduino!); delay(800); }也就是说开启 RTduino 后系统启动即进入 Arduino 风格的setup()/loop()循环Serial对象默认对应 uart1USB 转串口。1.2 如何开启针对本 BSP 的 Arduino 生态兼容层在 Env 工具下敲入menuconfig命令或者在 RT-Thread Studio IDE 下选择RT-Thread Settings勾选Hardware Drivers Config --- Onboard Peripheral Drivers --- [*] Compatible with Arduino Ecosystem (RTduino)对应的 Kconfig 配置项定义在 board/Kconfig 中BSP_USING_ARDUINO默认值为n。勾选该项后Kconfig 会自动级联打开RTduino 运行所依赖的底层外设配置无需手工逐项配置串口BSP_USING_UART1对应 ArduinoSerial、BSP_USING_UART2对应 ArduinoSerial2以及 USB 转串口BSP_USING_STLINK_TO_USARTGPIOBSP_USING_GPIO依赖RT_USING_PINADCBSP_USING_ADC3DACBSP_USING_DAC1PWMBSP_USING_PWM1_CH2、BSP_USING_PWM1_CH3、BSP_USING_PWM2_CH3、BSP_USING_PWM2_CH4、BSP_USING_PWM4_CH1I2C软件 I2C 总线BSP_USING_SOFT_I2C4与BSP_USING_SOFT_I2C5SPI软件 SPI 总线BSP_USING_SOFT_SPI1软件包子功能imply RTDUINO_USING_SERVO、RTDUINO_USING_WIRE、RTDUINO_USING_SPI。配置完成后在 BSP 目录下执行pkgs --update拉取 RTduino 软件包及依赖再执行scons --targetmdk5/iar或直接scons重新生成并编译工程。2 Arduino 引脚排布总览RTduino 兼容层要求 Arduino 引脚编号必须按顺序连续排列且编号最大值有限制检查。pins_arduino.h中定义了从D0(0) 到DAC0(44) 的 45 个引脚别名并声明#define RTDUINO_PIN_MAX_LIMIT DAC0 /* pin number max limit check */ #define F_CPU 168000000L /* CPU:168MHz */F_CPU为 168MHz对应 STM32F407ZGT6 的最高主频。LED_BUILTIN指向 D33板载红色 LED#define LED_BUILTIN D33 /* Default Built-in LED */完整引脚布局可参考下图出自 arduino_pinout 目录引脚布局图与下述排布表均源自 arduino_pinout/README.md实物对应关系可结合 README.md 中板载资源LED_R 为 PF12、LED_B 为 PF11、四个按键、蜂鸣器等核对。3 完整引脚排布表Arduino 编号 ↔ STM32 引脚下表完整列出 stm32f407-rt-spark 的 45 个 Arduino 引脚映射。表中“默认被 RT-Thread 的设备框架接管”表示对应引脚在 RTduino 中被声明为某个 RT-Thread 设备如 uart1、pwm2、adc3Serial/analogWrite()/analogRead()等 Arduino API 底层会转调到该设备框架完成实际读写。Arduino引脚编号STM32引脚编号5V容忍备注0 (D0)GET_PIN(A, 10)是Serial-RX默认被 RT-Thread 的 UART 设备框架 uart1 接管1 (D1)GET_PIN(A, 9)是Serial-TX默认被 RT-Thread 的 UART 设备框架 uart1 接管2 (D2)GET_PIN(A, 8)是3 (D3)GET_PIN(B, 10)是PWM2-CH3默认被 RT-Thread 的 PWM 设备框架 pwm2 接管4 (D4)GET_PIN(A, 1)是5 (D5)GET_PIN(B, 14)是6 (D6)GET_PIN(B, 11)是PWM2-CH4默认被 RT-Thread 的 PWM 设备框架 pwm2 接管7 (D7)GET_PIN(B, 15)是8 (D8)GET_PIN(F, 15)是9 (D9)GET_PIN(E, 11)是PWM1-CH2默认被 RT-Thread 的 PWM 设备框架 pwm1 接管10 (D10)GET_PIN(E, 13)是PWM1-CH3默认被 RT-Thread 的 PWM 设备框架 pwm1 接管11 (D11)GET_PIN(D, 12)是PWM4-CH1默认被 RT-Thread 的 PWM 设备框架 pwm4 接管12 (D12)GET_PIN(D, 10)是13 (D13)GET_PIN(D, 8)是14 (D14)GET_PIN(E, 14)是15 (D15)GET_PIN(E, 12)是16 (D16)GET_PIN(E, 15)是17 (D17)GET_PIN(D, 9)是18 (D18)GET_PIN(G, 2)是19 (D19)GET_PIN(B, 2)是20 (D20)GET_PIN(G, 0)是21 (D21)GET_PIN(A, 0)是22 (D22)GET_PIN(G, 5)是SWSPI1-SCK默认被 RT-Thread 的 SPI 设备框架 swspi1 接管23 (D23)GET_PIN(G, 3)是SWSPI1-MISO默认被 RT-Thread 的 SPI 设备框架 swspi1 接管24 (D24)GET_PIN(G, 1)是SWSPI1-MOSI默认被 RT-Thread 的 SPI 设备框架 swspi1 接管25 (D25)GET_PIN(G, 7)是I2C1-SCL默认被 RT-Thread 的 I2C 设备框架 i2c1 接管26 (D26)GET_PIN(D, 7)是I2C1-SDA默认被 RT-Thread 的 I2C 设备框架 i2c1 接管27 (D27)GET_PIN(B, 6)是I2C2-SCL默认被 RT-Thread 的 I2C 设备框架 i2c2 接管28 (D28)GET_PIN(B, 7)是I2C2-SDA默认被 RT-Thread 的 I2C 设备框架 i2c2 接管29 (D29)GET_PIN(G, 6)是30 (D30)GET_PIN(G, 4)是31 (D31)GET_PIN(A, 2)是Serial2-TX默认被 RT-Thread 的 UART 设备框架 uart2 接管32 (D32)GET_PIN(A, 3)是Serial2-RX默认被 RT-Thread 的 UART 设备框架 uart2 接管33 (D33)GET_PIN(F, 12)是板载用户 R_LED34 (D34)GET_PIN(F, 11)是板载用户 B_LED35 (D35)GET_PIN(B, 0)是板载蜂鸣器36 (D36)GET_PIN(C, 5)是板载按键 KEY_UP37 (D37)GET_PIN(C, 1)是板载按键 KEY_DOWN38 (D38)GET_PIN(C, 0)是板载按键 KEY_LEFT39 (D39)GET_PIN(C, 4)是板载按键 KEY_RIGHT40 (A0)GET_PIN(F, 6)是ADC3-CH4默认被 RT-Thread 的 ADC 设备框架 adc3 接管41 (A1)GET_PIN(F, 7)是ADC3-CH5默认被 RT-Thread 的 ADC 设备框架 adc3 接管42 (A2)GET_PIN(F, 4)是ADC3-CH14默认被 RT-Thread 的 ADC 设备框架 adc3 接管43 (A3)GET_PIN(F, 5)是ADC3-CH15默认被 RT-Thread 的 ADC 设备框架 adc3 接管44 (DAC0)GET_PIN(A, 4)否DAC1-CH1默认被 RT-Thread 的 DAC 设备框架 dac1 接管要点说明5V 容忍除DAC0PA4外全部引脚均为 5V 容忍可直接与 5V 逻辑器件互连板载资源直达D33/D34双色 LED、D35蜂鸣器、D36–D39四个按键无需外接电路即可用于digitalWrite()/digitalRead()练习默认设备接管串口、PWM、ADC、DAC、SPI、I2C 引脚在映射表中绑定了 RT-Thread 设备Arduino API 的底层实现会通过 RT-Thread 设备框架完成收发与通道选择。4 引脚映射表的源码实现pin_map_table 数据结构arduino_pinout/pins_arduino.c 是引脚排布表的实际落地实现。映射表数组pin_map_table[]的每一条记录遵循如下约定源码注释原文{Arduino Pin, RT-Thread Pin [, Device Name, Channel]}Arduino PinArduino 引脚编号必须按顺序连续排列RT-Thread Pin由GET_PIN(port, pin)宏生成的 RT-Thread 引脚号Device Name可选数字引脚不得填写设备名与通道模拟引脚ADC/PWM/DAC必须给出设备名与通道。例如数字引脚与设备引脚的典型写法对比const pin_map_t pin_map_table[] { { D0, GET_PIN(A, 10), uart1 }, /* Serial-RX */ { D2, GET_PIN(A, 8) }, /* 纯 GPIO 数字引脚不绑定设备 */ { D3, GET_PIN(B, 10), pwm2, 3 }, /* PWMpwm2 设备通道 3 */ { A0, GET_PIN(F, 6), adc3, 4 }, /* ADCadc3 设备通道 4 */ { DAC0, GET_PIN(A, 4), dac1, 1 }, /* DACdac1 设备通道 1 */ };由此可以看到README 排布表中“PWM2-CH3”“ADC3-CH4”等备注正是该数组中Device Name Channel字段的直接体现。此外pins_arduino.h 还给出了几个影响 Arduino API 默认行为的宏/* swi2c4 : PD.7-SDA PG.7-SCL */ #define RTDUINO_DEFAULT_IIC_BUS_NAME swi2c4 /* swspi1 : PG.5-SCK PG.3-MISO PG.1-MOSI */ #define RTDUINO_DEFAULT_SPI_BUS_NAME swspi1 /* Serial2(uart2) : PA.2-TX PA.3-RX */ #define RTDUINO_SERIAL2_DEVICE_NAME uart2RTDUINO_DEFAULT_IIC_BUS_NAMEArduinoWire库默认使用的 I2C 总线名对应软件 I2C 总线 swi2c4PD7SDA、PG7SCL实际管脚对应 README 表中的 D26/D25RTDUINO_DEFAULT_SPI_BUS_NAMEArduinoSPI库默认总线对应软件 SPI 总线 swspi1PG5SCK、PG3MISO、PG1MOSI即 README 表中的 D22/D23/D24RTDUINO_SERIAL2_DEVICE_NAMESerial2对象对应的 RT-Thread 设备即 uart2PA2TX、PA3RX对应 D31/D32。这些默认总线/设备的引脚与 README 表一一呼应说明表内“SWSPI1”“I2C1/I2C2”备注与头文件宏指向的是同一套物理引脚。5 外设设备框架的默认接管关系结合排布表与 board/Kconfig 的自动配置各 Arduino 引脚默认被 RT-Thread 设备框架接管的情况可归纳如下Arduino 对象RT-Thread 设备引脚功能Serialuart1PA10 / PA9 (D0/D1)串口收发Serial2uart2PA2 / PA3 (D31/D32)第二串口收发analogWrite()pwm2 / pwm1 / pwm4PB10、PB11、PE11、PE13、PD12 (D3/D6/D9/D10/D11)PWM 输出analogRead()adc3PF6、PF7、PF4、PF5 (A0–A3)ADC 采样analogWrite()(DAC)dac1PA4 (DAC0)真模拟电压输出Wireswi2c4 / swi2c5PG7/PD7 (D25/D26)、PB6/PB7 (D27/D28)I2C 通信SPIswspi1PG5/PG3/PG1 (D22/D23/D24)SPI 通信从 arduino_main.cpp 的默认示例可以看出Serial.begin()与Serial.println()无需任何引脚参数即可工作这正是因为 D0/D1 已在映射表中绑定 uart1 并作为默认串口。6 快速上手第一个 Arduino 风格程序开启 RTduino 后BSP 默认已提供 arduino_main.cpp 作为程序入口其中loop()每 800ms 通过Serial输出一行Hello Arduino!#include Arduino.h void setup(void) { Serial.begin(); } void loop(void) { Serial.println(Hello Arduino!); delay(800); }在此基础上可以按 Arduino 习惯直接操作板载资源例如点灯与读按键#include Arduino.h void setup(void) { pinMode(LED_BUILTIN, OUTPUT); /* D33 PF12 板载红色 LED */ pinMode(D36, INPUT_PULLUP); /* D36 PC5 板载 KEY_UP */ Serial.begin(); } void loop(void) { digitalWrite(LED_BUILTIN, !digitalRead(D36) ? HIGH : LOW); delay(100); }使用analogRead()读取 A0–A3、用analogWrite()在 D3/D6/D9/D10/D11 上输出 PWM、用DAC0输出模拟电压均可直接沿用 Arduino 语法底层由 RT-Thread 的 adc3、pwm2/pwm1/pwm4、dac1 设备框架驱动。7 注意事项与冲突提示引脚复用冲突从 README.md 可以看到该 BSP 的 COM2uart2即 ArduinoSerial2与以太网、PWM 存在引脚冲突使用时需在 Kconfig 中确认未同时开启冲突外设软件外设总线本 BSP 的 Arduino SPI 与 I2C 默认使用软件模拟总线swspi1、swi2c4/swi2c5适用于低速通信场景若需高速通信可评估硬件 SPI/I2C 的引脚复用方案5V 容忍例外DAC0PA4非 5V 容忍接 5V 逻辑时需注意电平匹配Kconfig 级联勾选 Arduino 兼容后底层外设由 board/Kconfig 自动开启不必手动逐项配置但也不要重复勾选同引脚的其他外设功能避免驱动注册冲突。通过以上配置与引脚排布开发者即可在 stm32f407-rt-spark 上以纯 Arduino 方式快速完成原型验证同时保留 RT-Thread 线程、设备框架等底层能力实现两类开发范式在同一块开发板上的融合。赞分享操作系统嵌入式物联网嵌入式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点击查看免费下载相关推荐STM32F401 WeAct BlackPill 开发板 RTduino 兼容层Arduino 生态接入与引脚排布详解STM32F401 WeAct BlackPill 开发板 RTduino 兼容层Arduino 生态接入与引脚排布详解 导读 本文围绕 RT Thread操作系统嵌入式物联网嵌入式OSRTOSSTM32F072 Nucleo 开发板 RTduino 引脚映射与 Arduino 生态兼容指南STM32F072 Nucleo 开发板 RTduino 引脚映射与 Arduino 生态兼容指南 本文围绕 RT Thread 仓库中 bsp/stm32/s操作系统嵌入式物联网嵌入式OSRTOSLPC55S69-NXP-EVK 开发板 RTduino 适配指南Arduino 生态兼容层与引脚排布详解LPC55S69 NXP EVK 开发板 RTduino 适配指南Arduino 生态兼容层与引脚排布详解 RT Thread 通过 RTduino 软件包为操作系统嵌入式物联网嵌入式OSRTOS创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进