菜单支持,所有功能都测试成功

This commit is contained in:
2026-07-15 15:39:49 +08:00
parent d4112399c2
commit 92facadeb0
16 changed files with 908 additions and 447 deletions

View File

@@ -15,6 +15,8 @@ STM32CubeMX 生成的项目,使用 **Keil MDK-ARM V5.32** 工具链。
- `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)
@@ -33,39 +35,30 @@ STM32CubeMX 生成的项目,使用 **Keil MDK-ARM V5.32** 工具链。
## 初始化顺序main.c
```
HAL_Init → SystemClock_Config → MX_GPIO → MX_DMA → MX_USART1 → MX_SPI2
→ MX_TIM4 → MX_ADC1 → MX_TIM3
→ 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()
```
## 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
## 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 即可。
## 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`
- 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 无法可靠提取)
- 输出目录 `MDK-ARM\STM32F103C8T6\` 已 gitignore
## 代码规范
- **遵循**: `嵌入式C语言代码规范V1.0.md`