STM32F103C8 GPIO输出控制LED周期性闪烁实验
摘要:本实验基于STM32F103C8芯片,通过STM32CubeMX配置GPIO输出模式,使用Keil5编写LED闪烁控制程序,并在Proteus中完成仿真验证。实验详细介绍了从工程创建、时钟配置、GPIO初始化到代码编写、编译生成HEX文件的全过程,并提供了仿真电路搭建方法。实验结果表明,LED能按30ms周期稳定闪烁,验证了GPIO输出控制的正确性。该实验为嵌入式开发入门基础实践,涵盖工具链
·
STM32F103C8 GPIO输出控制LED周期性闪烁实验(STM32CubeMX+Keil5+Proteus仿真)
一、实验概述
1.1 实验目的
- 掌握STM32CubeMX工程创建、时钟配置、外设初始化流程
- 理解STM32的GPIO输出模式工作原理与配置方法
- 学会使用Keil MDK-ARM进行代码编写、编译与HEX文件生成
- 掌握Proteus搭建STM32仿真电路并验证功能
1.2 实验意义
本实验是嵌入式开发入门核心实践,涵盖"工具配置-工程搭建-代码实现-仿真验证"全流程,为后续复杂外设开发奠定基础。
二、实验环境与硬件准备
2.1 软件环境
- 操作系统:Windows 10/11
- 开发工具:STM32CubeMX 6.9.0+、Keil MDK-ARM 5.37+、Proteus 9 Professional
- 目标芯片:STM32F103C8Tx(LQFP48封装)
2.2 硬件清单(仿真/实际均可)
- 主控芯片:STM32F103C8Tx
- LED灯:1-2个
- 限流电阻:10Ω或220Ω(仿真可用10Ω,实际硬件建议220Ω)
- 电源:3.3V直流电源(加电源即可,只是示例)
- 辅助工具:面包板、杜邦线(实际硬件调试用)

三、实验原理
3.1 GPIO输出模式原理
STM32F103的GPIO支持多种工作模式,本实验选用推挽输出模式(Output Push Pull):
- 引脚可输出高电平(3.3V)或低电平(0V)
- 驱动能力强,适用于直接驱动LED等小型负载
- 配置参数:输出电平、上下拉电阻、输出速度
3.2 硬件连接逻辑
仿真电路连接方式:
- LED正极接3.3V电源,负极串联限流电阻后接STM32的PA1引脚
- 当PA1输出低电平时,LED导通发光;输出高电平时,LED截止熄灭
实际硬件连接方式:
- LED负极接STM32的PA1引脚,正极串联限流电阻后接3.3V电源
- 当PA1输出高电平时,LED导通发光;输出低电平时,LED截止熄灭
四、实验步骤
4.1 STM32CubeMX工程创建与配置
4.1.1 新建工程
- 打开STM32CubeMX,点击「File → New Project」
- 搜索「STM32F103C8Tx」,选中后点击「Start Project」
- 在「Project Manager」界面,设置项目名称(如"LED_Blink"),选择工具链为「MDK-ARM」
4.1.2 时钟树配置(HCLK=72MHz)
- 进入「RCC → High Speed Clock (HSE)」,选择「Crystal/Ceramic Resonator」
- 点击「Clock Configuration」标签,配置时钟:
- HSE输入频率:8MHz
- PLL倍频系数:×9
- AHB Prescaler:/1
- APB1 Prescaler:/2
- APB2 Prescaler:/1
- 验证HCLK=72MHz,点击「Apply」

4.1.3 GPIO引脚配置
- 在引脚图中右键点击PA1,选择「GPIO_Output」
- 左侧「System Core」→「GPIO」,配置PA1参数:
- GPIO output level:Low(默认输出低电平)
- GPIO mode:Output Push Pull
- GPIO Pull-up/Pull-down:No pull-up and no pull-down
- Maximum output speed:Low


