ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

RIOT 中 Blackpill STM32F103C8 开发板支持:板级配置、外设映射与烧录实战

RIOT 中 Blackpill STM32F103C8 开发板支持:板级配置、外设映射与烧录实战 RIOT 中 Blackpill STM32F103C8 开发板支持板级配置、外设映射与烧录实战【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT本文围绕 RIOT 操作系统中 blackpill-stm32f103c8 开发板的板级支持文档展开结合仓库中该板卡的 Kconfig、Makefile 与共享的 blxxxpill 板级公共代码讲清这块基于 STM32F103C8 的廉价开发板在 RIOT 中的组织方式、外设引脚映射UART/I2C/SPI/ADC/PWM/Timer/QDEC/DMA/USB以及串口连接、SWD 烧录的实操要点。读完后你可以正确选用blackpill-stm32f103c8与blackpill-stm32f103cb两种板名进行构建并理解每一路外设落在哪些物理引脚上、为何会有引脚冲突取舍。1. Blackpill 是什么板卡概览BlackpillSTM32F103C8T6与 Bluepill 同属一类可以以极低价格购得文档中提到大约 2 欧元的 STM32F103 入门级开发板。RIOT 为它们提供了共享的板级支持代码Blackpill C8 版本对应板名blackpill-stm32f103c8。需要特别注意的硬件风险直接引自板级文档的警告真假芯片问题很多此类开发板上焊接的是假冒 STM32 芯片能否配合 RIOT 正常工作并不确定采购时务必留意Flash 容量不确定STM32F103C8 标称 64 KiB Flash但多数实物实际带 128 KiB也有部分版本报告 32 KiB、实际却是 64 KiB。因此 C8/CB 两种后缀64 KiB / 128 KiB与实物并不总是一一对应USB 座焊接质量Micro-USB 口有时焊接不良且常配有错误的电阻这是已知问题之一详见第 7 节。MCU 关键规格来自共享文档 boards/common/blxxxpill/doc.md 的 MCU 表项目规格型号STM32F103C8 / STM32F103CB内核ARM Cortex-M3厂商STMicroelectronicsRAM20 KiBFlash32 / 64 / 128 KiB主频最高 72 MHz定时器3 个 16 位ADC2 个 12 位、10 通道UART / SPI / I2C / CAN3 / 2 / 2 / 1供电 Vcc2.0 ~ 3.6 V外设驱动实现状态同一文档的 Implementation Status 表外设是否支持GPIO是PWM是UART是ADC是I2C是SPI是USB否见下文说明Timer是CAN否补充说明从源码结构看共享配置里其实提供了periph_usbdev特性见第 4 节特性清单STM32F103 自身带 USB FS 外设文档表格中“USB: no”更多反映的是板级 USB 座焊接/电阻问题导致实际不可用。2. 板级支持在 RIOT 仓库中的组织方式RIOT 的板级支持遵循“板卡目录 公共目录”的分层结构。Blackpill C8 的目录非常精简boards/blackpill-stm32f103c8/Kconfigboards/blackpill-stm32f103c8/Makefileboards/blackpill-stm32f103c8/Makefile.featuresboards/blackpill-stm32f103c8/include/board.h板名与 CPU 型号在 Kconfig 中绑定Kconfig 中BOARD_BLACKPILL_STM32F103C8选择公共板卡BOARD_COMMON_BLXXXPILL与 CPU 型号CPU_MODEL_STM32F103C8并 source 公共 Kconfig。构建系统侧Makefile 只有一行关键内容——把公共目录拉进编译路径MODULE board DIRS $(RIOTBOARD)/common/blxxxpill include $(RIOTBASE)/Makefile.base而 Makefile.features 声明该板属于stm32CPU 家族、具体型号为stm32f103c8并复用公共 features 文件。这意味着 Blackpill 的几乎所有实质工作都集中在共享目录 boards/common/blxxxpill/ 中该板卡目录只做了“型号 LED 引脚”两处的差异化。CB 变体 boards/blackpill-stm32f103cb/Kconfig 的结构与之完全同构仅把 CPU 型号换成CPU_MODEL_STM32F103CB。提供的功能特性公共 features 文件 boards/common/blxxxpill/Makefile.features 声明该板提供以下 RIOT 特性CPU stm32 FEATURES_PROVIDED periph_adc FEATURES_PROVIDED periph_dma 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 FEATURES_PROVIDED periph_qdec FEATURES_PROVIDED periph_usbdev FEATURES_PROVIDED riotboot即ADC、DMA、I2C、PWM、RTC、RTT、SPI、Timer、UART、QDEC正交编码器、USB 设备驱动框架以及 riotboot 启动能力。其中 RTC/RTT 依赖板载晶振——boards/common/blxxxpill/Kconfig 通过select BOARD_HAS_HSE / BOARD_HAS_LSE声明板上同时具备高速HSE与低速LSE晶振这对应外设配置中 RTT 使用 16384 Hz 的 LSE 作为时钟源。3. 板级头文件LED、STDIO 与 xtimerLED0 引脚Blackpill 与 Bluepill 的关键差异Blackpill 板卡目录里唯一有“板级差异”语义的头文件是 board.h#define LED0_PORT GPIO_PORT_B /** GPIO port of LED 0 */ #define LED0_PORT_NUM PORT_B /** GPIO Port number the LED is connected to */ #define LED0_PIN_NUM 12 /** Pin number the LED is connected to */即 Blackpill 的板载 LED 接在PB12。对比之下Bluepill 的 LED 在 PC13——这一点由公共头文件 board_common.h 的默认值体现只有当LED0_PORT_NUM未定义时才回落到PORT_C / 13所以 Blackpill 的board.h先定义 PB12、再 include 公共头注释特别强调“该 include 必须位于 LED0 参数定义之后”。公共头还声明了两个重要默认值LED0_IS_INVERTED 1该板 LED 低电平点亮GPIO 层会自动处理取反STDIO_UART_DEV UART_DEV(0)标准输入输出绑定到 0 号 UART也就是下一节会讲到的 USART1PA9/PA10XTIMER_WIDTH (16)与XTIMER_BACKOFF (19)xtimer 高精度定时器使用 16 位计数器、19 的退避参数这决定了板上 xtimer 的溢出行为16 位计数器溢出周期比 32 位时更短对长睡眠场景需留意。SAUL 传感器抽象层也把板载 LED 注册成了一个 GPIO 外设见 gpio_params.hstatic const saul_gpio_params_t saul_gpio_params[] { { .name LED, .pin LED0_PIN, .mode GPIO_OUT, .flags (SAUL_GPIO_INVERTED | SAUL_GPIO_INIT_CLEAR) }, };其中SAUL_GPIO_INVERTED与上文LED0_IS_INVERTED保持一致初始化状态为 CLEAR灭灯在 Blackpill 上即 PB12 输出高电平为灭。4. 外设引脚映射periph_conf.h 逐项解析所有外设与引脚的对应关系集中在 boards/common/blxxxpill/include/periph_conf.h。以下逐项说明并标注 Blackpill 特有的取舍逻辑。UART3 路uart_config 定义了设备号外设RX 引脚TX 引脚DMA启用 periph_dma 时UART_DEV(0)USART1APB2PA10PA9DMA1 流 3UART_DEV(1)USART2APB1PA3PA2DMA1 流 6UART_DEV(2)USART3APB1PB11PB10DMA1 流 1注意 0 号 UARTUSART1正是STDIO_UART_DEV绑定的端口PA9/PA10 也是板上引出的串口针脚——这与文档“Connecting via Serial”一节完全对应。另外从配置结构看USART3 的 PB10/PB11 与 I2C2 的 SCL/SDA 复用同一对引脚两路不能同时启用。I2C2 路i2c_config设备号外设SCLSDA速度I2C_DEV(0)I2C1APB1PB8PB9I2C_SPEED_NORMALI2C_DEV(1)I2C2APB1PB10PB11I2C_SPEED_NORMAL源码注释特别指出这块板子做 I2C 通信可能需要外部上拉电阻。SPI2 路注意与 ADC 的互斥spi_config设备号外设MOSIMISOSCLKCSDMASPI_DEV(0)SPI2APB1PB15PB14PB13PB12TX 流 3 / RX 流 2SPI_DEV(1)SPI1APB2PA7PA6PA5PA4TX 流 1 / RX 流 0第二路 SPI1 被#ifndef MODULE_PERIPH_ADC包裹SPI1 的四根引脚 PA4~PA7 恰好是 ADC 的 4 个通道启用 ADC 模块时 SPI1 自动退出配置SPI 只剩 SPI2 一路。这是典型的引脚复用取舍由构建系统按模块依赖自动裁决。ADC6 通道 2 内部通道Blackpill 少 2 路adc_config 默认提供 PA0、PA1、PA4~PA7 共 6 个外部通道外加通道 16片内温度传感器与通道 17VREF 内部参考。Bluepill 还能再用 PB0/PB1 作 ADC 8/9 通道但源码注释明确说明了对 Blackpill 的取舍/* The blackpill has a few pins less. PB0 and PB1 are among the GPIOs not * exposed due to the lower pincount. * * Also, this conflicts with PWM. We prefer PWM over ADC here to provide * 6 external ADC inputs, and 4 PWM outputs (instead of 8 ADC inputs and * 2 PWM outputs). */即 Blackpill 引脚较少PB0/PB1 未引出且它们与 PWM 冲突RIOT 选择“牺牲 2 路 ADC、保住 4 路 PWM”的方案。因此 Blackpill 上ADC_NUMOF为 86 外部 2 内部Bluepill 上为 10。PWMTIM3AFIO 重映射到 PB4/PB5pwm_config 使用 TIM3并通过.remap AFIO_MAPR_TIM3_REMAP_1把输出引脚从默认的 PA6/PA7 重映射到PB4/PB5Bluepill 变体非 Blackpill 宏还会追加 PB0/PB1 作为 cc_chan 2/3凑满 4 路 PWM。共享文档的 “Using PWM” 一节写的是 A8~A11 可用但从当前源码配置看实际生效的 PWM 引脚是 PB4/PB5Blackpill 只有这 2 路——以源码为准。定时器与 QDECtimer_config 提供 3 个 16 位定时器TIM2/TIM3/TIM4均在 APB1 总线max 0xFFFF中断分别为isr_tim2/3/4——与文档 MCU 表中“3x 16-Bit Timer”一致。qdec_config正交编码器以 TIM4 为基础PB6/PB7并带有两个带冲突保护的可选项TIM3 版本PB4/PB5与 PWM 互斥#ifndef MODULE_PERIPH_PWM和 TIM1 版本PA8/PA9与UART_DEV(0)互斥#ifndef MODULE_PERIPH_UART。再次体现了“按启用模块做引脚仲裁”的设计。DMA5 条流dma_config 配置了 DMA1 的 5 条流注释标明了每路用途static const dma_conf_t dma_config[] { { .stream 1 }, /* DMA1 Channel 2 - SPI1_RX / USART3_TX */ { .stream 2 }, /* DMA1 Channel 3 - SPI1_TX */ { .stream 3 }, /* DMA1 Channel 4 - SPI2_RX / USART1_TX */ { .stream 4 }, /* DMA1 Channel 5 - SPI2_TX */ { .stream 6 }, /* DMA1 Channel 7 - USART2_TX */ };配合上文 UART/SPI 各配置项里的.dma字段如 USART1 取流 3、USART2 取流 6、SPI2 TX 取流 3 / RX 取流 2启用periph_dma模块后串口与 SPI 传输即可走 DMA。RTT 与 RTT 时钟源RTT_FREQUENCY 定义为 16384 Hz对应 LSE 32.768 kHz 晶振的二分频是 STM32 上 RTTreal time tick的标准做法这也是该板periph_rttperiph_rtc特性的硬件基础。USB 设备驱动框架stm32_usbdev_fs_config 声明了 STM32F103 的 USB FS 外设DM/DP 落在 PA11/PA12中断为isr_usb_lp_can1_rx0。框架层面已就绪但如第 1 节所述板子 Micro-USB 座的焊接/电阻问题决定了 USB 口实际可用性存疑。5. 构建与运行两个板名的选择共享文档给出了明确的构建指引板上是C864 KiB Flash芯片 → 使用板名blackpill-stm32f103c8板上是CB128 KiB Flash芯片 → 使用板名blackpill-stm32f103cb对应目录 boards/blackpill-stm32f103cb/ 同构存在。由于实物 Flash 大小经常与丝印不符C8 标 64 KiB 实际可能是 128 KiB选错板名通常不会立刻失败但链接脚本给出的 Flash 边界会影响应用空间。RIOT 应用构建的标准方式是以板名为参数调用 make例如以经典示例 blinky 为例make -C examples/basic/blinky -j8 BOARDblackpill-stm32f103c8 make -C examples/basic/blinky -j8 BOARDblackpill-stm32f103c8 flash构建时BOARD...会解析出上文第 2 节的 Kconfig 链板卡 → common/blxxxpill → stm32 公共配置并据此自动启用periph_*各模块。CI 中也有大量测试直接以blackpill-stm32f103c8为目标板构建例如 tests/bench/xtimer/Makefile、tests/net/gnrc_netif/Makefile.ci 等可作为该板名可用性的旁证。6. 通过串口连接共享文档 “Connecting via Serial” 一节的完整操作要点默认使用的串口是UART1USART1物理引脚PA9 TXPA10 RX串口参数115200 baud、1 stop bit、无校验8N1。从源码侧验证STDIO_UART_DEV UART_DEV(0)board_common.h把 stdio 绑到 0 号 UART而 uart_config 中 0 号 UART 的tx_pin PA9、rx_pin PA10与文档描述一一对应。因此用 TTL 串口线接 PA9/PA10 后即可看到 RIOT 的启动日志与riot:命令行提示符。7. 烧录与已知问题烧录烧录流程在 RIOT 官方的板级指南STM32 通用页中有详细描述就本文档而言关键信息是板名STM32F103C8 的 Blackpill 用blackpill-stm32f103c8CB 变体用blackpill-stm32f103cb。配合make ... flash即可完成烧写具体调试器选型与 OpenOCD 配置属于 RIOT STM32 通用烧录指南的范畴。已知问题一USB 座Micro-USB 口有时焊接不良且通常配有错误的电阻社区有若干修复方法原文档链接至 Blue Pill Wiki 的 Hardware installation 章节。如果你的 USB 口无法稳定供电或枚举优先怀疑这一点。已知问题二烧录失败SWD 接线对照表烧录失败时先检查调试器是否连好——包括硬件复位NRST信号线。共享文档给出了完整的接线对照表调试器侧引脚板子侧引脚SWDIODIOSWCLKDCLKNRSTRGNDGNDVDD3.3V注13.3Target VCC注23.3注1*多数调试器自带 3.3V 电源给板子上电也可以改用 TTL 电平转换模块或 Micro-USB 给板子上电注2**部分调试器会监测目标电压其 Target VCC 引脚需接到板子任一 3.3V 引脚。另一个高频坑极便宜的 SWD 调试器约 2 欧元档往往没有 Target VCC 引脚无妨但复位信号线经常缺失或失效。变通办法是在 OpenOCD 试图连接时手动按一下板载复位键烧录完成后再按一次复位键让新镜像启动。选购提示这类板子在市面上名字不一可能叫bluepill/blue pill也可能要用stm32f103c8或stm32f103c8t6关键字搜到Blackpill 同理认准 STM32F103C8T6 模块即可。8. 小结Blackpill STM32F103C8 在 RIOT 中的支持体现了仓库板级架构的典型模式板卡目录boards/blackpill-stm32f103c8/只承载差异化信息——Kconfig 绑定CPU_MODEL_STM32F103C8、board.h把 LED0 定义到 PB12其余 GPIO、UART、I2C、SPI、ADC、PWM、Timer、QDEC、DMA、USB 的全部引脚映射与冲突仲裁逻辑都收敛在共享的 boards/common/blxxxpill/ 中并通过FEATURES_PROVIDED暴露给构建系统。理解这张引脚映射表和 C8/CB 两个板名之后再配合 115200 8N1 的串口参数与第 7 节的 SWD 接线/复位键技巧就足以在这块廉价 Cortex-M3 板子上完成从构建、烧录到串口交互的完整闭环。【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表