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

68 lines
3.6 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 字库
## 硬件配置
- **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
- 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
- TIM4: PB6~9 四路 1kHz PWM
- TIM3: CH4 内部触发 ADC1 注入组
- ADC1: IN0~IN3 (PA0~PA3), 注入组, TIM3_CH4 触发
## 初始化顺序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 → PWM start → ADC 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;
```
- **TIM3_CH4 触发 ADC**: CubeMX 默认生成 `TIM_OCMODE_TIMING`,这不会产生 OC4REF 上升沿 → ADC 收不到触发。必须在 `tim.c` 中手动改为 `TIM_OCMODE_PWM1` + `Pulse = 500`。CubeMX 需选 CH4 为 "PWM Generation4 No Output" 并设 Pulse=500。
## printf 无 MicroLIB
在 `usart.c` 中通过 `#pragma import(__use_no_semihosting)` + 提供 `_sys_exit()` + `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 源码禁止直接修改