RIOT 中的 Olimexino-stm32 板级支持:硬件外设、SAUL 映射与 stm32flash 烧录实战

RIOT 中的 Olimexino-stm32 板级支持:硬件外设、SAUL 映射与 stm32flash 烧录实战 RIOT 中的 Olimexino-stm32 板级支持硬件外设、SAUL 映射与 stm32flash 烧录实战【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT导读本文围绕 RIOT 操作系统对Olimexino-stm32开发板的板级支持展开系统梳理其基于 STM32F103RBARM Cortex-M3的硬件资源、外设驱动实现状态、GPIO/LED/按键引脚定义、SAUL 传感器抽象映射以及使用 stm32flash 完成编译烧录与串口终端连接的完整流程。读完本文你将掌握如何用BOARDolimexino-stm32 make flash烧录固件、如何根据 periph_conf.h 定位 UART/SPI/I2C/PWM/ADC 引脚以及如何复用 SAUL 直接访问板载 LED 与按键。板卡概览Olimexino-stm32 是 Olimex 公司 Olimexino 系列中的一块开发板核心是一颗意法半导体的STM32F103RB微控制器。在 RIOT 中它的板级支持位于 boards/olimexino-stm32属于boards_olimexino-stm32这个 defgroup文档主体即 boards/olimexino-stm32/doc.md。从硬件定位看这是一块面向 IoT 原型验证的经典 STM32F1 平台RAM 仅 20KB、Flash 128KB但外设接口非常齐全板载 UART、SPI、I2C、ADC、PWM、CAN、USB 与 RTC适合驱动各类传感器与执行器。MCU 核心参数项目参数MCUSTM32F103RB内核家族ARM Cortex-M3厂商ST MicroelectronicsRAM20KbFlash128Kb最高主频72MHzFPU无定时器72 个看门狗、1 个 SysTick、4 个 16 位定时器ADC1 路 12 位16 通道UART3 个SPI2 个I2C2 个RTC1 个USB1 个CAN1 个工作电压 Vcc2.0V - 3.6V说明以上表格内容直接取自 boards/olimexino-stm32/doc.md 的 Hardware 一节其中 Kb 为原文档表述对应 20KB SRAM 与 128KB 程序 Flash。数据手册、参考手册、编程手册与板卡手册的链接均为 ST 与 Olimex 官方文档本文不再另行转载。板级标识与晶振选型在 RIOT 的构建系统中这块板由 boards/olimexino-stm32/Makefile.features 声明CPU stm32 CPU_MODEL stm32f103rb # Put defined MCU peripherals here (in alphabetical order) FEATURES_PROVIDED periph_adc FEATURES_PROVIDED periph_can FEATURES_PROVIDED periph_i2c FEATURES_PROVIDED periph_pwm FEATURES_PROVIDED periph_rtc FEATURES_PROVIDED periph_rtt FEATURES_PROVIDED periph_spi FEATURES_PROVIDED periph_timer FEATURES_PROVIDED periph_uart可以看到该板提供了 ADC、CAN、I2C、PWM、RTC、RTT、SPI、TIMER、UART 九类外设特性这是 RIOT 依赖解析与FEATURES_REQUIRED检查的基础。对应地Kconfig 菜单boards/olimexino-stm32/Kconfig声明了BOARD_OLIMEXINO_STM32并select CPU_MODEL_STM32F103RB、BOARD_HAS_HSE、BOARD_HAS_LSE——即板卡提供了 HSE外部高速晶振与 LSE外部低速晶振。这两个符号在 boards/common/stm32/Kconfig 中定义并在 periph_conf.h 顶部以CONFIG_BOARD_HAS_HSE/CONFIG_BOARD_HAS_LSE宏形式确认供 STM32 时钟配置clk_conf.h选用外部晶振作为时钟源。外设驱动实现状态RIOT 对 Olimexino-stm32 的外设支持情况在 doc.md 的 Implementation Status 一节中有明确清单设备ID支持情况备注MCUSTM32F103RB部分支持低功耗模式未完全利用底层驱动GPIO支持PWM支持4 个引脚可用UART3 个USART2 走 D0(RX)/D1(TX)USART1 走 PA10(RX)/PA09(TX)USART3 走 PB11(RX)/PB10(TX)ADC6 路I2C支持I2C1 与 I2C2SPI支持SPI1 与 SPI2USB不支持定时器3 个 16 位定时器TIM2、TIM3、TIM4这段状态表是 RIOT 开发者评估该板可用性的第一手依据核心 MCU 已可用但低功耗Energy saving modes没有充分利用USB 外设暂未支持其余常用外设基本齐全。外设引脚映射的源码级对照Implementation Status 表中提到的引脚分配在 boards/olimexino-stm32/include/periph_conf.h 中有完整的静态配置数组可以逐一核对。UARTuart_config[]定义了 3 个串口与文档描述完全一致串口TX 引脚RX 引脚总线中断USART2UART 0PA2PA3APB1USART2_IRQnUSART1UART 1PA9PA10APB2USART1_IRQnUSART3UART 2PB10PB11APB1USART3_IRQn其中 USART2 对应文档所说的 D1(TX)/D0(RX)是默认串口输出USART1PA9/PA10同时被用于烧录详见下文烧录章节USART3 位于 PB10/PB11。中断服务函数分别映射为isr_usart2、isr_usart1、isr_usart3。SPI 与 I2CSPI 与 I2C 各两个配置如下SPI1MOSIPA7、MISOPA6、SCLKPA5挂在 APB2 总线RCC_APB2ENR_SPI1ENSPI2MOSIPB15、MISOPB14、SCLKPB13挂在 APB1 总线RCC_APB1ENR_SPI2ENI2C1SCLPB8、SDAPB9I2C_SPEED_NORMAL速度I2C2SCLPB10、SDAPB11同样为I2C_SPEED_NORMAL。值得注意的细节SPI 配置中cs_pin GPIO_UNDEF说明片选信号交由用户代码自行管理而 I2C 配置的注释明确提示 This board may require external pullup resistors for i2c operation即板卡 I2C 可能没有集成上拉电阻接入 I2C 外设时需要外部上拉才能稳定工作。这两点对实际焊接/接线排障很有参考价值。ADC 与 PWMADC 配置暴露了 6 个通道全部位于 PORTCADC 通道引脚0PC01PC12PC23PC34PC45PC5PWM 则提供了 4 个定时器组、共 16 个可用输出通道PWM 设备通道 0通道 1通道 2通道 3总线TIM1PA8PA9PA10PA11APB2TIM2PA0PA1PA2PA3APB1TIM3PA6PA7PB0PB1APB1TIM4PB6PB7PB8PB9APB1这里可以观察到引脚复用策略PA9/PA10 同时出现在 USART1 与 TIM1 的 PWM 通道中PA2/PA3 同时是 USART2 与 TIM2 的 PWM 通道PB8/PB9 同时是 I2C1 与 TIM4 的 PWM 通道——实际使用任一外设时必须注意 RIOT 的引脚复用保护避免同时使能相互冲突的引脚功能。定时器与 RTTtimer_config[]将 TIM2、TIM3、TIM4 三个 16 位定时器注册为 RIOT 定时器TIMER_NUMOF 3最大计数值0x0000ffff对应 ISR 为isr_tim2/3/4。RTT实时计数器频率定义为RTT_FREQUENCY (16384)Hz即使用 LSE 32.768kHz 经二分频后的 16.384kHz 作为 RTT 时钟这正好印证了板卡提供 LSE 晶振的配置。LED、按键与 SAUL 抽象板载 LED 与按键定义boards/olimexino-stm32/include/board.h 定义了板级的基础资源LED0PA1GPIO_PORT_A / PORT_ALED1PA5LED_PANICLED0用于内核 panic 指示BTN0 用户按键PC9输入模式GPIO_INXTIMER 配置XTIMER_WIDTH为 16 位XTIMER_BACKOFF为 19。LED 的LED0_ON/OFF/TOGGLE系列宏并非在该板单独实现而是由公共头文件 boards/common/stm32/include/stm32_leds.h 根据LEDn_PORT_NUM、LEDn_PIN_NUM自动展开板级只声明引脚号与端口公共头通过GPIO_PIN()拼出LEDn_PIN再基于periph/gpio_ll.h的gpio_ll_set/clear/toggle提供开关与翻转操作。这是 STM32 系列板卡共享配置片段的典型用法。SAUL GPIO 映射RIOT 的 SAULSensor Actuator Uber Layer子系统允许把外设直接映射为统一的传感器/执行器接口。Olimexino-stm32 在 boards/olimexino-stm32/include/gpio_params.h 中注册了三个 SAUL 节点SAUL 名称引脚模式LED2LED0_PINPA1GPIO_OUTLED1LED1_PINPA5GPIO_OUTBUTBTN0_PINPC9GPIO_IN这些条目填充在saul_gpio_params_t数组中其结构定义位于 drivers/include/saul/periph.h包含name、pin、mode、flags字段。同时 boards/olimexino-stm32/Makefile.dep 做了依赖联动只要应用USEMODULE中包含saul_default就会自动追加saul_gpio从而在saulshell 命令下可以直接按名称操作 LED1/LED2 与读取按键 BUT。从源码结构看gpio_params.h中命名 LED2 对应的是物理 LED0PA1LED1 对应物理 LED1PA5命名与板卡丝印可能存在的差异在使用 SAUL 时需留意。编译、烧录与串口终端烧录工具链stm32flash与其他 STM32 板卡不同Olimexino-stm32 没有板载调试器文档明确要求使用stm32flash一款基于串口 bootloader 的 STM32 烧录工具进行烧录。RIOT 的构建系统已经内置了完整的 stm32flash 支持boards/olimexino-stm32/Makefile.include 中# set default port depending on operating system PORT_LINUX ? /dev/ttyUSB0 PROGRAMMERstm32flash # Setup of programmer and serial is shared between STM32 based boards include $(RIOTMAKE)/boards/stm32.inc.mkPROGRAMMERstm32flash直接固定了烧录器默认串口在 Linux 下为/dev/ttyUSB0通过 USB-TTL 适配器枚举出的设备节点。stm32flash 的具体参数由公共的 makefiles/boards/stm32.inc.mk 提供PROG_BAUD ? 57600烧录波特率FLASHER stm32flashFLASHFILE ? $(BINFILE)烧录的是 .bin 文件BIN_ADDR由ROM_START_ADDR ROM_OFFSET此处ROM_OFFSET 0x0计算得到即从 Flash 起始地址写入FFLAGS汇总为-v -b $(PROG_BAUD) -w $(FLASHFILE) -S $(BIN_ADDR) -g $(BIN_ADDR) $(PORT)-v冗余输出、-b设置波特率、-w写 Flash、-S指定起始地址、-g烧录后从该地址启动若启用STM32FLASH_RESET还可以通过 TTL 适配器的 RTS/DTR 引脚控制 BOOT0 与 RST实现一键进入 bootloader 再自动复位运行。烧录与串口命令安装好 stm32flash 后在应用目录下执行BOARDolimexino-stm32 make flash即可编译并烧录。打开串口终端查看输出BOARDolimexino-stm32 make term文档特别强调了一条关键约束USART1 用于烧录USART2 才是串口输出。从 periph_conf.h 可以看到USART2PA2/PA3是uart_config[]中的第 0 项因此也是 RIOT 默认的STDIO串口而烧录走的是 USART1PA9/PA10上的 STM32 系统 bootloader。因此接线时请把 USB-TTL 的 TX/RX 接到 USART2 的 D0(D3)/D1(TX)PA3/PA2用于终端把烧录线接到 USART1 的 PA9/PA10并配合 BOOT0 拉高进入 bootloader。如果默认的/dev/ttyUSB0与设备实际节点不符可显式覆盖PORT/dev/ttyUSB1 BOARDolimexino-stm32 make flash BOARDolimexino-stm32 make termmake term在 Linux 下默认调用miniterm可通过TERMPROG/TERMFLAGS调整波特率由串口配置决定。快速上手示例结合上述板级资源一个最小应用可以这样组织新建应用目录例如examples/hello-olimexinoMakefile中声明BOARD ? olimexino-stm32 USEMODULE saul_default include $(RIOTBASE)/Makefile.includemain.c中使用标准输出与 LED#include board.h #include periph/gpio.h #include xtimer.h int main(void) { while (1) { LED0_TOGGLE; printf(Hello from Olimexino-stm32\n); xtimer_sleep(1); } return 0; }编译烧录BOARDolimexino-stm32 make flash BOARDolimexino-stm32 make term加入saul_default后终端里还可直接使用saul命令读取 BUTPC9电平、控制 LED1/LED2 输出验证 gpio_params.h 中的映射是否生效。小结Olimexino-stm32 是 RIOT 中一块外设丰富、成本友好的 STM32F103RB 开发板。本文从板级文档出发结合 boards/olimexino-stm32 目录下的 Makefile.features、Kconfig、board.h、periph_conf.h 与 gpio_params.h完整还原了其 MCU 参数、外设实现状态、引脚映射、SAUL 抽象以及 stm32flash 烧录链路。实践中最需要记住的两点烧录用 USART1、终端输出用 USART2I2C 使用前需自备上拉电阻。基于这份板级支持你可以直接在这块板上开展传感器接入、PWM 电机控制、CAN 通信等 RIOT 应用开发。【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考