RIOT 操作系统中的 STM32 Nucleo-F303RE 开发板支持:硬件资源、外设配置与烧录指南
RIOT 操作系统中的 STM32 Nucleo-F303RE 开发板支持硬件资源、外设配置与烧录指南【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT本篇技术指南以 RIOT 操作系统中boards/nucleo-f303re开发板支持包为核心系统梳理该板卡搭载的 STM32F303RE 微控制器资源、RIOT 中已实现的外设驱动与引脚映射、底层periph_conf.h配置细节以及基于 ST-Link 的烧录与串口调试方法。读完本文你将能够在 RIOT 下为 Nucleo-F303RE 快速选择可用外设、编写应用并完成固件烧录与 shell 调试。板卡概述Nucleo-F303RE 是意法半导体STNucleo 家族中的一款开发板属于 64 引脚LQFP64封装的Nucleo-64系列由 RIOT 作为boards_common_nucleo64板卡组的成员提供支持见 boards/common/nucleo64/doc.md。其核心是一颗ARM Cortex-M4F架构的 STM32F303RE 微控制器片上资源包括RAM64 KiBFlash512 KiB主频最高 72 MHzFPU支持Cortex-M4F 单精度浮点单元供电范围Vcc 2.0V – 3.6V在 RIOT 的板卡树中nucleo-f303re通过Makefile中的DIRS $(RIOTBOARD)/common/nucleo复用了 Nucleo 系列板卡的公共实现并在Makefile.dep、Makefile.features、Makefile.include中分别加载 boards/common/nucleo64/Makefile.dep、boards/common/nucleo64/Makefile.features 与 boards/common/nucleo64/Makefile.include从而实现与同系列其他 Nucleo-64 板卡最大程度的功能共享。MCU 外设资源一览根据 boards/nucleo-f303re/doc.md 中记录的 MCU 数据手册信息STM32F303RE 在芯片层面提供如下外设资源外设数量/规格定时器13 个9 个 16 位、1 个 32 位 [TIM2]、1 个 Systick、2 个看门狗ADC4 个 12 位 ADC共 22 通道UART5 个SPI4 个I2C3 个RTC1 个CAN1 个USB1 个需要说明的是芯片级外设数量并不等于 RIOT 板级支持包中实际使能的外设数量——RIOT 只把引脚布局明确、可稳定驱动的外设实例暴露给应用层。这一点在下一节的“实现状态”与“外设配置”中会详细展开。RIOT 中的实现状态boards/nucleo-f303re/doc.md 明确给出了该板卡在 RIOT 中的外设驱动实现状态逐项说明如下设备ID支持情况备注MCUSTM32F303RE部分支持节能模式未完全利用底层驱动GPIO支持PWM1 个 PWMUART3 个 UARTI2C2 个 I2CSPI2 个 SPIUSB不支持Timer1 个 32 位定时器从 boards/nucleo-f303re/Makefile.features 可以看出该板卡在 RIOT 构建系统中实际声明的外设特性为CPU stm32 CPU_MODEL stm32f303re # Put defined MCU peripherals here (in alphabetical order) FEATURES_PROVIDED periph_adc FEATURES_PROVIDED periph_i2c FEATURES_PROVIDED periph_pwm FEATURES_PROVIDED periph_rtc FEATURES_PROVIDED periph_spi FEATURES_PROVIDED periph_timer FEATURES_PROVIDED periph_uart # Put other features for this board (in alphabetical order) FEATURES_PROVIDED riotboot也就是说periph_adc、periph_i2c、periph_pwm、periph_rtc、periph_spi、periph_timer、periph_uart均已由板级支持包提供应用可通过模块声明如USEMODULE periph_uart直接使用。此外该板还支持riotboot引导加载特性。同时公共 Nucleo-64 特性文件还额外提供了arduino_analog、arduino_i2c、arduino_pins、arduino_shield_uno、arduino_spi、arduino_uart等 Arduino 兼容特性见 boards/common/nucleo64/Makefile.features这意味着可以直接插接 Arduino UNO 扩展板并复用 Arduino 风格的引脚编号。在 Kconfig 层面boards/nucleo-f303re/Kconfig 将BOARD_NUCLEO_F303RE关联到BOARD_COMMON_NUCLEO64与CPU_MODEL_STM32F303RE后者在 cpu/stm32/kconfigs/f3/Kconfig.models 中定义从而把板卡与 STM32F3 系列 CPU 模型正确绑定。外设引脚配置深度解析板级外设实例的引脚、时钟与中断配置全部集中在一个文件boards/nucleo-f303re/include/periph_conf.h。下面逐外设拆解。时钟源该板在文件头部声明同时提供LSE低速外部晶振与HSE高速外部晶振#define CONFIG_BOARD_HAS_LSE 1 #define CONFIG_BOARD_HAS_HSE 1这两个宏由板级头文件通过#ifndef保护方式定义供 CPU 层的时钟配置逻辑clk_conf.h读取用于决定系统时钟树如何生成。定时器配置复用了cfg_timer_tim2_tim15_tim16.h表明该板采用TIM232 位 TIM15 TIM16的定时器组合方案。ADC 配置值得注意的是RIOT 并没有把 STM32F303RE 的全部 22 个 ADC 通道都暴露出来而是只定义了 6 个 ADC 通道对应 Nucleo 板上的 Arduino 排针 A0–A5外加一个内部 VBAT 采样通道。注释中特别说明通道顺序并非按 STM32F334 的寄存器顺序排列而是以 Arduino 排针的物理顺序为准static const adc_conf_t adc_config[] { { .pin GPIO_PIN(PORT_A, 0), .dev 0, .chan 1 }, /* ADC1_IN1, fast */ { .pin GPIO_PIN(PORT_A, 1), .dev 0, .chan 2 }, /* ADC1_IN2, fast */ { .pin GPIO_PIN(PORT_A, 4), .dev 1, .chan 1 }, /* ADC2_IN1, fast */ { .pin GPIO_PIN(PORT_B, 0), .dev 2, .chan 12 }, /* ADC3_IN12, slow */ { .pin GPIO_PIN(PORT_C, 1), .dev 1, .chan 7 }, /* ADC12_IN7, slow */ { .pin GPIO_PIN(PORT_C, 0), .dev 1, .chan 6 }, /* ADC12_IN6, slow */ { .pin GPIO_UNDEF, .dev 0, .chan 17 }, /* VBAT */ };对应关系总结如下排针引脚ADC 设备/通道采样特性A0PA0ADC1_IN1fastA1PA1ADC1_IN2fastA2PA4ADC2_IN1fastA3PB0ADC3_IN12slowA4PC1ADC12_IN7slowA5PC0ADC12_IN6slowVBAT内部ADC1 通道 17内部电池电压采样其中VBAT_ADC被定义为ADC_LINE(6)即 adc_config 数组下标 6应用可用它直接读取电池引脚电压ADC_NUMOF则由数组长度自动推导。在 boards/common/nucleo64/include/arduino_iomap.h 中A0–A5 进一步被映射为ARDUINO_A0…ARDUINO_A5对应ADC_LINE(0)…ADC_LINE(5)与 Arduino 生态的模拟读取语义保持一致。UART 配置RIOT 在该板上使能了3 个 UARTUSART2、USART1、USART3均使用GPIO_AF7复用功能UART 实例TXRX总线中断USART2UART_DEV(0)PA2PA3APB1USART2_IRQnUSART1UART_DEV(1)PA9PA10APB2USART1_IRQnUSART3UART_DEV(2)PB10PB11APB1USART3_IRQn其中USART2UART_DEV(0)是 Nucleo 板默认的调试串口它通过板上 ST-Link 的虚拟串口VCP连接到主机RIOT shell 默认使用该接口波特率115200、8N1见 boards/common/nucleo64/doc.md。三个 UART 的中断服务函数分别通过UART_0_ISR、UART_1_ISR、UART_2_ISR绑定到isr_usart2、isr_usart1、isr_usart3。PWM 配置PWM 由TIM3提供单一定时器的 4 个比较输出通道分别映射到 PC6–PC9复用功能为GPIO_AF2通道引脚0PC61PC72PC83PC9这与文档中“one PWM”的实现状态一致——RIOT 暴露了一个 PWM 设备pwm_config数组长度为 1但其 4 个通道均可用。TIM3 挂在 APB1 总线上。SPI 配置RIOT 使能了3 个 SPISPI1、SPI2、SPI3其中 SPI1 与 SPI2 带硬件片选SPI3 的片选定义为SPI_CS_UNDEF需软件控制 CSSPI 实例MOSIMISOSCLKCS复用总线SPI1PA7PA6PA5PA4AF5APB2SPI2PB15PB14PB13PB12AF5APB1SPI3PC12PC11PC10无SPI_CS_UNDEFAF6APB1I2C 配置RIOT 使能了2 个 I2CI2C1、I2C3均以I2C_SPEED_NORMAL100 kHz 标准模式初始化I2C 实例SCLSDA复用总线中断I2C1I2C_DEV(0)PB8PB9AF4 / AF4APB1I2C1_ER_IRQnI2C3I2C_DEV(1)PA8PB5AF3 / AF8APB1I2C3_ER_IRQn注意 I2C3 的 SCL 与 SDA 使用了不同的 AF 编号AF3 与 AF8这是 STM32F3 系列引脚复用表所要求的。根据 boards/common/nucleo64/include/arduino_iomap.hARDUINO_I2C_UNO固定指向I2C_DEV(0)I2C1与 Arduino UNO 扩展板的 I2C 排针位置D14/D15 即 PB9/PB8对齐方便直接使用 I2C 类扩展板。定时器与 GPIO定时器配置复用了公共头文件cfg_timer_tim2_tim15_tim16.h即使用TIM232 位作为主要定时器配合 TIM15/TIM16。这与文档“one 32-bit timer”的实现状态对应。GPIO 引脚配置通过GPIO_PIN(PORT_x, n)宏完成全部外设共用一套 periph GPIO 驱动。Arduino 引脚映射Nucleo-F303RE 继承了 Nucleo-64 系列统一的 Arduino 引脚映射表定义于 boards/common/nucleo64/include/arduino_iomap.h主要映射如下Arduino 引脚MCU 引脚备注D0 / D1PA3 / PA2对应 UART_DEV(0)USART2D2 / D3PA10 / PB3D4 / D5PB5 / PB4D6 / D7PB10 / PA8D8 / D9PA9 / PC7D10PB6D11 / D12 / D13PA7 / PA6 / PA5SPI_DEV(0)D13 为板载 LEDD14 / D15PB9 / PB8I2C_DEV(0)I2C1A0 – A5PA0 / PA1 / PA4 / PB0 / PC1 / PC0对应 ADC_LINE(0)–(5)同时ARDUINO_UART_D0D1指向UART_DEV(0)ARDUINO_SPI_D11D12D13在未覆盖时默认指向SPI_DEV(0)SPI1ARDUINO_I2C_UNO指向I2C_DEV(0)因此任何符合 Arduino UNO 排针布局的扩展板都可以直接插接到 Nucleo-F303RE 上使用。已知限制SPI 与 LED0 的引脚冲突Nucleo-64 系列板卡存在一个共性约束由于SPI 引脚PA5 时钟与板载 LED0D13复用同一引脚因此无法同时使用 SPI 外设和 LED0。当应用使能periph_spi时编译期会输出如下警告见 boards/common/nucleo64/doc.mdWarning: Using periph_spi on Nucleo64 boards will disable LED0 due to pin conflicts.在使用 SPI 功能例如驱动 SPI 显示屏、SD 卡或无线模块时应意识到这一点避免同时依赖 LED0 作为状态指示。烧录与调试烧录板卡Nucleo-F303RE 板载 ST-Link 调试器烧录过程与其他 STM32 Nucleo 板一致。RIOT 的板级Makefile.include复用了 boards/common/nucleo/Makefile.include其中关键配置包括# Setup of programmer and serial is shared between STM32 based boards include $(RIOTMAKE)/boards/stm32.inc.mk # If port selection via ttys.py is enabled by MOST_RECENT_PORT1, filter # USB serials to only select the UART bridge of embedded STLink debuggers. TTY_BOARD_FILTER : --model STM32 STLink # The TTY serial also is the ID of the debug adapter, as the TTY is provided by # the debug adapter DEBUG_ADAPTER_ID_IS_TTY_SERIAL : 1其要点是程序烧录通过 ST-Link 完成MOST_RECENT_PORT1时RIOT 的串口自动选择工具ttys.py只会过滤出 ST-Link 的虚拟串口设备避免选错/dev/tty*调试适配器 ID 直接复用 TTY 串号。此外该板还支持cpy2remed编程器PROGRAMMERS_SUPPORTED cpy2remed对应“NODE_F303RE”可移动盘符。编译并烧录一个应用例如examples/hello-world时指定板卡名nucleo-f303remake -C examples/hello-world BOARDnucleo-f303re flashRIOT 会默认选择 ST-Link 作为编程器。如需显式指定编程器或串口可使用PROGRAMMERstlink、PORT/dev/ttyACM0或实际 ST-Link VCP 设备节点等变量覆盖。访问 RIOT shell烧录完成后RIOT shell 通过板载ST-Link 虚拟串口VCP与主机通信。由于 USART2PA2/PA3连接在 ST-Link 的 VCP 桥上shell 默认运行在 UART_DEV(0) 上。主机侧使用任意串口终端如picocom、minicom或tio连接即可picocom -b 115200 /dev/ttyACM0连接参数为115200 baud、8 数据位、无校验、1 停止位8N1。RIOT 的make term目标可自动探测并打开正确串口make -C examples/hello-world BOARDnucleo-f303re term进入 shell 后即可执行help查看可用命令并通过ifconfig、ps等命令调试网络与线程状态。构建系统接线总结把整个板级支持包的接线关系汇总如下便于在新应用中正确使用MakefileMODULE board声明本目录为板级模块DIRS指向common/nucleo复用公共代码Makefile.features声明CPU stm32、CPU_MODEL stm32f303re及 7 个periph_*特性 riotboot再加载 Nucleo-64 公共特性含 Arduino 兼容特性Makefile.include加载 Nucleo-64 公共 include最终汇入 STM32 公共的编程器/串口配置Makefile.dep加载 Nucleo-64 公共依赖include/periph_conf.h全部外设实例ADC/UART/PWM/SPI/I2C的引脚、时钟、中断与复用功能定义KconfigBOARD_NUCLEO_F303RE→BOARD_COMMON_NUCLEO64CPU_MODEL_STM32F303RE与 Makefile 体系的特性声明一一对应。应用侧只需BOARDnucleo-f303re并在Makefile中通过USEMODULE periph_uart或periph_pwm、periph_i2c、periph_spi、periph_adc等启用相应外设模块即可调用uart_write、pwm_set、i2c_read_regs、spi_transfer_bytes、adc_sample等 RIOT periph API 操作上述引脚。相关资源板卡文档与硬件规格boards/nucleo-f303re/doc.md外设引脚配置boards/nucleo-f303re/include/periph_conf.h板卡构建声明boards/nucleo-f303re/Makefile.features、boards/nucleo-f303re/Makefile.include、boards/nucleo-f303re/Makefile.depKconfig 绑定boards/nucleo-f303re/KconfigNucleo-64 公共说明LED0/SPI 冲突、shell 串口boards/common/nucleo64/doc.mdArduino 引脚映射boards/common/nucleo64/include/arduino_iomap.hSTM32 公共编程器/串口配置boards/common/nucleo/Makefile.includeSTM32F3 CPU 型号 Kconfigcpu/stm32/kconfigs/f3/Kconfig.models【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考