78 lines
4.2 KiB
Markdown
78 lines
4.2 KiB
Markdown
# 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 PWM(PA6 CH1, PA7 CH2, PB0 CH3, PB1 CH4)
|
||
- TIM4: 仅做 ADC 触发源,TRGO=Update 输出至 ADC1(1kHz,无引脚占用)
|
||
- 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 3(CPOL=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 无法可靠提取)
|
||
|
||
## 中文字符串转义(tools/to_escape.py)
|
||
将中文转为 C 语言 UTF-8 十六进制转义序列,用于在 C 源码中嵌入中文字符串:
|
||
```
|
||
python tools/to_escape.py 阜阳师范大学
|
||
# 输出: \xE9\x98\x9C\xE9\x98\xB3\xE5\xB8\x88\xE8\x8C\x83\xE5\xA4\xA7\xE5\xAD\xA6
|
||
```
|
||
也可不带参数运行,交互式输入。
|
||
|
||
## 代码规范
|
||
- **遵循**: `嵌入式C语言代码规范(V1.0).md`
|
||
- **缩进**: 4个空格,禁止Tab
|
||
- **命名**: 小写+下划线;全局加 `g_`,静态加 `s_`,指针加 `p_`;宏大写+下划线;类型 `_t` 后缀
|
||
- **注释**: 所有文档、注释、提交信息使用**中文**
|
||
- **禁止**: goto、递归、可变参数函数、注释掉的代码提交
|
||
- **CubeMX 代码**: 自定义代码必须在 `/* USER CODE BEGIN */` 和 `/* USER CODE END */` 之间;`Drivers/` 下 HAL 源码禁止直接修改
|