Files
STM32F103/AGENTS.md
2026-07-14 18:17:00 +08:00

77 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# STM32F103C8T6 项目
## 项目类型
STM32CubeMX 生成的项目,使用 **Keil MDK-ARM V5.32** 工具链。
## 关键文件
- `STM32F103C8T6/STM32F103C8T6.ioc` — CubeMX 配置(引脚、时钟、外设)
- `STM32F103C8T6/Core/Src/main.c` — 应用入口
- `STM32F103C8T6/MDK-ARM/STM32F103C8T6.uvprojx` — Keil 工程文件
- `STM32F103C8T6/Drivers/BSP/MultiButton/` — MultiButton 按键驱动库
- `STM32F103C8T6/Drivers/BSP/LCD/` — ST7735S LCD 驱动
- `st7735s.c/h` — 底层驱动SPI通信、初始化、填充、画点
- `lcd.c/h` — 绘图模块(字符/字符串、线条、矩形、圆形)
- `lcd_data.c/h` — ASCII 8×16 字库
- `hz16_data.c/h` — CJK 16×16 字库
- `STM32F103C8T6/Drivers/BSP/AT24C02/` — AT24C02 EEPROM 驱动
- `at24c02.c/h` — I2C 读写(字节/页/连续,自动跨页)
## 硬件配置
- **MCU**: STM32F103C8T6 (LQFP48, 72MHz, 64KB Flash, 20KB RAM)
- **时钟**: HSE 8MHz → PLL ×9 = 72MHz SYSCLK
- **外设**:
- USART1: PA9 (TX), PA10 (RX) — 异步模式
- SPI2: PB13 (SCK), PB15 (MOSI) — 18MHz, DMA1_Channel5
- I2C1: PB8 (SCL), PB9 (SDA) — AT24C02 EEPROM
- LED: PC13 (低电平有效,上拉)
- 按键: PB3 (KEY1), PB4 (KEY2), PB5 (KEY3), PC14 (KEY4), PC15 (KEY5) — 下拉
- LCD: PB10 (DC), PB11 (CS), PB12 (RST), PB13 (SCK), PB15 (SDA) — ST7735S 128x160
- TIM3: PA6~PB1 四路 1kHz PWMPA6 CH1, PA7 CH2, PB0 CH3, PB1 CH4
- TIM4: 仅做 ADC 触发源TRGO=Update 输出至 ADC11kHz无引脚占用
- ADC1: IN0~IN3 (PA0~PA3), 注入组, TIM4_TRGO 触发
## 初始化顺序main.c
```
HAL_Init → SystemClock_Config → MX_GPIO → MX_DMA → MX_USART1 → MX_SPI2
→ MX_TIM4 → MX_ADC1 → MX_TIM3
→ button_driver_init() → st7735s_init() → lcd_* draw
→ TIM3 PWM start (PA6~PB1) → TIM4 Base start (TRGO→ADC) → ADC injected start
```
## ADC 采坑记录(不可从 CubeMX 重新生成时光靠设置)
- **ADC 时钟**: SystemClock_Config 初始为 PCLK2/2=36MHz超 14MHz 规格),必须在 `USER CODE SysInit` 中手动改为 `/6`
```c
RCC->CFGR = (RCC->CFGR & ~RCC_CFGR_ADCPRE) | RCC_CFGR_ADCPRE_DIV6;
```
- **TIM4_TRGO 触发 ADC当前方案**: CubeMX 中 TIM4 无任何 PWM 通道,生成的 `MasterOutputTrigger` 为 `TIM_TRGO_RESET` → TRGO 无脉冲。必须在 `USER CODE TIM4_Init 2` 中写寄存器:
```c
TIM4->CR2 = (TIM4->CR2 & ~TIM_CR2_MMS) | TIM_CR2_MMS_1; /* TRGO = Update */
```
启动时用 `HAL_TIM_Base_Start(&htim4)` 即可。
- **旧方案(已废弃)**: TIM3_CH4 触发 ADC 已废弃PB8/PB9 改为 I2C
## printf 无 MicroLIB
在 `usart.c` 的 USER CODE 区通过 `#pragma import(__use_no_semihosting)` + `_sys_exit()` + `_ttywrch()` + `struct __FILE` + `FILE __stdout` 实现。Keil 取消勾选 Use MicroLIB 即可。
## SPI 注意事项
- LCD (ST7735S) 使用**硬件SPI2**PB13 SCK, PB15 MOSI18MHz**Mode 3**CPOL=HIGH, CPHA=2EDGE
- 若通过 CubeMX 重新生成 `spi.c`,务必在 SPI2 配置中设置 Clock Polarity=High, Clock Phase=2 Edge
- CS(PB11)、DC(PB10)、RST(PB12) 为 GPIO 控制
## LCD 字库生成tools/font_gen.py
- Python + Pillow 渲染,使用 `C:\ProgramData\anaconda3\python.exe`
- ASCII 8×16默认`python font_gen.py`
- CJK 16×16按需`python font_gen.py --cjk --string "你的汉字" --output STM32F103C8T6/Drivers/BSP/LCD/hz16_data`
- ASCII 默认参数:`--font simsun --size 56 --threshold 64 --scale 4`
- CJK 默认参数:`--font simsun --size 48 --threshold 50 --scale 3`
- ASCII `_` 下划线手动设为 `0x7F`GDI 无法可靠提取)
- 输出目录 `MDK-ARM\STM32F103C8T6\` 已 gitignore
## 代码规范
- **遵循**: `嵌入式C语言代码规范V1.0.md`
- **缩进**: 4个空格禁止Tab
- **命名**: 小写+下划线;全局加 `g_`,静态加 `s_`,指针加 `p_`;宏大写+下划线;类型 `_t` 后缀
- **注释**: 所有文档、注释、提交信息使用**中文**
- **禁止**: goto、递归、可变参数函数、注释掉的代码提交
- **CubeMX 代码**: 自定义代码必须在 `/* USER CODE BEGIN */``/* USER CODE END */` 之间;`Drivers/` 下 HAL 源码禁止直接修改