# 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 驱动 ## 硬件配置 - **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 - 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 ## 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()` - **使用示例**: ```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); ``` ## 代码规范 - **遵循**: `嵌入式C语言代码规范(V1.0).md` - **缩进**: 4个空格,禁止Tab - **命名**: - 变量/函数: 小写+下划线,全局变量`g_`前缀,静态变量`s_`前缀,指针`p_`前缀 - 宏/常量: 大写+下划线,模块名前缀 - 类型: 小写+下划线+`_t`后缀 - **注释**: 关键逻辑每行注释,函数必须完整注释(功能/参数/返回值/说明) - **大括号**: 所有if/for/while必须加大括号,左大括号同行,右大括号单独行 - **禁止**: goto、递归、可变参数函数、注释掉的代码提交 ## 语言要求 - 所有文档、注释、提交信息必须使用**中文** ## 重要说明 - `Drivers/` 目录包含 HAL 驱动源码 — 禁止直接修改 - 通过 CubeMX `.ioc` 文件重新生成代码,禁止手动修改 HAL 文件 - Keil 构建输出在 `MDK-ARM/STM32F103C8T6/`(已 gitignore) - CubeMX 生成的代码中,自定义代码必须放在 `/* USER CODE BEGIN */` 和 `/* USER CODE END */` 之间