# learnStm32 **Repository Path**: strex/learn-stm32 ## Basic Information - **Project Name**: learnStm32 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-11-19 - **Last Updated**: 2025-11-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # STM32F103C8T6 按键控制LED项目 使用寄存器方式实现的STM32F103C8T6按键控制LED功能,包含详细的注释说明。 ## 项目特性 - **寄存器编程**: 直接操作STM32寄存器,不依赖HAL库 - **按键功能**: 支持短按检测、长按检测、按键消抖 - **LED控制**: LED开关控制、状态指示、闪烁模式 - **系统时钟**: 配置为72MHz最大频率 - **完整注释**: 每个函数和关键代码都有详细中文注释 ## 硬件连接 ### STM32F103C8T6开发板引脚分配 | 功能 | 引脚 | 说明 | |------|------|------| | LED | PC13 | 板载LED (低电平点亮) | | 按键 | PA0 | 外部按键 (上拉输入,低电平有效) | ### 电路连接 ``` LED (PC13) -- [LED] -- GND 按键 (PA0) -- [按键] -- GND PA0 -- [10K上拉电阻] -- 3.3V ``` ## 功能说明 ### 按键操作 1. **短按 (< 1秒)**: 切换LED开关状态 - LED关闭 → LED开启 - LED开启 → LED关闭 2. **长按 (> 1秒)**: 进入LED闪烁模式 - LED闪烁5次后恢复静态状态 ### 系统启动 - 系统启动时LED闪烁3次表示就绪 - 等待按键输入 ## 文件结构 ``` stm32f103c8t6/ ├── main.c # 主程序文件 ├── main.h # 头文件定义 ├── system_stm32f10x.c # 系统配置文件 ├── startup_stm32f10x_md.s # 启动文件 ├── stm32f103c8t6.ld # 链接脚本 ├── Makefile # 编译脚本 └── README.md # 项目说明 ``` ## 编译和烧录 ### 环境要求 - **编译工具**: GNU ARM Embedded Toolchain ```bash # Ubuntu/Debian sudo apt-get install gcc-arm-none-eabi # macOS (使用Homebrew) brew install arm-none-eabi-gcc ``` - **烧录工具**: OpenOCD 或 ST-LINK工具 ```bash # Ubuntu/Debian sudo apt-get install openocd stlink-tools # macOS brew install openocd stlink ``` ### 编译步骤 ```bash # 克隆或下载项目到本地 cd stm32f103c8t6 # 编译项目 make # 检查编译结果 make info # 烧录到开发板 (使用OpenOCD) make flash # 或使用ST-LINK工具 make flash-stlink ``` ### 其他编译选项 ```bash # 清理编译文件 make clean # 重新编译 make rebuild # 生成调试版本 make debug-build # 生成发布版本 make release # 检查代码语法 make syntax-check # 格式化代码 make format # 显示帮助 make help ``` ## 代码说明 ### 主要寄存器操作 #### GPIO配置 ```c // 使能GPIOC时钟 RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; // 配置PC13为推挽输出,2MHz GPIOC->CRH &= ~(GPIO_CRH_MODE13 | GPIO_CRH_CNF13); GPIOC->CRH |= GPIO_CRH_MODE13_1; ``` #### 按键检测 ```c // 配置PA0为上拉输入 RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; GPIOA->CRL &= ~(GPIO_CRL_MODE0 | GPIO_CRL_CNF0); GPIOA->CRL |= GPIO_CRL_CNF0_1; GPIOA->ODR |= GPIO_ODR_ODR0; // 使能上拉 ``` #### LED控制 ```c // LED开启 (低电平) GPIOC->BSRR = GPIO_BSRR_BR13; // LED关闭 (高电平) GPIOC->BSRR = GPIO_BSRR_BS13; ``` #### 系统时钟配置 ```c // 启用HSE并配置PLL为9倍频 (8MHz * 9 = 72MHz) RCC->CR |= RCC_CR_HSEON; while(!(RCC->CR & RCC_CR_HSERDY)); RCC->CFGR |= RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL9; RCC->CR |= RCC_CR_PLLON; ``` ### 按键处理流程 1. **按键扫描**: 检测按键状态变化 2. **消抖处理**: 20ms消抖时间避免误触发 3. **长按检测**: 超过1秒判定为长按 4. **短按检测**: 50ms-1秒之间判定为短按 ### 时序图 ``` 按键按下 ────┐ ┌───────── │ │ └────────────┘ 消抖检测 ────┐──────┐ │ │ └──────┘ 短按判断 ────┐──────────────┐ │ │ └──────────────┘ < 1秒 > 1秒(长按) ``` ## 调试说明 ### 使用GDB调试 ```bash # 启动GDB调试 make debug # GDB命令示例 (gdb) target remote localhost:3333 (gdb) load (gdb) continue ``` ### 常见问题 1. **编译错误**: 检查ARM工具链是否正确安装 2. **烧录失败**: 检查ST-LINK连接和驱动 3. **程序不运行**: 检查时钟配置和引脚连接 ## 扩展功能 可以在此基础上添加更多功能: - **多按键支持**: 扩展更多GPIO按键 - **PWM调光**: 使用定时器实现LED亮度调节 - **串口通信**: 添加USART通信功能 - **低功耗模式**: 实现睡眠和待机模式 - **看门狗**: 添加系统监控功能 ## 许可证 本项目仅供学习和参考使用。 ## 作者 AI Assistant 版本: v1.0 日期: 2025-11-19