Zephyr RTOS 板级支持实战:OLIMEX-STM32-H407 开发板(STM32F407ZG)从引脚映射到烧录调试
【免费下载链接】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
OLIMEX-STM32-H407 是 Olimex 出品的开源硬件开发板,基于意法半导体 STM32F407ZG(ARM Cortex-M4)微控制器,在 Zephyr RTOS 中由olimex_stm32_h407板级目标(board target)支持。本文以 Zephyr 仓库中该板卡官方文档 boards/olimex/stm32_h407/doc/index.rst 为核心,结合板级源码(设备树、Kconfig、defconfig、OpenOCD 配置)展开,带你掌握该板卡的硬件资源、引脚复用、系统时钟配置,以及从零完成应用构建、烧录与调试的完整流程。读完本文,你将能够基于olimex_stm32_h407目标独立开发、部署并调试自己的 Zephyr 应用。
板卡概览与硬件基础
OLIMEX-STM32-H407 是一块基于 ST STM32F407ZG 微控制器的开源硬件(Open Source Hardware)开发板。核心处理器为ARM Cortex-M4(带 FPU),运行频率最高可达 168 MHz。板级元数据 board.yml 中定义了该板卡的正式标识:
board: name: olimex_stm32_h407 full_name: OLIMEX-STM32-H407 vendor: olimex socs: - name: stm32f407xx同时,olimex_stm32_h407.yaml 中标注了板卡的关键资源参数:
identifier: olimex_stm32_h407 name: OLIMEX-STM32-H407 type: mcu arch: arm toolchain: - zephyr - gnuarmemb ram: 128 # 128 KB SRAM flash: 1024 # 1024 KB(1 MB)片内 Flash supported: - counter vendor: olimex从板级设备树 olimex_stm32_h407.dts 可以看到,板卡使用了 STM32F407ZG 的完整设备树源(stm32f407Xg.dtsi)以及对应的引脚复用定义(stm32f407z(e-g)tx-pinctrl.dtsi),并声明了兼容标识:
model = "Olimex STM32-H407 board"; compatible = "olimex,stm32-h407";外部振荡器与系统时钟
OLIMEX-STM32-H407 板载两个外部晶振:
| 时钟 | 频率 |
|---|---|
| 慢速时钟(LSI/LSE 方向) | 32.768 kHz |
| 主时钟(HSE) | 12 MHz |
处理器可以通过 HSE 驱动主时钟(master clock),经 PLL 倍频后最高可达168 MHz。这一配置在设备树中有着明确的体现(olimex_stm32_h407.dts):
&clk_hse { clock-frequency = <DT_FREQ_M(12)>; status = "okay"; }; &pll { div-m = <12>; mul-n = <336>; div-p = <2>; div-q = <7>; clocks = <&clk_hse>; status = "okay"; }; &rcc { clocks = <&pll>; clock-frequency = <DT_FREQ_M(168)>; ahb-prescaler = <1>; apb1-prescaler = <4>; apb2-prescaler = <2>; };解读:PLL 输入为 12 MHz HSE,经过div-m = 12分频得到 1 MHz 基准,再经mul-n = 336倍频得到 336 MHz VCO,div-p = 2后得到 168 MHz 系统主频,div-q = 7则用于 USB 等外设所需的 48 MHz 时钟。APB1 分频 4(42 MHz)、APB2 分频 2(84 MHz),符合 STM32F4 系列常规总线配置。
支持的特性(Supported Features)
文档通过zephyr:board-supported-hw::指令自动呈现板卡支持的硬件特性。结合板级默认配置 olimex_stm32_h407_defconfig 与设备树,可以确认以下特性在默认状态下可用:
| 特性 | 默认启用说明 | 证据来源 |
|---|---|---|
| MPU(内存保护单元) | CONFIG_ARM_MPU=y | olimex_stm32_h407_defconfig |
| 硬件栈保护 | CONFIG_HW_STACK_PROTECTION=y | olimex_stm32_h407_defconfig |
| 串口(USART2 控制台) | CONFIG_SERIAL=y、zephyr,console = &usart2 | defconfig / dts |
| GPIO | CONFIG_GPIO=y | olimex_stm32_h407_defconfig |
| 控制台(UART 控制台) | CONFIG_CONSOLE=y、CONFIG_UART_CONSOLE=y | defconfig |
| Counter(定时器计数) | supported: - counter | olimex_stm32_h407.yaml |
| RTC(实时时钟) | &rtc { status = "okay"; },由 LSI 驱动 | dts |
| RNG(硬件随机数) | &rng { status = "okay"; } | dts |
| USB OTG FS | zephyr_udc0: &usbotg_fs,PA11/PA12 | dts |
| USART3 / USART6 | &usart3、&usart6均status = "okay" | dts |
其中 RTC 的时钟源选择也值得注意,设备树中将其绑定到 LSI 低速内部时钟:
&rtc { clocks = <&rcc STM32_CLOCK(APB1, 28)>, <&rcc STM32_SRC_LSI RTC_SEL(2)>; status = "okay"; };引脚映射(Pin Mapping)
LED 与按键
| 器件 | 引脚 | 说明 |
|---|---|---|
| LED(绿色) | PC13 | 用户指示灯(LED2) |
| PWR_LED(红色) | 电源 | 上电指示 |
| BUT(按键) | PA0 | 用户按键 |
| RST(复位键) | NRST | 复位 |
值得留意的是,olimex_stm32_h407.dts 中的设备树节点与实际丝印之间存在有趣的对应关系:设备树中leds节点定义在GPIOA 引脚 0(green_led_2: led_2 { gpios = <&gpioa 0 GPIO_ACTIVE_HIGH>; }),gpio_keys中按键定义在GPIOC 引脚 13(gpios = <&gpioc 13 GPIO_ACTIVE_LOW>),并为按键分配了zephyr,code = <INPUT_KEY_0>输入事件码:
aliases { led0 = &green_led_2; sw0 = &user_button; };也就是说,在 Zephyr 应用中,你可以直接通过led0与sw0别名引用这两个设备,例如配合 samples/basic/blinky 实现 LED 闪烁。具体丝印标注以实际板卡为准,文档正文中 LED 位于 PC13、按键位于 PA0,与设备树别名节点相互印证。
外部连接器(External Connectors)
JTAG/SWD 调试接口(20 pin)
| PIN # | Signal Name | Pin # | Signal Name |
|---|---|---|---|
| 1 | +3.3V | 11 | - |
| 2 | +3.3V | 12 | GND |
| 3 | PB4 / TRST | 13 | PB3 / TDO |
| 4 | GND | 14 | GND |
| 5 | PA15 / TDI | 15 | PB4 / TRST |
| 6 | GND | 16 | GND |
| 7 | PA13 / TMS | 17 | - |
| 8 | GND | 18 | GND |
| 9 | PA14 / TCK | 19 | +5V_JTAG |
| 10 | GND | 20 | GND |
UEXT 扩展接口
UEXT(Universal EXTension)是 Olimex 系列板卡的通用扩展接口,提供 UART、I2C、SPI 总线。
| PIN # | Wire Name | STM32F407 port |
|---|---|---|
| 1 | +3.3V | - |
| 2 | GND | - |
| 3 | PC6/USART6_TX | PC6 |
| 4 | PC7/USART6_RX | PC7 |
| 5 | PB8/I2C1_SCL | PB8 |
| 6 | PB9/I2C1_SDA | PB9 |
| 7 | PC2/SPI2_MISO | PC2 |
| 8 | PC3/SPI2_MOSI | PC3 |
| 9 | PB10/SPI_SCK/UART3_TX | PB10 |
| 10 | RB7/UEXT_CS | PB7 |
Arduino 兼容排针
CON1(电源)
| Pin | Signal Name | STM32F407 Pin# |
|---|---|---|
| RST | RESET | 25 |
| 3V3 | VCC (3V3) | N/A |
| 5V | VDD (5V) | N/A |
| GND | GND | N/A |
| GND | GND | N/A |
| VIN | VIN | N/A |
CON2(模拟)
| Pin | Signal Name | STM32F407 Pin# |
|---|---|---|
| A0 | PC0 | 26 |
| A1 | PC1 | 27 |
| A2 | PB0 | 46 |
| A3 | PB1 | 47 |
| A4 | PC4 | 44 |
| A5 | PC5 | 45 |
CON3(数字)
| Pin | Signal Name | STM32F407 Pin# |
|---|---|---|
| D0 | PA3/USART2_RX | 37 |
| D1 | PA2/USART2_TX | 36 |
| D2 | PG7 | 92 |
| D3 | PG8 | 93 |
| D4 | PG12 | 127 |
| D5 | PG13 | 128 |
| D6 | PG14 | 129 |
| D7 | PG15 | 132 |
CON4(数字)
| Pin | Signal Name | STM32F407 Pin# |
|---|---|---|
| D8 | PA1 | 35 |
| D9 | PB11 | 70 |
| D10 | PA4 | 40 |
| D11 | PA7 | 43 |
| D12 | PA6 | 42 |
| D13 | PA5 | 41 |
| GND | AGND | 31 |
| AREF | AREF | 32 |
注意:D0(PA3/USART2_RX)与 D1(PA2/USART2_TX)正是 Zephyr 默认控制台usart2所复用的引脚,见设备树中&usart2的pinctrl-0 = <&usart2_tx_pa2 &usart2_rx_pa3>。
PD 排针(20 pin)
| PIN # | Signal Name | Pin # | Signal Name |
|---|---|---|---|
| 1 | +3.3V | 11 | PD8 |
| 2 | GND | 12 | PD9 |
| 3 | PD0 | 13 | PD10 |
| 4 | PD1 | 14 | PD11 |
| 5 | PD2/SD_CMD | 15 | PD12 |
| 6 | PD3 | 16 | PD13 |
| 7 | PD4 | 17 | PD14 |
| 8 | PD5 | 18 | PD15 |
| 9 | PD6 | 19 | +5V |
| 10 | PD7 | 20 | GND |
PE 排针(20 pin)
| PIN # | Signal Name | Pin # | Signal Name |
|---|---|---|---|
| 1 | +3.3V | 11 | PE8 |
| 2 | GND | 12 | PE9 |
| 3 | PE0 | 13 | PE10 |
| 4 | PE1 | 14 | PE11 |
| 5 | PE2 | 15 | PE12 |
| 6 | PE3 | 16 | PE13 |
| 7 | PE4 | 17 | PE14 |
| 8 | PE5 | 18 | PE15 |
| 9 | PE6 | 19 | +5V |
| 10 | PE7 | 20 | GND |
PF 排针(20 pin)
| PIN # | Signal Name | Pin # | Signal Name |
|---|---|---|---|
| 1 | +3.3V | 11 | PF8 |
| 2 | GND | 12 | PF9 |
| 3 | PF0 | 13 | PF10 |
| 4 | PF1 | 14 | PF11 |
| 5 | PF2 | 15 | PF12 |
| 6 | PF3 | 16 | PF13 |
| 7 | PF4 | 17 | PF14 |
| 8 | PF5 | 18 | PF15 |
| 9 | PF6 | 19 | +5V |
| 10 | PF7 | 20 | GND |
PG 排针(20 pin)
| PIN # | Signal Name | Pin # | Signal Name |
|---|---|---|---|
| 1 | +3.3V | 11 | PG8/D3 |
| 2 | GND | 12 | PG9 |
| 3 | PG0 | 13 | PG10 |
| 4 | PG1 | 14 | PG11 |
| 5 | PG2 | 15 | PG12/D4 |
| 6 | PG3 | 16 | PG13/D5 |
| 7 | PG4 | 17 | PG14/D6 |
| 8 | PG5 | 18 | PG15/D7 |
| 9 | PG6 | 19 | +5V |
| 10 | PG7/D2 | 20 | GND |
从上面可以看到,PG 排针中的 PG7/PG8/PG12/PG13/PG14/PG15 与 Arduino CON3 的 D2~D7 是复用的,使用排针扩展时需要注意避免引脚冲突。
编程与调试(Programming and Debugging)
OLIMEX-STM32-H407板卡本身不集成任何板载调试器(on-board debug probe)。烧录与调试需要借助 ST 官方工具或外部 JTAG 探针。官方文档示例中使用的是Olimex ARM-USB-OCD-H调试器,如果你使用的是与 Zephyr 默认 OpenOCD 配置兼容的外部 JTAG 探针,那么针对olimex_stm32_h407板级目标的应用可以按 Zephyr 常规方式直接构建与烧录(参见 Zephyr 文档中的 build_an_application 与 application_run 章节)。
板级调试配置位于 board.cmake,同时支持 OpenOCD 与 J-Link 两条烧录链路:
board_runner_args(jlink "--device=STM32F407ZG" "--speed=4000") include(${ZEPHYR_BASE}/boards/common/openocd.board.cmake) include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake)也就是说,west flash时会自动根据可用工具选择 OpenOCD 或 J-Link(J-Link 使用 STM32F407ZG 设备名、4000 kHz 速率)作为 runner。
OpenOCD 目标配置解读
板卡自带的 OpenOCD 配置 support/openocd.cfg 是理解其调试链路的关键:
source [find interface/ftdi/olimex-arm-usb-ocd-h.cfg] set WORKAREASIZE 0x10000 transport select jtag source [find target/stm32f4x.cfg] adapter speed 1000 adapter srst delay 100 jtag_ntrst_delay 100 reset_config srst_only srst_nogate $_TARGETNAME configure -event gdb-attach { echo "Debugger attaching: halting execution" reset halt gdb_breakpoint_override hard } $_TARGETNAME configure -event gdb-detach { echo "Debugger detaching: resuming execution" resume }关键点解读:
- 接口:使用 Olimex ARM-USB-OCD-H 的 FTDI 接口定义;
- 传输协议:选择 JTAG(
transport select jtag); - 工作区:设置 OpenOCD 工作 RAM 为 64 KB(
0x10000),供快速加载使用; - 目标:复用 ST 官方
stm32f4x.cfg目标脚本; - 复位配置:
srst_only srst_nogate,仅使用 SRST、不复位门控; - GDB 事件钩子:GDB attach 时自动
reset halt并强制硬件断点(gdb_breakpoint_override hard),GDB detach 时自动resume恢复运行。这意味着你可以在 GDB 中直接continue运行,无需手动处理复位时序。
烧录一个应用(以 hello_world 为例)
将 ARM-USB-OCD-H 调试器连接到主机与板卡 JTAG 端口后,构建并烧录应用。以 samples/hello_world 为例:
west build -b olimex_stm32_h407 samples/hello_world west flashwest build会基于olimex_stm32_h407目标完成配置与编译,west flash则由 runner 调用 OpenOCD(或 J-Link)将固件写入片内 Flash。也可以在一条命令中完成:
west build -b olimex_stm32_h407 samples/hello_world -t flash连接串口查看输出
烧录完成后,使用串口主机程序连接板卡默认控制台(USART2,115200 baud,见设备树current-speed = <115200>)。以 minicom 为例:
minicom -D /dev/ttyUSB0复位板卡后,预期看到类似如下输出:
***** BOOTING ZEPHYR OS v1.11.0 - BUILD: Mar 12 2018 03:12:40 ***** Hello World! arm(以上为板卡文档给出的经典输出;当前仓库版本的控制台横幅与版本号以实际构建为准。)
调试应用
在拥有 JTAG 探针的前提下,可以按常规方式调试应用。同样以 hello_world 为例:
west build -b olimex_stm32_h407 samples/hello_world west debugwest debug会启动 GDB 并连接 OpenOCD(或 J-Link)服务器。得益于前面 openocd.cfg 中的 GDB 事件钩子,调试会话启动时目标会自动 halt,退出 GDB 时目标自动恢复运行。
深入源码:板级默认配置的工程意义
olimex_stm32_h407_defconfig 定义了板卡的默认 Kconfig 裁剪:
# Enable MPU CONFIG_ARM_MPU=y # Enable HW stack protection CONFIG_HW_STACK_PROTECTION=y CONFIG_SERIAL=y # console CONFIG_CONSOLE=y CONFIG_UART_CONSOLE=y # enable GPIO CONFIG_GPIO=y工程意义解读:
CONFIG_ARM_MPU=y:启用 ARM MPU,配合 Zephyr 的内存分区机制,将内核与用户空间、以及各内核对象隔离,提升系统健壮性;CONFIG_HW_STACK_PROTECTION=y:启用硬件栈保护,利用 MPU 为每个线程栈设置守卫区域,栈溢出时触发硬件 fault 而非静默破坏内存——这是嵌入式系统中最常见的崩溃根因之一;CONFIG_SERIAL/CONFIG_CONSOLE/CONFIG_UART_CONSOLE:串口与控制台基础设施,让printk输出经由 USART2 打印到主机终端,也是 hello_world 输出 "Hello World! arm" 的链路基础;CONFIG_GPIO=y:启用 GPIO 驱动,支撑 LED 与按键的gpio-leds/gpio-keys节点。
此外,Kconfig.olimex_stm32_h407 将板级配置与 SoC 绑定:
config BOARD_OLIMEX_STM32_H407 select SOC_STM32F407XG这保证了选择olimex_stm32_h407目标时,会自动选中 STM32F407XG SoC 系列(1 MB Flash、192 KB SRAM、168 MHz 主频)的底层支持代码。
开发建议与注意事项
- 控制台引脚即 Arduino D0/D1:默认
zephyr,console与zephyr,shell-uart都是usart2(PA2/PA3,即 Arduino D1/D0)。若你在 D0/D1 上外接其他 UART 设备,需要修改设备树chosen或改用usart3/usart6(均已默认使能)。 - UEXT 扩展:UEXT 接口同时引出 USART6、I2C1、SPI2 三条总线,适合挂接 Olimex 生态的传感器/显示模块,引脚互不冲突,可直接在设备树中使能对应外设。
- USB OTG FS:
zephyr_udc0已绑定到usbotg_fs(PA11/PA12),可用于 CDC-ACM 虚拟串口、HID 等 USB 设备应用(参考 samples/subsys/usb 与 samples/boards/olimex 中的相关示例)。 - 调试器选择:若使用 J-Link,
west flash -r jlink会以 STM32F407ZG、4000 kHz 参数运行;若使用 OpenOCD 兼容探针,直接使用west flash即可,板级默认即 OpenOCD。 - RTC 依赖 LSI:RTC 时钟源为 LSI(32.768 kHz 内部低速时钟),功耗敏感场景下注意 LSI 的精度特性;如需更高精度可参考 STM32F407 数据手册评估外部 LSE 方案。
结语
OLIMEX-STM32-H407 以 STM32F407ZG(Cortex-M4F,168 MHz,1 MB Flash / 128+ KB SRAM)为核心,配合 Zephyr 的完整板级支持——包括设备树时钟配置(12 MHz HSE → 168 MHz PLL)、OpenOCD/J-Link 双烧录链路、默认启用 MPU 与硬件栈保护,以及丰富的引脚引出(Arduino 兼容排针、UEXT、JTAG/SWD、PD/PE/PF/PG 全 GPIO 排针),是学习 Zephyr 驱动开发、RTOS 内核机制与硬件调试的理想平台。本文所有板级文件(设备树、默认配置、OpenOCD 配置、板级元数据)均可直接在 Zephyr 仓库对应路径下查阅,作为进一步开发的参考基准。
【免费下载链接】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),仅供参考