驱动所有外设

This commit is contained in:
2026-07-14 18:17:00 +08:00
parent 2d0d000a38
commit d4112399c2
51 changed files with 126956 additions and 143 deletions

View File

@@ -13,6 +13,8 @@ STM32CubeMX 生成的项目,使用 **Keil MDK-ARM V5.32** 工具链。
- `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)
@@ -20,18 +22,20 @@ STM32CubeMX 生成的项目,使用 **Keil MDK-ARM V5.32** 工具链。
- **外设**:
- 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
- TIM4: PB6~9 四路 1kHz PWM
- TIM3: CH4 内部触发 ADC1 注入组
- ADC1: IN0~IN3 (PA0~PA3), 注入组, TIM3_CH4 触发
- 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 → PWM start → ADC start
→ button_driver_init() → st7735s_init() → lcd_* draw
→ TIM3 PWM start (PA6~PB1) → TIM4 Base start (TRGO→ADC) → ADC injected start
```
## ADC 采坑记录(不可从 CubeMX 重新生成时光靠设置)
@@ -39,10 +43,15 @@ HAL_Init → SystemClock_Config → MX_GPIO → MX_DMA → MX_USART1 → MX_SPI2
```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。
- **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` 通过 `#pragma import(__use_no_semihosting)` + 提供 `_sys_exit()` + `struct __FILE` + `FILE __stdout` 实现。Keil 取消勾选 Use 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