# stm32_code_learning **Repository Path**: amespaces/stm32_code_learning ## Basic Information - **Project Name**: stm32_code_learning - **Description**: STM32全流程练习, 开发板采用某硅谷的咸鱼STM32F103ZE - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-22 - **Last Updated**: 2026-07-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # STM32F103 嵌入式开发实验项目 ## 项目简介 本项目是一个基于STM32F103ZET6微控制器的嵌入式开发学习项目,采用寄存器操作方式(非HAL库)进行外设驱动开发。项目包含多个实验,从基础的GPIO控制到串口通信、I2C协议等,逐步深入学习STM32的底层开发。 ## 开发环境 - **开发板**: STM32-F103ZET6 - **开发工具**: Keil MDK-ARM - **调试器**: ST-Link - **编程语言**: C语言 - **开发方式**: 寄存器操作(非HAL库) ## 项目结构 ``` embeddingProject/ ├── 01_led_register/ # 实验1:点亮三个LED灯 ├── 02_led_flow_register/ # 实验2:流水灯效果 ├── 03_key_led_register/ # 实验3:按键控制LED ├── 04_usart_register/ # 实验4:串口轮询通信 ├── 05_usart_interupt_register/ # 实验5:串口中断通信 ├── 06_i2c_register/ # 实验6:I2C协议通信 ├── ex03_key_led_onoff_register/ # 扩展实验3:按键开关灯 ├── ex04_key_led_flow_register/ # 扩展实验4:按键控制流水灯 ├── ex05_manual_key_flow_register/ # 扩展实验5:手动按键控制流水灯 ├── 1-STM32F10x-中文参考手册_最新.pdf # STM32参考手册 └── STM32-F103ZET6开发板.pdf # 开发板原理图 ``` ## 实验说明 ### 实验1:点亮三个LED灯 (`01_led_register`) - **功能**: 通过寄存器操作点亮PA0、PA1、PA8引脚连接的三个LED灯 - **知识点**: GPIO时钟使能、GPIO工作模式配置、输出电平控制 - **关键代码**: 配置GPIO为推挽输出模式,设置输出低电平点亮LED ### 实验2:流水灯效果 (`02_led_flow_register`) - **功能**: 实现三个LED灯的往返流水灯效果 - **知识点**: GPIO输出控制、延时函数、循环控制 - **关键代码**: 使用Driver_LED驱动库,循环控制LED亮灭 ### 实验3:按键控制LED (`03_key_led_register`) - **功能**: 通过外部按键控制LED灯 - **知识点**: GPIO输入配置、按键检测、外部中断 - **关键代码**: 配置按键引脚为下拉输入,检测按键状态 ### 实验4:串口轮询通信 (`04_usart_register`) - **功能**: 通过USART1实现串口数据的发送和接收 - **知识点**: USART外设配置、GPIO复用功能、波特率设置 - **关键代码**: 配置PA9(TX)和PA10(RX)为串口功能,实现轮询方式数据收发 ### 实验5:串口中断通信 (`05_usart_interupt_register`) - **功能**: 通过USART1中断方式实现串口数据收发 - **知识点**: USART中断配置、NVIC中断控制器、中断服务函数 - **关键代码**: 配置RXNE和IDLE中断,实现中断方式数据接收 ### 实验6:I2C协议通信 (`06_i2c_register`) - **功能**: 实现I2C协议通信(开发中) - **知识点**: I2C协议原理、GPIO模拟I2C时序 - **关键代码**: I2C驱动框架搭建 ### 扩展实验3:按键开关灯 (`ex03_key_led_onoff_register`) - **功能**: 通过KEY1按键控制LED3的开关 - **知识点**: 外部中断配置、按键消抖、状态控制 - **关键代码**: 配置PF10为外部中断,检测按键按下状态 ### 扩展实验4:按键控制流水灯 (`ex04_key_led_flow_register`) - **功能**: 通过KEY3按键控制流水灯的启动和停止 - **知识点**: 中断与主循环协同、状态机控制 - **关键代码**: 使用isON标志位控制流水灯状态 ### 扩展实验5:手动按键控制流水灯 (`ex05_manual_key_flow_register`) - **功能**: 通过KEY4按键手动控制流水灯,每按一次切换一个LED亮 - **知识点**: 状态机设计、枚举类型使用、中断状态管理 - **关键代码**: 定义FLOW_STATUS枚举,实现状态转移逻辑 ## 硬件说明 ### LED连接 - LED1: PA0 - LED2: PA1 - LED3: PA8 ### 按键连接 - KEY1: PF10(扩展实验3) - KEY3: PF10(扩展实验4) - KEY4: PF11(扩展实验5) ### 串口连接 - USART1_TX: PA9 - USART1_RX: PA10 - 波特率: 115200 ## 驱动架构 ### LED驱动 (`Driver_LED`) - `Driver_LED_Init()`: 初始化LED GPIO - `Driver_LED_On(led)`: 点亮指定LED - `Driver_LED_Off(led)`: 关闭指定LED - `Driver_LED_Toggle(led)`: 翻转LED状态 - `Driver_LED_OnAll(leds, size)`: 点亮所有LED - `Driver_LED_OffAll(leds, size)`: 关闭所有LED ### 按键驱动 (`Driver_key`) - `Driver_Key_Init()`: 初始化按键GPIO和外部中断 - 中断服务函数: `EXTI15_10_IRQHandler()` ### 串口驱动 (`Driver_USART`) - `Driver_USART1_Init()`: 初始化USART1 - `Driver_USART1_SendChar(byte)`: 发送单个字节 - `Driver_USART1_SendString(str, len)`: 发送字符串 - `Driver_USART1_ReceiveChar()`: 接收单个字节 - `Driver_USART1_ReceiveString(buff, len)`: 接收字符串 ### 延时函数 (`Delay`) - `Delay_us(us)`: 微秒延时 - `Delay_ms(ms)`: 毫秒延时 - `Delay_s(s)`: 秒延时 ## 使用方法 1. **硬件准备** - 连接ST-Link调试器到开发板 - 连接串口调试助手到USART1(可选) 2. **软件开发** - 使用Keil MDK打开对应的.uvprojx工程文件 - 编译工程:Project → Build Target - 下载程序:Flash → Download 3. **调试运行** - 使用Debug模式进行单步调试 - 观察LED状态变化 - 通过串口调试助手查看通信数据 ## 学习路径 建议按照以下顺序学习本项目: 1. **GPIO基础** → 实验1、2 2. **中断系统** → 实验3、扩展实验3、4、5 3. **串口通信** → 实验4、5 4. **I2C协议** → 实验6 ## 注意事项 1. 本项目采用寄存器操作方式,需要参考STM32F10x参考手册 2. 所有实验基于STM32F103ZET6开发板,其他型号开发板需要调整引脚配置 3. 串口通信需要配置正确的波特率和数据格式 4. 外部中断需要注意消抖处理,避免误触发 ## 参考资料 - STM32F10x中文参考手册 - STM32-F103ZET6开发板原理图 - ARM Cortex-M3权威指南 ## 作者 朱威煌 ## 许可证 本项目仅用于学习目的。