# 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 库 — 两者是独立的代码体系