4.1.4 生成工程代码
- 点击「Project Manager」→「Code Generator」(!!!注意:Project Manager中的Toolchain/IDE要选择MDK-ARM)
- 勾选「Generate peripheral initialization as a pair of ‘.c/.h’ files per peripheral」
- 点击「GENERATE CODE」,生成完成后点击「Open Project」
4.2 Keil5代码编写与编译
4.2.1 代码逻辑设计
在main.c的while(1)循环中添加代码,实现LED周期性闪烁:
- 亮30ms → 灭30ms → 循环
4.2.2 核心代码(添加位置)
打开main.c文件,找到while(1)循环部分,添加以下代码:
/* USER CODE BEGIN WHILE */
while (1)
{
/* 输出高电平,LED熄灭(仿真电路)*/
/* 输出低电平,LED点亮(实际硬件)*/
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
HAL_Delay(30); // 延时30ms
/* 输出低电平,LED点亮(仿真电路)*/
/* 输出高电平,LED熄灭(实际硬件)*/
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
HAL_Delay(30); // 延时30ms
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
注意:如果使用实际硬件,需要将GPIO_PIN_SET和GPIO_PIN_RESET交换位置。
4.2.3 工程编译与HEX文件生成
- 点击Keil工具栏「Build」(或按F7),编译工程
- 验证编译结果:输出窗口显示「0 Error(s), 0 Warning(s)」
- 点击「Rebuild」或使用快捷键「F7」重新编译
- 编译成功后,在项目目录的
MDK-ARM文件夹下生成.hex文件
4.3 Proteus9仿真电路搭建与验证
4.3.1 新建仿真工程
- 打开Proteus 9,点击「File → New Project」
- 命名项目并选择存储路径
- 选择「Create a schematic from the selected template」
4.3.2 添加仿真元件
在元件库(P)中搜索并添加:
STM32F103C8(主控芯片)LED-BLUE(蓝色LED)RES(电阻,10Ω)POWER(电源,3.3V)GROUND(地)
4.3.3 电路连接
按以下顺序连接电路:
-
电源部分:
- 3.3V电源连接STM32的VDD、VDDA引脚
- GND连接STM32的VSS、VSSA引脚
- 添加0.1uF电容到VDD和GND之间(可选,提高稳定性)
-
LED电路:
3.3V → LED正极 → LED负极 → 电阻R1(10Ω) → PA1引脚
4.3.4 加载程序与仿真运行
- 双击STM32F103C8芯片,打开属性窗口:
- 「Program File」:选择Keil生成的
.hex文件 - 「Clock Frequency」:设置为8MHz(与STM32CubeMX中HSE输入频率一致)
- 「Program File」:选择Keil生成的
- 点击Proteus左下角「Run Simulation」按钮
- 观察LED是否按30ms周期闪烁
4.4 常见问题与解决方法
-
LED不亮:
- 检查电阻值是否太小(建议仿真用10Ω,实际用220Ω)
- 验证GPIO初始化代码是否正确
- 检查电路连接是否正确
-
编译错误:
- 检查Keil工程配置,确保选择正确的芯片型号
- 确保所有头文件路径正确
-
仿真运行失败:
- 检查Proteus中STM32的时钟频率设置
- 验证HEX文件路径是否正确
五、实验结果
- 工程配置验证:STM32CubeMX生成的初始化代码无配置冲突
- 代码编译验证:Keil5编译无错误警告,HEX文件生成正常
- 仿真功能验证:Proteus仿真电路中,LED以60ms周期稳定闪烁
- 实际硬件验证(可选):开发板上LED闪烁频率与仿真结果一致
六、实验总结与拓展
6.1 核心知识点总结
- STM32CubeMX配置:时钟树配置、GPIO模式选择
- Keil开发流程:工程管理、代码编写、编译调试
- Proteus仿真:电路搭建、程序加载、功能验证
- GPIO控制:推挽输出模式、电平控制、延时函数使用
6.2 工程思维培养
通过本实验,掌握了嵌入式开发的标准流程:
需求分析 → 硬件设计 → 软件配置 → 代码编写 → 仿真验证 → 硬件调试
6.3 拓展练习
- 多LED控制:添加PB0、PB1引脚控制多个LED
- 流水灯效果:实现LED依次点亮的效果
- 按键控制:添加按键控制LED开关
- 定时器中断:使用TIM2定时器中断替代
HAL_Delay() - PWM调光:使用PWM控制LED亮度
6.4 进阶代码示例(定时器中断方式)
// 在main.c中添加以下代码
// 开启定时器中断
HAL_TIM_Base_Start_IT(&htim2);
// 定时器中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM2)
{
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1); // 翻转PA1电平
}
}
七、资源下载
版权声明:本文为原创教程,转载请注明出处。适用于嵌入式初学者学习使用,如有疑问可在评论区留言讨论。
注意事项:
- 实际硬件开发时注意电源极性,避免短路
- LED限流电阻选择要合理,防止电流过大损坏LED或MCU引脚
- 仿真与实物可能存在差异,建议先用仿真验证逻辑,再上实物调试
更新日志:
- V1.0 初始版本:基础GPIO控制LED闪烁
- V1.1 更新说明:添加实际硬件连接注意事项
联系作者:如有技术问题,可在CSDN博客留言或私信联系。
更多推荐
所有评论(0)