# CLAUDE.md This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. ## 项目概述 基于 **STM32F103ZET6**(ARM Cortex-M3,72MHz,512KB Flash,64KB SRAM)的 **MFT 步进电机控制器** 固件。应用程序通过 **DRV8880 驱动芯片** 控制步进电机,支持 UART 串口命令接口和数码管显示。 代码源自 **安富莱 STM32-V4** 开发板 BSP 模板。 ## 内存布局 | 区域 | 地址范围 | 说明 | |------|----------|------| | Bootloader | 0x0800 0000 - 0x0800 7FFF | 32KB IAP 引导程序 | | 应用程序 | 0x0800 8000 - 0x080F FFFF | 主固件(约 480KB) | | SRAM1 | 0x2000 0000 - 0x2000 FFFF | 64KB 内部 RAM | **重要**:`main()` 中 `SCB->VTOR = 0x08008000` 设置应用程序的中断向量表偏移。 ## 构建系统 这是一个 **Keil MDK / IAR EWARM** 项目,没有 Makefile 或 CMake。需要在 IDE 中构建: ### Keil MDK - 工程文件:`Project/MDK-ARM/project.uvprojx` - 两个 Target:**Flash**(从内部 Flash 运行)和 **CpuRAM**(从 RAM 运行,用于调试) - 输出文件:`Project/output(mdk).hex` - VS Code C/C++ 配置在 `Project/MDK-ARM/.vscode/c_cpp_properties.json`,包含头文件路径和宏定义 ### IAR EWARM - 工作区:`Project/EWARMv6/Project.www` - 输出文件:`Project/output(iar).hex` ### 编译器宏定义 - `USE_STDPERIPH_DRIVER` — 启用 ST 标准外设库 - `STM32F10X_HD` — 大容量器件(512KB Flash) - `VECT_TAB_SRAM` — 仅用于 RAM 调试目标 ### 栈/堆大小 在启动汇编文件中配置(`Stack_Size EQU 0x00008000`,`Heap_Size EQU 0x00000400`)。 ## 代码架构 ``` Motor/ ├── Bootloader/ # IAP 引导程序(独立工程,基于 ST HAL 库) │ ├── Drivers/ # BSP(LCD、LED、KEY、STMFLASH、数码管) │ ├── Middlewares/ # 第三方库 │ └── User/ # 引导程序应用代码 ├── Libraries/ # ST/ARM 提供的库(不要修改) │ ├── CMSIS/ # ARM CMSIS 头文件 + startup_stm32f103xe.s │ ├── STM32F10x_StdPeriph_Driver/ # 标准外设库 │ └── STM32_USB-FS-Device_Driver/ # USB Device 库 ├── User/ # 应用源代码(主要工作区) │ ├── app/ # 应用层 │ │ ├── src/main.c # 入口、电机控制逻辑、UART 命令解析 │ │ └── inc/main.h # 应用头文件 │ └── bsp/ # 板级支持包(硬件抽象层) │ ├── bsp.c/h # BSP 初始化、周期定时器(1ms/10ms)、空闲循环 │ ├── src/ # BSP 驱动实现 │ └── inc/ # BSP 驱动头文件 ├── Project/ # IDE 工程文件 + 构建输出 │ ├── MDK-ARM/ # Keil MDK 工程 │ ├── EWARMv6/ # IAR EWARM 工作区 │ └── bin_file/ # 生成的二进制文件 └── Doc/ # 文档(中文) ``` ## 关键源文件 | 文件 | 功能 | |------|------| | `User/app/src/main.c` | 主入口、UART 命令解析、电机控制状态机 | | `User/bsp/bsp.c` | 硬件初始化、周期任务分发 | | `User/bsp/src/bsp_step_moto.c` | 步进电机控制(脉冲计数、启动/停止) | | `User/bsp/src/bsp_drv8880.c` | DRV8880 电机驱动接口 | | `User/bsp/src/bsp_tim_pwm.c` | 定时器 PWM 生成电机脉冲 | | `User/bsp/src/bsp_usart_dma.c` | UART + DMA 串口通信 | | `User/bsp/src/bsp_digital_tube.c` | 数码管(7 段)显示 | | `User/bsp/src/bsp_key.c` | 按键扫描和键值处理 | | `User/bsp/src/bsp_beep.c` | 蜂鸣器音调生成 | ## UART 命令接口 通过 USART1(PA9/PA10,115200 波特率)通信。支持的命令: | 命令 | 功能 | |------|------| | `?` | 获取当前位置角度 | | `s` | 停止电机 | | `z` | 将当前位置设为零点 | | `MF` | 打印系统信息 | | `[r:频率:角度]` | 以指定转速旋转到绝对角度 | | `[rr:频率:角度]` | 以指定转速旋转相对角度 | 常量:`MAX_SPEED = 400`,`STEP_PER_LAP = 8461`(每转步数)。 ## BSP 架构 BSP 采用周期定时器驱动模型: - `bsp_RunPer1ms()` — 每 1ms 调用一次(数码管刷新) - `bsp_RunPer10ms()` — 每 10ms 调用一次(按键扫描、蜂鸣器处理) - `bsp_Idle()` — 在主循环空闲时调用 `bsp.h` 是所有 BSP 模块的统一入口。应用程序只需 `#include "bsp.h"`。 ## Bootloader(独立工程) 位于 `Bootloader/`,是一个基于 STM32 HAL 库的 IAP 引导程序(主应用使用 StdPeriph 库,两者不同)。通过 UART 接收固件并烧录到 0x08008000。作为独立的 Keil 工程构建,位于 `Bootloader/Projects/` 下。 ## 注意事项 - 源文件使用 GBK/中文编码 — 在 UTF-8 编辑器中可能显示乱码 - 工程中积累了多个用户的重复 `.uvgui` 文件 — 可忽略 - `Bootloader/keilkill.bat` 用于清理 Keil 临时文件 - `CopyHex_Flash.bat` 用于复制编译生成的 hex 文件 - `Libraries/` 目录是厂商提供的代码,应避免修改 - 主应用使用 StdPeriph 库;Bootloader 使用 HAL 库 — 两者是独立的代码体系