配置 PWM ADC LCD
This commit is contained in:
69
AGENTS.md
69
AGENTS.md
@@ -9,6 +9,10 @@ STM32CubeMX 生成的项目,使用 **Keil MDK-ARM V5.32** 工具链。
|
||||
- `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 字库
|
||||
|
||||
## 硬件配置
|
||||
- **MCU**: STM32F103C8T6 (LQFP48, 72MHz, 64KB Flash, 20KB RAM)
|
||||
@@ -19,42 +23,45 @@ STM32CubeMX 生成的项目,使用 **Keil MDK-ARM V5.32** 工具链。
|
||||
- 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 触发
|
||||
|
||||
## MultiButton 按键库
|
||||
- **来源**: [0x1abin/MultiButton](https://github.com/0x1abin/MultiButton)
|
||||
- **功能**: 事件驱动型按键驱动,支持单击、双击、长按、连击等事件
|
||||
- **文件**:
|
||||
- `Drivers/BSP/MultiButton/multi_button.c/.h` — 核心库文件
|
||||
- `Drivers/BSP/MultiButton/button_driver.c/.h` — 本项目适配层
|
||||
- **定时器**: SysTick 中断中每5ms调用 `button_ticks()`
|
||||
- **使用示例**:
|
||||
## 初始化顺序(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
|
||||
```
|
||||
|
||||
## ADC 采坑记录(不可从 CubeMX 重新生成时光靠设置)
|
||||
- **ADC 时钟**: SystemClock_Config 初始为 PCLK2/2=36MHz(超 14MHz 规格),必须在 `USER CODE SysInit` 中手动改为 `/6`:
|
||||
```c
|
||||
/* 在回调函数中处理按键事件 */
|
||||
static void button_key1_callback(Button* handle, void* user_data) {
|
||||
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
|
||||
printf("KEY1: LED翻转\n");
|
||||
}
|
||||
|
||||
/* 初始化时注册回调 */
|
||||
button_attach(&btn_handle, BTN_SINGLE_CLICK, button_key1_callback, NULL);
|
||||
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。
|
||||
|
||||
## printf 无 MicroLIB
|
||||
在 `usart.c` 中通过 `#pragma import(__use_no_semihosting)` + 提供 `_sys_exit()` + `struct __FILE` + `FILE __stdout` 实现。Keil 取消勾选 Use MicroLIB 即可。
|
||||
|
||||
## SPI 注意事项
|
||||
- LCD (ST7735S) 使用**硬件SPI2**(PB13 SCK, PB15 MOSI),18MHz,**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`
|
||||
- ASCII `_` 下划线手动设为 `0x7F`(GDI 无法可靠提取)
|
||||
- 输出目录 `MDK-ARM\STM32F103C8T6\` 已 gitignore
|
||||
|
||||
## 代码规范
|
||||
- **遵循**: `嵌入式C语言代码规范(V1.0).md`
|
||||
- **缩进**: 4个空格,禁止Tab
|
||||
- **命名**:
|
||||
- 变量/函数: 小写+下划线,全局变量`g_`前缀,静态变量`s_`前缀,指针`p_`前缀
|
||||
- 宏/常量: 大写+下划线,模块名前缀
|
||||
- 类型: 小写+下划线+`_t`后缀
|
||||
- **注释**: 关键逻辑每行注释,函数必须完整注释(功能/参数/返回值/说明)
|
||||
- **大括号**: 所有if/for/while必须加大括号,左大括号同行,右大括号单独行
|
||||
- **命名**: 小写+下划线;全局加 `g_`,静态加 `s_`,指针加 `p_`;宏大写+下划线;类型 `_t` 后缀
|
||||
- **注释**: 所有文档、注释、提交信息使用**中文**
|
||||
- **禁止**: goto、递归、可变参数函数、注释掉的代码提交
|
||||
|
||||
## 语言要求
|
||||
- 所有文档、注释、提交信息必须使用**中文**
|
||||
|
||||
## 重要说明
|
||||
- `Drivers/` 目录包含 HAL 驱动源码 — 禁止直接修改
|
||||
- 通过 CubeMX `.ioc` 文件重新生成代码,禁止手动修改 HAL 文件
|
||||
- Keil 构建输出在 `MDK-ARM/STM32F103C8T6/`(已 gitignore)
|
||||
- CubeMX 生成的代码中,自定义代码必须放在 `/* USER CODE BEGIN */` 和 `/* USER CODE END */` 之间
|
||||
- **CubeMX 代码**: 自定义代码必须在 `/* USER CODE BEGIN */` 和 `/* USER CODE END */` 之间;`Drivers/` 下 HAL 源码禁止直接修改
|
||||
|
||||
Reference in New Issue
Block a user