Files
STM32F103/AGENTS.md
2026-07-15 15:41:46 +08:00

4.2 KiB
Raw Permalink Blame History

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 PWMPA6 CH1, PA7 CH2, PB0 CH3, PB1 CH4
    • TIM4: 仅做 ADC 触发源TRGO=Update 输出至 ADC11kHz无引脚占用
    • ADC1: IN0IN3 (PA0PA3), 注入组, 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_UPDATEtim.c:125),无需手动写寄存器。若从 .ioc 重新生成,检查 sMasterConfig.MasterOutputTrigger 是否仍为 TIM_TRGO_UPDATE
  • ADC 时钟: CubeMX 已通过 HAL 配置 RCC_ADCPCLK2_DIV6adc.c:221),无需手动改 RCC->CFGR。若重新生成,验证 PeriphClkInit.AdcClockSelection 是否为 RCC_ADCPCLK2_DIV6(必须 ≤14MHz
  • SPI2 模式: CubeMX 已配置 Mode 3CPOL=HIGH, CPHA=2EDGEspi.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.pyWindows 下默认系统 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 3Otsu 自适应阈值
    • CJK 无等宽替代字体,必须用 simsun
  • ASCII _ 下划线手动设为 0x7FGDI 无法可靠提取)

中文字符串转义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 源码禁止直接修改