Files
STM32F103/AGENTS.md

70 lines
3.9 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 读写(字节/页/连续,自动跨页)
- `STM32F103C8T6/User/` — 用户应用代码
- `menu.c/h` — 菜单系统LCD参数显示、按键调节、EEPROM存储
## 硬件配置
- **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 → MX_I2C1
→ button_driver_init() → st7735s_init() → lcd_* draw
→ TIM3 PWM start (PA6~PB1) → TIM4 Base start (TRGO→ADC) → ADC injected start
→ AT24C02 scan → menu_init()
```
## CubeMX 生成代码注意事项
- **TIM4_TRGO**: CubeMX 已正确生成 `TIM_TRGO_UPDATE``tim.c:125`),无需手动写寄存器。若从 `.ioc` 重新生成,检查 `sMasterConfig.MasterOutputTrigger` 是否仍为 `TIM_TRGO_UPDATE`
- **ADC 时钟**: CubeMX 已通过 HAL 配置 `RCC_ADCPCLK2_DIV6``adc.c:221`),无需手动改 `RCC->CFGR`。若重新生成,验证 `PeriphClkInit.AdcClockSelection` 是否为 `RCC_ADCPCLK2_DIV6`(必须 ≤14MHz
- **SPI2 模式**: CubeMX 已配置 Mode 3CPOL=HIGH, CPHA=2EDGE`spi.c:45-46`。重新生成时确认 `CLKPolarity=HIGH, CLKPhase=2EDGE`
## printf 无 MicroLIB
`usart.c` 的 USER CODE 区通过 `#pragma import(__use_no_semihosting)` + `_sys_exit()` + `_ttywrch()` + `struct __FILE` + `FILE __stdout` 实现。Keil 取消勾选 Use MicroLIB 即可。
## LCD 字库生成tools/font_gen.py
- Python + Pillow使用 `python font_gen.py`Windows 下默认系统 Python
- **仅生成 CJK 字库**ASCII 字库 `lcd_data.c` 已手动维护
- CJK 16×16按需
```
python tools/font_gen.py --cjk --string "你的汉字" --output STM32F103C8T6/Drivers/BSP/LCD/hz16_data
```
- 默认参数:`--font simsun --size 48 --scale 3`Otsu 自适应阈值
- CJK 无等宽替代字体,必须用 simsun
- ASCII `_` 下划线手动设为 `0x7F`GDI 无法可靠提取)
## 代码规范
- **遵循**: `嵌入式C语言代码规范V1.0.md`
- **缩进**: 4个空格禁止Tab
- **命名**: 小写+下划线;全局加 `g_`,静态加 `s_`,指针加 `p_`;宏大写+下划线;类型 `_t` 后缀
- **注释**: 所有文档、注释、提交信息使用**中文**
- **禁止**: goto、递归、可变参数函数、注释掉的代码提交
- **CubeMX 代码**: 自定义代码必须在 `/* USER CODE BEGIN */` 和 `/* USER CODE END */` 之间;`Drivers/` 下 HAL 源码禁止直接修改