十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

RIOT 操作系统 STM32 Nucleo-64 开发板通用支持详解:引脚冲突、烧录与串口 Shell

RIOT 操作系统 STM32 Nucleo-64 开发板通用支持详解:引脚冲突、烧录与串口 Shell RIOT 操作系统 STM32 Nucleo-64 开发板通用支持详解引脚冲突、烧录与串口 Shell【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT本文以 RIOT 仓库中的 Nucleo-64 通用板级支持文档boards/common/nucleo64/doc.md为核心讲解 STM32 Nucleo-64 系列开发板在 RIOT 中的公共支持机制SPI 外设与 LED0 的引脚冲突及编译期告警原理、板子烧录流程以及如何通过 ST-Link VCP 虚拟串口接入 RIOT Shell读完后可理解 RIOT 中通用板目录 具体板目录的分层组织方式并能排查 Nucleo 板编译与调试中的常见问题。一、Nucleo-64 通用支持的目录结构与定位RIOT 对 STM32 Nucleo 系列开发板采用通用层 具体板层的分层设计。所有符合 Nucleo-64 封装规范的板子如nucleo-f401re、nucleo-f405re、nucleo-f767zi等数十款共享一个通用板目录 boards/common/nucleo64其中沉淀了该系列共有的引脚定义、Arduino 兼容映射和构建逻辑每个具体板号如 boards/nucleo-f401re则只保留差异部分periph_conf.h时钟与外设映射、板级 Kconfig 等并在自己的构建文件中包含通用层。从 boards/nucleo-f401re/Makefile.dep 和 boards/nucleo-f401re/Makefile.include 可以确认这种包含关系# boards/nucleo-f401re/Makefile.dep include $(RIOTBOARD)/common/nucleo64/Makefile.dep# boards/nucleo-f401re/Makefile.include include $(RIOTBOARD)/common/nucleo64/Makefile.include通用层自身的构建入口非常薄见 boards/common/nucleo64/MakefileMODULE nucleo_common include $(RIOTBASE)/Makefile.base而 boards/common/nucleo64/Makefile.include 则进一步把包含链继续指向上层公共的 boards/common/nucleo/Makefile.include并添加通用头文件搜索路径# include shared global Nucleo Makefile include $(RIOTBOARD)/common/nucleo/Makefile.include # add the common header files to the include path INCLUDES -I$(RIOTBOARD)/common/nucleo64/includeKconfig 侧同样如此。boards/common/nucleo64/Kconfig 定义了BOARD_COMMON_NUCLEO64配置项并根据 CPU 家族自动选择外部晶振特性config BOARD_COMMON_NUCLEO64 bool # Clock configuration select BOARD_HAS_HSE if !CPU_FAM_G0 !CPU_FAM_L0 !CPU_FAM_L1 !CPU_FAM_L4 select BOARD_HAS_LSE if !BOARD_NUCLEO_L152RE source $(RIOTBOARD)/common/nucleo/Kconfig source $(RIOTBOARD)/common/stm32/Kconfig从源码结构看G0/L0/L1/L4 系列芯片的 Nucleo 板不使用 HSE 高速外部晶振改用 HSI因此通用层在这里做了家族级的条件选择具体板只需声明自己的 CPU 即可继承正确的时钟特性。提供的 Arduino 兼容特性boards/common/nucleo64/Makefile.features 声明了 Nucleo-64 系列统一对外提供的特性features# Various common features of Nucleo boards FEATURES_PROVIDED arduino_analog FEATURES_PROVIDED arduino_i2c FEATURES_PROVIDED arduino_pins FEATURES_PROVIDED arduino_shield_uno FEATURES_PROVIDED arduino_spi FEATURES_PROVIDED arduino_uart这意味着在任意 Nucleo-64 板上构建时RIOT 会自动启用 Arduino 引脚命名、Arduino Uno 扩展头shield兼容的 I2C/SPI/UART 映射等支持。这些特性对应的具体引脚映射定义在 boards/common/nucleo64/include/arduino_iomap.h 中例如#define ARDUINO_PIN_11 GPIO_PIN(PORT_A, 7) #define ARDUINO_PIN_12 GPIO_PIN(PORT_A, 6) #define ARDUINO_PIN_13 GPIO_PIN(PORT_A, 5) /* on-board LED */ ... #define ARDUINO_A0 ADC_LINE(0) ... #define ARDUINO_ANALOG_PIN_LAST 5其中ARDUINO_PIN_11/12/13即 SPI0 的 MOSI/MISO/SCLK对应 D11/D12/D13 焊盘ARDUINO_SPI_D11D12D13宏默认映射到SPI_DEV(0)ARDUINO_I2C_UNO映射到I2C_DEV(0)——这与后续 SPI/LED0 引脚冲突直接相关。二、引脚冲突SPI 与 LED0 不能同时使用Nucleo-64 通用文档中最核心的技术事实是Nucleo-64 板存在引脚冲突SPI 外设与 LED0 无法同时使用。原因在于多数 Nucleo-64 板的板载 LED0 连接在PA5即 Arduino 引脚 D13而 SPI0 的 SCLK 也映射到 D13 对应的引脚两者共用同一物理引脚。这一冲突的处理逻辑在 boards/common/nucleo64/Makefile.dep 中实现# include color echo macros include $(RIOTMAKE)/color.inc.mk # Dont show warnings for info and generate targets ifeq (,$(filter info-% generate-%,$(MAKECMDGOALS))) ifneq (,$(filter periph_spi,$(USEMODULE))) # The LED pin is also used for SPI, disable the LED0 module (once) ifeq (,$(filter periph_init_led0,$(DISABLE_MODULE))) DISABLE_MODULE periph_init_led0 $(call echowarn,(Warning: Using periph_spi on Nucleo64 boards will\ disable LED0 due to pin conflicts.)) endif endif endif从源码看其机制分三步当USEMODULE中包含periph_spi时将periph_init_led0追加进DISABLE_MODULE从而在构建中禁用 LED0 的自动初始化模块同时通过echowarn宏在编译输出中打印文档中提到的告警Warning: Using periph_spi on Nucleo64 boards will disable LED0 due to pin conflicts.外层ifeq (,$(filter info-% generate-%,$(MAKECMDGOALS)))保证执行make info-/make generate-之类的辅助目标时不重复打印该告警内层ifeq (,$(filter periph_init_led0,$(DISABLE_MODULE)))则保证DISABLE_MODULE只被追加一次。需要注意两点第一该冲突处理是通用 Nucleo-64层面的默认策略但并非所有型号都受影响——boards/common/nucleo64/include/arduino_iomap.h 中对CPU_MODEL_STM32F302R8做了特判其 D11/D12/D13 改到PB15/PB14/PB13LED 也在 PB13 侧boards/common/nucleo64/include/board.h 也相应地把 LED0 定义切换为GPIO_PORT_B的 13 号引脚#if defined(CPU_MODEL_STM32F302R8) || defined(CPU_MODEL_STM32L433RC) # define LED0_PIN_NUM 13 # define LED0_PORT GPIO_PORT_B /** GPIO port of LED 0 */ # define LED0_PORT_NUM PORT_B #else # define LED0_PIN_NUM 5 # define LED0_PORT GPIO_PORT_A /** GPIO port of LED 0 */ # define LED0_PORT_NUM PORT_A #endif第二即使 LED0 被禁用SAUL 的 GPIO 参数表中仍保留了用户按钮 B1 的条目见 boards/common/nucleo64/include/gpio_params.hstatic const saul_gpio_params_t saul_gpio_params[] { #ifdef MODULE_PERIPH_INIT_LED0 { .name LED(green), .pin LED0_PIN, .mode GPIO_OUT }, #endif { .name Button(B1 User), .pin BTN0_PIN, .mode BTN0_MODE, #if !defined(CPU_MODEL_STM32L433RC) !defined(CPU_MODEL_STM32G431RB) \ !defined(CPU_MODEL_STM32G474RE) !defined(CPU_MODEL_STM32G491RE) .flags SAUL_GPIO_INVERTED #endif }, };其中MODULE_PERIPH_INIT_LED0条件编译宏与上文DISABLE_MODULE机制配合一旦 LED0 初始化被禁用SAUL 参数表会自动收缩不会出现悬空的 LED 参数。而BTN0用户按钮 B1统一接在GPIO_PIN(PORT_C, 13)对 L433RC、G431RB、G474RE、G491RE、U385RG 使用GPIO_IN_PD下拉输入其余型号使用GPIO_IN_PU上拉输入这些差异都沉淀在 boards/common/nucleo64/include/board.h 中体现了通用层按 CPU 型号做条件编译的设计思路。通用board.h还预置了 MRF24J40 无线模块的默认 SPI 参数SPI0、5MHz 时钟、CSD10、INTD7、RESETD5可供 SPI 类无线驱动直接复用。三、烧录FlashingNucleo 开发板原文档指出Nucleo 板完整的烧录流程说明位于 RIOT 官方向导的guide.riot-os.org/board_specific/stm32/页面。由于该外链在仓库外这里以仓库内证据补充可操作的要点Nucleo 板载 ST-Link V2 调试器make flash默认使用stlink调试器通过该接口烧录在 RIOT 中为某块 Nucleo 板构建应用后通常执行make -C examples/gnrc_networking BOARDnucleo-f401re flash一类命令即可通过 ST-Link 写入固件具体可用目标以仓库中make list输出为准不同板号的时钟/启动差异由各自板目录下的periph_conf.h与 Kconfig 处理通用层通过 boards/common/nucleo64/Kconfig 的BOARD_HAS_HSE/BOARD_HAS_LSE选择保证构建配置与硬件匹配。若需要查看某块板的具体烧录特性与调试接口应查阅对应板目录如boards/nucleo-xxxxx下的Makefile.features与periph_conf.h而非通用层。四、通过 ST-Link VCP 接入 RIOT ShellNucleo 板每块都带有一个板载 ST-Link 调试器其 VCPVirtual COM Port虚拟 COM 口被用作 RIOT OS Shell 的默认访问通道。原文档给出的关键信息是具体使用哪一路 USART 因板而异不同 Nucleo 变体把 ST-Link VCP 接到不同的 USART 引脚上必须查阅对应板子的boards/nucleo-xxxxx/include/periph_conf.h头文件确认 UART 与引脚映射默认串口参数为 115200 波特率、8N18 位数据位、无校验、1 位停止位这是 RIOT 标准输出模块std_serial/默认 UART 输出的典型配置。使用方式上将 Nucleo 的 USB 口接入主机后ST-Link VCP 会在主机上呈现为一个串口设备Linux 下通常是/dev/ttyACM0可用cu、picocom等串口工具以 115200 8N1 打开并进入 ShellRIOT 仓库自带的 tests 与示例应用如examples/gnrc_networking在默认配置下即把标准输出挂到该串口无需额外改动板级配置。五、小结通用层文档与实际构建逻辑的对应关系回顾 boards/common/nucleo64/doc.md 覆盖的三个主题在仓库中都能找到对应的实现落点文档主题仓库中的实现依据SPI 与 LED0 引脚冲突及编译期告警boards/common/nucleo64/Makefile.dep 中的DISABLE_MODULE逻辑与echowarn引脚映射与 Arduino 兼容层boards/common/nucleo64/include/arduino_iomap.h、boards/common/nucleo64/include/board.h板子烧录各具体板目录如 boards/nucleo-f401re的 ST-Link 支持通用层经Makefile.include包含链复用Shell 串口ST-Link VCP115200 8N1各板periph_conf.h中不同的 USART 映射通用层 boards/common/nucleo64/Makefile.features 提供arduino_uart等特性可以推断对于 Nucleo-64 开发者而言绝大多数日常问题编译告警、引脚选择、Shell 不出现都可以先在通用目录的四个构建文件Makefile.dep/Makefile.include/Makefile.features/Kconfig与include/下的三个头文件中定位原因再深入到具体板目录的差异文件中确认板级映射这正是 RIOT公共板支持目录设计的实用价值所在。【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表