Zephyr 开发指南:96Boards Carbon(STM32F401RET + nRF51822)双芯片板卡的构建、刷写与蓝牙联调
【免费下载链接】zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.项目地址: https://gitcode.com/GitHub_Trending/ze/zephyr
96Boards Carbon 是一块基于 STMicroelectronics STM32F401RET(Cortex-M4)主控、并通过 SPI 挂载 nRF51822 实现 Bluetooth LE 的双芯片开发板。本篇以 boards/96boards/carbon/doc/stm32f401xe.rst 为骨架,结合当前仓库中该板卡的实际设备树、Kconfig 默认配置与烧录脚本,完整讲解 96Boards Carbon 的硬件资源、Zephyr 支持特性、引脚映射,以及从 DFU 刷写、串口验证到 BLE 功能联调的端到端实操流程。阅读完成后,你将能独立完成该板卡的hello_world烧写、peripheral_hr蓝牙示例验证,并理解双芯片各自独立烧录的开发模型。
板卡概览:一块板卡、两颗芯片、两套固件
96Boards Carbon 板载两颗芯片:一颗是主控STM32F401RET(ARM Cortex-M4,带 FPU,主频最高 84 MHz),另一颗是nRF51822,通过 SPI 与主控相连,专门承担 Bluetooth LE 通信。两颗芯片虽然在同一块物理板卡上,但必须分别独立编程,这决定了该板卡在 Zephyr 中存在两套 board configuration:
96b_carbon/stm32f401xe:面向主芯片 STM32F401RET。绝大多数应用都应使用这套配置,因为它连接了板卡上所有的 breakout I/O 排针;96b_carbon/nrf51822:面向从芯片 nRF51822。多数用户通常不需要为这颗芯片开发应用,因为 Zephyr 已提供可直接烧录到 nRF51822 的示例固件(samples/bluetooth/hci_spi),为主控侧应用提供蓝牙能力。
两套配置的完整支持清单分别见 96b_carbon_stm32f401xe.yaml 与 96b_carbon_nrf51822.yaml,板级总览见 board.yml(socs: stm32f401xe / nrf51822)。nRF51822 侧的编程与调试细节记录在 boards/96boards/carbon/doc/nrf51822.rst。
硬件资源一览
96Boards Carbon 的硬件组成如下:
- STM32F401RET6,LQFP64 封装
- ARM 32 位 Cortex-M4 CPU,带 FPU
- 最高 CPU 主频 84 MHz
- VDD 供电范围 1.7 V ~ 3.6 V
- 512 KB Flash
- 96 KB SRAM
- 支持外部中断的 GPIO
- 12 位 ADC,16 通道
- RTC
- 高级控制定时器
- 通用定时器 × 7
- 看门狗定时器 × 2
- USART/UART × 4
- I2C × 3
- SPI × 3
- SDIO
- USB 2.0 OTG FS
- DMA 控制器
- 由 nRF51822 经 SPI 提供的 Bluetooth LE
值得说明的是,板级设备树 96b_carbon_stm32f401xe.dts 中配置了外部高速晶振 HSE(16 MHz)与外部低速晶振 LSI,并通过 PLL 将系统主频锁定到 84 MHz:
&clk_hse { clock-frequency = <DT_FREQ_M(16)>; status = "okay"; }; &pll { div-m = <16>; mul-n = <336>; div-p = <4>; div-q = <7>; clocks = <&clk_hse>; status = "okay"; }; &rcc { clocks = <&pll>; clock-frequency = <DT_FREQ_M(84)>; ahb-prescaler = <1>; apb1-prescaler = <2>; apb2-prescaler = <1>; };支持的特性与默认配置
96b_carbon/stm32f401xe在 Zephyr 中支持如下硬件特性:
| 接口 | 控制器 | 驱动/组件 |
|---|---|---|
| NVIC | on-chip | 嵌套向量中断控制器 |
| SYSTICK | on-chip | 系统时钟 |
| UART | on-chip | 串口 |
| GPIO | on-chip | gpio |
| PINMUX | on-chip | pinmux |
| FLASH | on-chip | flash |
| SPI | on-chip | spi |
| I2C | on-chip | i2c |
| USB OTG FS | on-chip | USB device |
默认配置位于 96b_carbon_stm32f401xe_defconfig。该文件除了开启CONFIG_SERIAL、CONFIG_UART_CONSOLE、CONFIG_GPIO等基础外,还特意开启了:
# Enable MPU CONFIG_ARM_MPU=y # Enable HW stack protection CONFIG_HW_STACK_PROTECTION=y即默认启用 ARM MPU 与硬件栈保护,这也是该板卡作为 Cortex-M4 平台在安全特性上默认开启的防护能力。
连接与引脚映射
LED
| LED | 信号 | 引脚 |
|---|---|---|
| LED1 / User1 LED | PD2 | gpiod 2 |
| LED2 / User2 LED | PA15 | gpioa 15 |
| LED3 / BT LED | PB5 | gpiob 5 |
| LED4 / Power LED | VCC | 电源指示 |
在设备树中分别定义为green_led_1、green_led_2、bt_blue_led,并通过aliases映射为led0、led1、led2,方便应用层按通用别名访问(96b_carbon_stm32f401xe.dts)。
按键
- BUTTON = BOOT0(SW1)
- BUTTON = RST(复位)
此外设备树中还定义了一个 User 按键(gpiob 2,低电平有效),映射为sw0,用于 Zephyr 输入子系统。
低速排针(Low Speed Header)
奇数排针:
| 引脚号 | 信号名 | STM32F401 功能 |
|---|---|---|
| 1 | UART2_CTS | PA0 |
| 3 | UART2_TX | PA2 |
| 5 | UART2_RX | PA3 |
| 7 | UART2_RTS | PA1 |
| 9 | GND | GND |
| 11 | USB5V | USB5V |
| 13 | AIN12 | PC2 |
| 15 | AIN14 | PC4 |
| 17 | UART6_TX | PC6 |
| 19 | GPIO | PC8 |
| 21 | I2C1_SCL | PB6 |
| 23 | I2C1_SCA | PB7 |
| 25 | I2C2_SCA | PB3 |
| 27 | I2C2_SCL | PB10 |
| 29 | RST_BTN | RST_BTN |
偶数排针:
| 引脚号 | 信号名 | STM32F401 功能 |
|---|---|---|
| 2 | SPI2_SS | PB12 |
| 4 | SPI2_MOSI | PB15 |
| 6 | SPI2_MISO | PB14 |
| 8 | SPI2_SCK | PB13 |
| 10 | GND | GND |
| 12 | VCC2 | VCC2 |
| 14 | AIN13 | PC3 |
| 16 | AIN15 | PC5 |
| 18 | UART6_RX | PC7 |
| 20 | GPIO | PC9 |
| 22 | I2C1_SCL | PB8 |
| 24 | I2C1_SDA | PB9 |
| 26 | AIN10 | PC0 |
| 28 | AIN11 | PC1 |
| 30 | NC | NC |
排针所对应的 96Boards Low Speed Connector 抽象还体现在 96b_lscon.dtsi 中:它定义了linaro,96b-lscon-3v3连接器节点,将 96Boards 标准 GPIO-A~H(引脚 13~20)映射到 PC2~PC9,并将lscon_96b_i2c0、lscon_96b_spi0、lscon_96b_uart0/uart1分别绑定到i2c1、spi2、usart2、usart1,供应用通过 96Boards 标准接口编写可移植代码。
外部时钟源
STM32F4 有两颗外部振荡器:低速时钟频率 32.768 kHz(LSI 32.768 kHz),主时钟频率 16 MHz(HSE)。后者经 PLL 倍频至 84 MHz 系统主频。
串口
96Boards Carbon 最多提供 4 路 U(S)ART。Zephyr 控制台输出分配在USART1,默认波特率 115200、8N1。设备树中chosen明确指定了zephyr,console = &usart1与zephyr,shell-uart = &usart1,同时usart1(PA9/PA10)、usart2(PA2/PA3)、usart6(PC6/PC7)均已在设备树中启用并配置为 115200。
I2C
96Boards Carbon 最多提供 2 路 I2C,Zephyr 默认映射为:
- I2C1_SCL : PB6
- I2C1_SDA : PB7
- I2C2_SCL : PB10
- I2C2_SDA : PB3
设备树中i2c1、i2c2均以I2C_BITRATE_FAST(400 kHz)启用。
SPI
96Boards Carbon 最多提供 2 路 SPI。SPI1 专用于与 nRF51822 的蓝牙 HCI 通信。Zephyr 默认 SPI 映射:
- SPI1_NSS : PA4
- SPI1_SCK : PA5
- SPI1_MISO : PA6
- SPI1_MOSI : PA7
- SPI2_NSS : PB12
- SPI2_SCK : PB13
- SPI2_MISO : PB14
- SPI2_MOSI : PB15
在 96b_carbon_stm32f401xe.dts 中,SPI1 下挂了一个zephyr,bt-hci-spi类型的 HCI 从设备节点(hci_spi),通过reset-gpios(PB4,低有效带上拉)与irq-gpios(PB1)控制 nRF51822,SPI 时钟最高 2 MHz;同时chosen中zephyr,bt-hci = &hci_spi将该节点设为蓝牙 HCI 传输通道。
USB
96Boards Carbon 拥有一个支持设备/主机双角色的 USB OTG DRD 控制器,通过板上的 mini OTG USB 接口引出。当前 Zephyr 仅支持 USB 设备功能:
- USB_DM : PA11
- USB_DP : PA12
设备树中zephyr_udc0即指向usbotg_fs节点(PA11/PA12),供 USB 设备类应用使用。
编程与调试:两条烧录路径
STM32F4 SoC 主要有两种烧录入口:ROM bootloader(无需额外硬件,通过 BOOT0 引脚触发)与SWD 调试端口(需要额外调试器)。ROM bootloader 支持 USB(DFU)、UART、I2C、SPI 四种烧录通道。本节重点介绍 DFU 路径,这也是 Zephyr 为该板卡配置的默认烧录方式:见 board.cmake 中的board_runner_args(dfu-util "--pid=0483:df11" "--alt=0" "--dfuse")。
安装 dfu-util
建议至少使用dfu-util v0.8。Debian/Ubuntu 软件源自带的版本可能较旧,必要时需从源码自行构建。
将应用烧写到 96Boards Carbon
- 用 micro-USB 线连接 USB OTG Carbon 口与电脑,板卡应上电启动。
- 保持按住 BOOT0 开关,同时按下并松开 RST 开关,将板卡强制进入 DFU 模式。
- 确认板卡处于 DFU 模式:
$ sudo dfu-util -l dfu-util 0.8 Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc. Copyright 2010-2014 Tormod Volden and Stefan Schmidt This program is Free Software and has ABSOLUTELY NO WARRANTY Please report bugs to dfu-util@lists.gnumonks.org Found DFU: [0483:df11] ver=2200, devnum=15, cfg=1, intf=0, alt=3, name="@Device Feature/0xFFFF0000/01*004 e", serial="3574364C3034" Found DFU: [0483:df11] ver=2200, devnum=15, cfg=1, intf=0, alt=2, name="@OTP Memory /0x1FFF7800/01*512 e,01*016 e", serial="3574364C3034" Found DFU: [0483:df11] ver=2200, devnum=15, cfg=1, intf=0, alt=1, name="@Option Bytes /0x1FFFC000/01*016 e", serial="3574364C3034" Found DFU: [0483:df11] ver=2200, devnum=15, cfg=1, intf=0, alt=0, name="@Internal Flash /0x08000000/04*016Kg,01*064Kg,03*128Kg", serial="3574364C3034" Found Runtime: [05ac:8290] ver=0104, devnum=2, cfg=1, intf=5, alt=0, name="UNKNOWN", serial="UNKNOWN"其中alt=0对应内部 Flash(0x08000000,512 KB,扇区划分 4×16 KB + 1×64 KB + 3×128 KB),与 board.cmake 中--alt=0 --dfuse的参数一致。
在 Linux 主机上还会看到如下 dmesg 确认:
$ dmesg usb 1-2.1: new full-speed USB device number 14 using xhci_hcd usb 1-2.1: New USB device found, idVendor=0483, idProduct=df11 usb 1-2.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3 usb 1-2.1: Product: STM32 BOOTLOADER usb 1-2.1: Manufacturer: STMicroelectronics usb 1-2.1: SerialNumber: 3574364C3034- 构建并烧写应用(以
hello_world为例):
$ west build -b 96b_carbon/stm32f401xe samples/hello_world $ west flash- 用 micro-USB 线连接 USB UART(FTDI)口与电脑,运行终端程序监听输出:
$ minicom -D <tty_device> -b 115200将<tty_device>替换为板卡对应的串口设备(Linux 下通常是/dev/ttyUSB0);-b选项强制指定波特率。
- 按下板卡 Reset 按键,终端应输出:
Hello World! arm验证蓝牙功能
板卡的蓝牙链路是"STM32F401RET 主控 + nRF51822 从芯片(经 SPI1/HCI)"的组合,因此验证分为三步:
- 按 boards/96boards/carbon/doc/nrf51822.rst 的说明,将
samples/bluetooth/hci_spi示例烧录到 nRF51822:
$ west build -b 96b_carbon/nrf51822 samples/bluetooth/hci_spi $ west flash⚠️ 注意:
hci_spi固件只能烧到 nRF51822,绝不能误烧到主芯片 STM32F401RET——虽然两颗芯片都受 Zephyr 支持,但该蓝牙桥接固件仅在 nRF51822 上运行。nRF51822 侧的烧录需借助外部 SWD 调试器,通过板载丝印标注为 "BLE" 的调试排针(出厂未焊接 0.1 英寸排针,需自行焊接)完成。
- 按上文步骤安装 dfu-util。
- 构建并烧写
samples/bluetooth/peripheral_hr(心率外设示例)到主芯片,目标板卡仍为96b_carbon/stm32f401xe,进入 DFU 模式的方式同上:
$ west build -b 96b_carbon/stm32f401xe samples/bluetooth/peripheral_hr $ west flash- 按照
samples/bluetooth/peripheral_hr示例(ble_peripheral_hr)自带的说明验证功能:使用手机或另一台支持 BLE 的设备扫描并连接该外设,即可观察到心率服务的广播与连接行为。
完成以上步骤后,96Boards Carbon 即具备完整的蓝牙连接能力,可在此基础上进一步开发蓝牙应用。
使用 SWD 调试
96b_carbon/stm32f401xe支持 SWD 调试:在板卡右下角安装一个 100 mil(0.1 英寸)排针,将 SWD 调试器连接到该排针的 3V3、GND、CLK、DIO、RST 引脚,然后通过任一 USB 口为 96Boards Carbon 供电。随后即可让调试器通过 SWD 扫描挂接 STM32F401RET 进行调试。
Flash 分区布局
从 96b_carbon_stm32f401xe.dts 可以看到,板载 512 KB Flash 预定义了 MCUboot 友好的分区布局:
| 分区 | 标签 | 偏移 | 大小 |
|---|---|---|---|
| boot | mcuboot | 0x00000000 | 32 KB(只读) |
| slot0 | image-0 | 0x00020000 | 128 KB |
| slot1 | image-1 | 0x00040000 | 128 KB |
| scratch | image-scratch | 0x00060000 | 128 KB |
chosen中的zephyr,code-partition = &slot0_partition表明应用默认链接到 slot0 分区,为后续接入 MCUboot 引导升级预留了镜像槽位与交换空间。
小结
96Boards Carbon 是理解"双芯片异构板卡"在 Zephyr 中组织方式的典型范例:主控96b_carbon/stm32f401xe负责全部外设与用户应用,从芯片96b_carbon/nrf51822只承担 BLE 桥接,二者经 SPI1 上的zephyr,bt-hci-spi节点在设备树层面完成 HCI 对接;烧录路径上,主芯片走 STM32 ROM bootloader + dfu-util(DFU 模式),从芯片走外部 SWD 调试器。沿着本文的 DFU 进入流程、串口验证与蓝牙三步入门的实操路径,即可快速跑通该板卡从裸机点亮到 BLE 通信的完整开发闭环。
【免费下载链接】zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.项目地址: https://gitcode.com/GitHub_Trending/ze/zephyr
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考