Zephyr RTOS 板级支持实战:OLIMEX-STM32-H407 开发板(STM32F407ZG)从引脚映射到烧录调试
2026/9/20 21:10:39 网站建设 项目流程

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=yolimex_stm32_h407_defconfig
硬件栈保护CONFIG_HW_STACK_PROTECTION=yolimex_stm32_h407_defconfig
串口(USART2 控制台)CONFIG_SERIAL=yzephyr,console = &usart2defconfig / dts
GPIOCONFIG_GPIO=yolimex_stm32_h407_defconfig
控制台(UART 控制台)CONFIG_CONSOLE=yCONFIG_UART_CONSOLE=ydefconfig
Counter(定时器计数)supported: - counterolimex_stm32_h407.yaml
RTC(实时时钟)&rtc { status = "okay"; },由 LSI 驱动dts
RNG(硬件随机数)&rng { status = "okay"; }dts
USB OTG FSzephyr_udc0: &usbotg_fs,PA11/PA12dts
USART3 / USART6&usart3&usart6status = "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 引脚 0green_led_2: led_2 { gpios = <&gpioa 0 GPIO_ACTIVE_HIGH>; }),gpio_keys中按键定义在GPIOC 引脚 13gpios = <&gpioc 13 GPIO_ACTIVE_LOW>),并为按键分配了zephyr,code = <INPUT_KEY_0>输入事件码:

aliases { led0 = &green_led_2; sw0 = &user_button; };

也就是说,在 Zephyr 应用中,你可以直接通过led0sw0别名引用这两个设备,例如配合 samples/basic/blinky 实现 LED 闪烁。具体丝印标注以实际板卡为准,文档正文中 LED 位于 PC13、按键位于 PA0,与设备树别名节点相互印证。

外部连接器(External Connectors)

JTAG/SWD 调试接口(20 pin)
PIN #Signal NamePin #Signal Name
1+3.3V11-
2+3.3V12GND
3PB4 / TRST13PB3 / TDO
4GND14GND
5PA15 / TDI15PB4 / TRST
6GND16GND
7PA13 / TMS17-
8GND18GND
9PA14 / TCK19+5V_JTAG
10GND20GND
UEXT 扩展接口

UEXT(Universal EXTension)是 Olimex 系列板卡的通用扩展接口,提供 UART、I2C、SPI 总线。

PIN #Wire NameSTM32F407 port
1+3.3V-
2GND-
3PC6/USART6_TXPC6
4PC7/USART6_RXPC7
5PB8/I2C1_SCLPB8
6PB9/I2C1_SDAPB9
7PC2/SPI2_MISOPC2
8PC3/SPI2_MOSIPC3
9PB10/SPI_SCK/UART3_TXPB10
10RB7/UEXT_CSPB7
Arduino 兼容排针

CON1(电源)

PinSignal NameSTM32F407 Pin#
RSTRESET25
3V3VCC (3V3)N/A
5VVDD (5V)N/A
GNDGNDN/A
GNDGNDN/A
VINVINN/A

CON2(模拟)

PinSignal NameSTM32F407 Pin#
A0PC026
A1PC127
A2PB046
A3PB147
A4PC444
A5PC545

CON3(数字)

PinSignal NameSTM32F407 Pin#
D0PA3/USART2_RX37
D1PA2/USART2_TX36
D2PG792
D3PG893
D4PG12127
D5PG13128
D6PG14129
D7PG15132

CON4(数字)

PinSignal NameSTM32F407 Pin#
D8PA135
D9PB1170
D10PA440
D11PA743
D12PA642
D13PA541
GNDAGND31
AREFAREF32

注意:D0(PA3/USART2_RX)与 D1(PA2/USART2_TX)正是 Zephyr 默认控制台usart2所复用的引脚,见设备树中&usart2pinctrl-0 = <&usart2_tx_pa2 &usart2_rx_pa3>

PD 排针(20 pin)
PIN #Signal NamePin #Signal Name
1+3.3V11PD8
2GND12PD9
3PD013PD10
4PD114PD11
5PD2/SD_CMD15PD12
6PD316PD13
7PD417PD14
8PD518PD15
9PD619+5V
10PD720GND
PE 排针(20 pin)
PIN #Signal NamePin #Signal Name
1+3.3V11PE8
2GND12PE9
3PE013PE10
4PE114PE11
5PE215PE12
6PE316PE13
7PE417PE14
8PE518PE15
9PE619+5V
10PE720GND
PF 排针(20 pin)
PIN #Signal NamePin #Signal Name
1+3.3V11PF8
2GND12PF9
3PF013PF10
4PF114PF11
5PF215PF12
6PF316PF13
7PF417PF14
8PF518PF15
9PF619+5V
10PF720GND
PG 排针(20 pin)
PIN #Signal NamePin #Signal Name
1+3.3V11PG8/D3
2GND12PG9
3PG013PG10
4PG114PG11
5PG215PG12/D4
6PG316PG13/D5
7PG417PG14/D6
8PG518PG15/D7
9PG619+5V
10PG7/D220GND

从上面可以看到,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 flash

west 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 debug

west 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 主频)的底层支持代码。

开发建议与注意事项

  1. 控制台引脚即 Arduino D0/D1:默认zephyr,consolezephyr,shell-uart都是usart2(PA2/PA3,即 Arduino D1/D0)。若你在 D0/D1 上外接其他 UART 设备,需要修改设备树chosen或改用usart3/usart6(均已默认使能)。
  2. UEXT 扩展:UEXT 接口同时引出 USART6、I2C1、SPI2 三条总线,适合挂接 Olimex 生态的传感器/显示模块,引脚互不冲突,可直接在设备树中使能对应外设。
  3. USB OTG FSzephyr_udc0已绑定到usbotg_fs(PA11/PA12),可用于 CDC-ACM 虚拟串口、HID 等 USB 设备应用(参考 samples/subsys/usb 与 samples/boards/olimex 中的相关示例)。
  4. 调试器选择:若使用 J-Link,west flash -r jlink会以 STM32F407ZG、4000 kHz 参数运行;若使用 OpenOCD 兼容探针,直接使用west flash即可,板级默认即 OpenOCD。
  5. 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询