驱动所有外设
This commit is contained in:
21
AGENTS.md
21
AGENTS.md
@@ -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 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
|
||||
→ 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 MOSI),18MHz,**Mode 3**(CPOL=HIGH, CPHA=2EDGE)
|
||||
|
||||
Reference in New Issue
Block a user