Zephyr RTOS 板级支持实战:OLIMEX-STM32-H407 开发板(STM32F407ZG)从引脚映射到烧录调试

Zephyr RTOS 板级支持实战:OLIMEX-STM32-H407 开发板(STM32F407ZG)从引脚映射到烧录调试 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/zephyrOLIMEX-STM32-H407 是 Olimex 出品的开源硬件开发板基于意法半导体 STM32F407ZGARM 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 KB1 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主时钟HSE12 MHz处理器可以通过 HSE 驱动主时钟master clock经 PLL 倍频后最高可达168 MHz。这一配置在设备树中有着明确的体现olimex_stm32_h407.dtsclk_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 VCOdiv-p 2后得到 168 MHz 系统主频div-q 7则用于 USB 等外设所需的 48 MHz 时钟。APB1 分频 442 MHz、APB2 分频 284 MHz符合 STM32F4 系列常规总线配置。支持的特性Supported Features文档通过zephyr:board-supported-hw::指令自动呈现板卡支持的硬件特性。结合板级默认配置 olimex_stm32_h407_defconfig 与设备树可以确认以下特性在默认状态下可用特性默认启用说明证据来源MPU内存保护单元CONFIG_ARM_MPUyolimex_stm32_h407_defconfig硬件栈保护CONFIG_HW_STACK_PROTECTIONyolimex_stm32_h407_defconfig串口USART2 控制台CONFIG_SERIALy、zephyr,console usart2defconfig / dtsGPIOCONFIG_GPIOyolimex_stm32_h407_defconfig控制台UART 控制台CONFIG_CONSOLEy、CONFIG_UART_CONSOLEydefconfigCounter定时器计数supported: - counterolimex_stm32_h407.yamlRTC实时时钟rtc { status okay; }由 LSI 驱动dtsRNG硬件随机数rng { status okay; }dtsUSB OTG FSzephyr_udc0: usbotg_fsPA11/PA12dtsUSART3 / USART6usart3、usart6均status okaydts其中 RTC 的时钟源选择也值得注意设备树中将其绑定到 LSI 低速内部时钟rtc { clocks rcc STM32_CLOCK(APB1, 28), rcc STM32_SRC_LSI RTC_SEL(2); status okay; };引脚映射Pin MappingLED 与按键器件引脚说明LED绿色PC13用户指示灯LED2PWR_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 应用中你可以直接通过led0与sw0别名引用这两个设备例如配合 samples/basic/blinky 实现 LED 闪烁。具体丝印标注以实际板卡为准文档正文中 LED 位于 PC13、按键位于 PA0与设备树别名节点相互印证。外部连接器External ConnectorsJTAG/SWD 调试接口20 pinPIN #Signal NamePin #Signal Name13.3V11-23.3V12GND3PB4 / TRST13PB3 / TDO4GND14GND5PA15 / TDI15PB4 / TRST6GND16GND7PA13 / TMS17-8GND18GND9PA14 / TCK195V_JTAG10GND20GNDUEXT 扩展接口UEXTUniversal EXTension是 Olimex 系列板卡的通用扩展接口提供 UART、I2C、SPI 总线。PIN #Wire NameSTM32F407 port13.3V-2GND-3PC6/USART6_TXPC64PC7/USART6_RXPC75PB8/I2C1_SCLPB86PB9/I2C1_SDAPB97PC2/SPI2_MISOPC28PC3/SPI2_MOSIPC39PB10/SPI_SCK/UART3_TXPB1010RB7/UEXT_CSPB7Arduino 兼容排针CON1电源PinSignal NameSTM32F407 Pin#RSTRESET253V3VCC (3V3)N/A5VVDD (5V)N/AGNDGNDN/AGNDGNDN/AVINVINN/ACON2模拟PinSignal NameSTM32F407 Pin#A0PC026A1PC127A2PB046A3PB147A4PC444A5PC545CON3数字PinSignal NameSTM32F407 Pin#D0PA3/USART2_RX37D1PA2/USART2_TX36D2PG792D3PG893D4PG12127D5PG13128D6PG14129D7PG15132CON4数字PinSignal NameSTM32F407 Pin#D8PA135D9PB1170D10PA440D11PA743D12PA642D13PA541GNDAGND31AREFAREF32注意D0PA3/USART2_RX与 D1PA2/USART2_TX正是 Zephyr 默认控制台usart2所复用的引脚见设备树中usart2的pinctrl-0 usart2_tx_pa2 usart2_rx_pa3。PD 排针20 pinPIN #Signal NamePin #Signal Name13.3V11PD82GND12PD93PD013PD104PD114PD115PD2/SD_CMD15PD126PD316PD137PD417PD148PD518PD159PD6195V10PD720GNDPE 排针20 pinPIN #Signal NamePin #Signal Name13.3V11PE82GND12PE93PE013PE104PE114PE115PE215PE126PE316PE137PE417PE148PE518PE159PE6195V10PE720GNDPF 排针20 pinPIN #Signal NamePin #Signal Name13.3V11PF82GND12PF93PF013PF104PF114PF115PF215PF126PF316PF137PF417PF148PF518PF159PF6195V10PF720GNDPG 排针20 pinPIN #Signal NamePin #Signal Name13.3V11PG8/D32GND12PG93PG013PG104PG114PG115PG215PG12/D46PG316PG13/D57PG417PG14/D68PG518PG15/D79PG6195V10PG7/D220GND从上面可以看到PG 排针中的 PG7/PG8/PG12/PG13/PG14/PG15 与 Arduino CON3 的 D2~D7 是复用的使用排针扩展时需要注意避免引脚冲突。编程与调试Programming and DebuggingOLIMEX-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 --deviceSTM32F407ZG --speed4000) include(${ZEPHYR_BASE}/boards/common/openocd.board.cmake) include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake)也就是说west flash时会自动根据可用工具选择 OpenOCD 或 J-LinkJ-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 接口定义传输协议选择 JTAGtransport select jtag工作区设置 OpenOCD 工作 RAM 为 64 KB0x10000供快速加载使用目标复用 ST 官方stm32f4x.cfg目标脚本复位配置srst_only srst_nogate仅使用 SRST、不复位门控GDB 事件钩子GDB attach 时自动reset halt并强制硬件断点gdb_breakpoint_override hardGDB 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连接串口查看输出烧录完成后使用串口主机程序连接板卡默认控制台USART2115200 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_MPUy # Enable HW stack protection CONFIG_HW_STACK_PROTECTIONy CONFIG_SERIALy # console CONFIG_CONSOLEy CONFIG_UART_CONSOLEy # enable GPIO CONFIG_GPIOy工程意义解读CONFIG_ARM_MPUy启用 ARM MPU配合 Zephyr 的内存分区机制将内核与用户空间、以及各内核对象隔离提升系统健壮性CONFIG_HW_STACK_PROTECTIONy启用硬件栈保护利用 MPU 为每个线程栈设置守卫区域栈溢出时触发硬件 fault 而非静默破坏内存——这是嵌入式系统中最常见的崩溃根因之一CONFIG_SERIAL/CONFIG_CONSOLE/CONFIG_UART_CONSOLE串口与控制台基础设施让printk输出经由 USART2 打印到主机终端也是 hello_world 输出 Hello World! arm 的链路基础CONFIG_GPIOy启用 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都是usart2PA2/PA3即 Arduino D1/D0。若你在 D0/D1 上外接其他 UART 设备需要修改设备树chosen或改用usart3/usart6均已默认使能。UEXT 扩展UEXT 接口同时引出 USART6、I2C1、SPI2 三条总线适合挂接 Olimex 生态的传感器/显示模块引脚互不冲突可直接在设备树中使能对应外设。USB OTG FSzephyr_udc0已绑定到usbotg_fsPA11/PA12可用于 CDC-ACM 虚拟串口、HID 等 USB 设备应用参考 samples/subsys/usb 与 samples/boards/olimex 中的相关示例。调试器选择若使用 J-Linkwest flash -r jlink会以 STM32F407ZG、4000 kHz 参数运行若使用 OpenOCD 兼容探针直接使用west flash即可板级默认即 OpenOCD。RTC 依赖 LSIRTC 时钟源为 LSI32.768 kHz 内部低速时钟功耗敏感场景下注意 LSI 的精度特性如需更高精度可参考 STM32F407 数据手册评估外部 LSE 方案。结语OLIMEX-STM32-H407 以 STM32F407ZGCortex-M4F168 MHz1 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),仅供参考