# stm32 **Repository Path**: chenhuajie/stm32 ## Basic Information - **Project Name**: stm32 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-05 - **Last Updated**: 2026-09-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 32-S178 工程构建说明(macOS / Linux 原生 GCC) 本工程原是 **Windows + Keil MDK** 项目(`A-Test-STD.uvproj`,芯片 STM32F103ZE)。 现已移植为可在 **macOS / Linux 上用开源工具链直接编译、烧录** 的版本,无需任何 Windows 软件。 > 当前仅覆盖原 Keil 工程的 **Target ZE(STM32F103ZE,大容量 512KB Flash / 64KB RAM)**。 > 原工程里的另一目标 **Target C8(STM32F103C8,中容量)** 暂未移植,见文末「可扩展项」。 --- ## 1. 目标芯片 | 项 | 值 | | --- | --- | | 芯片 | STM32F103ZE(Cortex-M3) | | Flash | 512 KB @ 0x08000000 | | RAM | 64 KB @ 0x20000000 | | 主频 | 72 MHz(HSE + PLL,由 `SYSCLK_FREQ_72MHz` 宏决定) | | 调试接口 | SWD(J-Link,亦支持 ST-Link) | 编译宏:`-D STM32F10X_HD -D USE_STDPERIPH_DRIVER -D SYSCLK_FREQ_72MHz` --- ## 2. 工具链(自包含,无需 Homebrew / sudo) 使用 [xPack](https://xpack.github.io/) 预编译的 `arm-none-eabi-gcc` 与 `openocd`,全部放在本机 `~/toolchain/` 下, **不需要 Homebrew、不需要 sudo、不受系统升级影响**。 本机已安装: ``` ~/toolchain/xpack-arm-none-eabi-gcc-15.2.1-1.1/ # 编译器 / 链接器 ~/toolchain/xpack-openocd-0.12.0-7/ # 烧录工具 ``` `Makefile` 会自动探测 `~/toolchain/` 下的工具链;若不在,则回退到 `PATH` 中的 `arm-none-eabi-*`。 ### 在另一台机器重新部署工具链(可选) ```bash # 方式 A:用 xpm(推荐) npm install --global xpm xpm install --global @xpack-dev-tools/arm-none-eabi-gcc@latest xpm install --global @xpack-dev-tools/openocd@latest # 方式 B:直接下载预编译压缩包并解压到 ~/toolchain/ # https://github.com/xpack-dev-tools/arm-none-eabi-gcc-xpack/releases # https://github.com/xpack-dev-tools/openocd-xpack/releases # 解压后目录名形如 xpack-arm-none-eabi-gcc-15.2.1-1.1 / xpack-openocd-0.12.0-7 ``` --- ## 3. 编译 ```bash make # 或 make all ``` 产物位于 `build/`: | 文件 | 说明 | | --- | --- | | `build/A-Test-STD.elf` | 含调试信息的 ELF,下载/调试用 | | `build/A-Test-STD.bin` | 纯二进制镜像,可直接烧录 | | `build/A-Test-STD.hex` | Intel HEX 格式 | | `build/A-Test-STD.map` | 链接映射文件(符号/段布局) | 实测固件占用(仅作参考,随代码改动变化): - Flash:`text 33388 + data 512 ≈ 33.1 KB`(约 512 KB 的 6.6%) - RAM:`data 512 + bss 2784 ≈ 3.2 KB`(约 64 KB 的 5.1%) 清理: ```bash make clean # 删除整个 build/ 目录 ``` --- ## 4. 烧录到硬件 1. 用 SWD 连接 **J-Link ↔ STM32F103ZE** 开发板(SWCLK / SWDIO / GND / VCC,另接 3.3V 供电或目标板供电)。 2. 执行: ```bash make flash ``` 该命令等价于: ```bash openocd -f openocd.cfg -c "program build/A-Test-STD.elf verify reset exit" ``` 烧录完成后开发板会自动复位运行。 ### OpenOCD 配置(`openocd.cfg`) - 调试器:**ST-Link**(`interface/stlink.cfg`,`transport select swd`) - 目标:`target/stm32f1x.cfg` - 速率:`adapter speed 100`(kHz,调低更稳) - GDB 连接时自动启用 semihosting,`printf` 可输出到调试控制台 **改用 J-Link**:把 `openocd.cfg` 前两行替换为: ```tcl source [find interface/jlink.cfg] transport select swd ``` --- ## 5. 工程结构与原 Keil 工程的差异 原始 Keil 工程只提供了源码与标准外设库,**缺失 Keil 设备包才提供的 CMSIS 头文件**。 本版本补齐了这些文件,并新增了 GNU 构建所需脚本: ### 新增 / 补齐的文件 | 文件 | 来源 | 说明 | | --- | --- | --- | | `Makefile` | 新增 | 编译 / 链接 / 烧录编排 | | `STM32F103ZE.ld` | 新增 | GNU 链接脚本(512KB Flash / 64KB RAM) | | `CORE/startup_stm32f10x_hd.S` | 新增 | Keil `startup_stm32f10x_hd.s` 的 GNU 汇编版,含向量表与 `Reset_Handler` | | `openocd.cfg` | 新增 | J-Link + SWD 烧录配置 | | `CMSIS/Device/ST/STM32F10x/Include/stm32f10x.h` | 下载 | SPL V3.5.0 设备头(原由 Keil 包提供) | | `CMSIS/Device/ST/STM32F10x/Include/system_stm32f10x.h` | 创建 | `SystemInit` / `SystemCoreClock` 等标准声明 | | `CORE/cmsis_gcc.h` | 下载 | CMSIS V5.4.2,GCC 分支所需的编译器抽象层 | ### 源码改动 - **`CORE/core_cm3.c`**:GCC 15 下 `STREX` 系列内联汇编的结果操作数约束由 `"=r"` 改为 `"=&r"`(early-clobber), 否则 GCC 会把 `result` 与 `value` 分配到同一个 `r0`,报 `registers may not be the same -- strexb r0,r0,[r1]`。 - **`my_encrpyt_mcu.lib`**(Keil 格式库):经核对源码未引用,本构建忽略,无需转换。 ### 无害告警 链接阶段会出现 `_write / _read / _sbrk / _kill / _isatty / _lseek is not implemented` 等告警。 这是 newlib-nano 的默认桩函数缺失提示——本固件通过自定义 USART 输出,不使用标准 stdio,可安全忽略。 --- ## 6. 可扩展项(未做) - **Target C8(STM32F103C8,中容量 64KB Flash / 20KB RAM)**: 需在 Makefile 增加 `TARGET=C8` 变体,配套 `startup_stm32f10x_md.S` 与 `-D STM32F10X_MD`, 以及一份 `STM32F103C8.ld`(Flash 64K / RAM 20K)。 - **串口/日志重定向**:如需用 `printf` 经 USART 输出,可实现 `_write` 桩函数指向自定义串口发送。 --- ## 7. 快速命令一览 ```bash make # 编译,产出 build/A-Test-STD.{elf,bin,hex} make clean # 清空 build/ make flash # (需连接 J-Link + 板子)烧录并复位 ```