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 新建工程
  1. 打开STM32CubeMX,点击「File → New Project」
  2. 搜索「STM32F103C8Tx」,选中后点击「Start Project」
  3. 在「Project Manager」界面,设置项目名称(如"LED_Blink"),选择工具链为「MDK-ARM」
4.1.2 时钟树配置(HCLK=72MHz)
  1. 进入「RCC → High Speed Clock (HSE)」,选择「Crystal/Ceramic Resonator」
  2. 点击「Clock Configuration」标签,配置时钟:
    • HSE输入频率:8MHz
    • PLL倍频系数:×9
    • AHB Prescaler:/1
    • APB1 Prescaler:/2
    • APB2 Prescaler:/1
  3. 验证HCLK=72MHz,点击「Apply」
    在这里插入图片描述
4.1.3 GPIO引脚配置
  1. 在引脚图中右键点击PA1,选择「GPIO_Output」
  2. 左侧「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 生成工程代码
  1. 点击「Project Manager」→「Code Generator」(!!!注意:Project Manager中的Toolchain/IDE要选择MDK-ARM
  2. 勾选「Generate peripheral initialization as a pair of ‘.c/.h’ files per peripheral」
  3. 点击「GENERATE CODE」,生成完成后点击「Open Project」

4.2 Keil5代码编写与编译

4.2.1 代码逻辑设计

main.cwhile(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_SETGPIO_PIN_RESET交换位置。

4.2.3 工程编译与HEX文件生成
  1. 点击Keil工具栏「Build」(或按F7),编译工程
  2. 验证编译结果:输出窗口显示「0 Error(s), 0 Warning(s)」
  3. 点击「Rebuild」或使用快捷键「F7」重新编译
  4. 编译成功后,在项目目录的MDK-ARM文件夹下生成.hex文件

4.3 Proteus9仿真电路搭建与验证

4.3.1 新建仿真工程
  1. 打开Proteus 9,点击「File → New Project」
  2. 命名项目并选择存储路径
  3. 选择「Create a schematic from the selected template」
4.3.2 添加仿真元件

在元件库(P)中搜索并添加:

  • STM32F103C8(主控芯片)
  • LED-BLUE(蓝色LED)
  • RES(电阻,10Ω)
  • POWER(电源,3.3V)
  • GROUND(地)
4.3.3 电路连接

按以下顺序连接电路:

  1. 电源部分:

    • 3.3V电源连接STM32的VDD、VDDA引脚
    • GND连接STM32的VSS、VSSA引脚
    • 添加0.1uF电容到VDD和GND之间(可选,提高稳定性)
  2. LED电路:

    3.3V → LED正极 → LED负极 → 电阻R1(10Ω) → PA1引脚
    
4.3.4 加载程序与仿真运行
  1. 双击STM32F103C8芯片,打开属性窗口:
    • 「Program File」:选择Keil生成的.hex文件
    • 「Clock Frequency」:设置为8MHz(与STM32CubeMX中HSE输入频率一致)
  2. 点击Proteus左下角「Run Simulation」按钮
  3. 观察LED是否按30ms周期闪烁

4.4 常见问题与解决方法

  1. LED不亮

    • 检查电阻值是否太小(建议仿真用10Ω,实际用220Ω)
    • 验证GPIO初始化代码是否正确
    • 检查电路连接是否正确
  2. 编译错误

    • 检查Keil工程配置,确保选择正确的芯片型号
    • 确保所有头文件路径正确
  3. 仿真运行失败

    • 检查Proteus中STM32的时钟频率设置
    • 验证HEX文件路径是否正确

五、实验结果

  1. 工程配置验证:STM32CubeMX生成的初始化代码无配置冲突
  2. 代码编译验证:Keil5编译无错误警告,HEX文件生成正常
  3. 仿真功能验证:Proteus仿真电路中,LED以60ms周期稳定闪烁
  4. 实际硬件验证(可选):开发板上LED闪烁频率与仿真结果一致

六、实验总结与拓展

6.1 核心知识点总结

  • STM32CubeMX配置:时钟树配置、GPIO模式选择
  • Keil开发流程:工程管理、代码编写、编译调试
  • Proteus仿真:电路搭建、程序加载、功能验证
  • GPIO控制:推挽输出模式、电平控制、延时函数使用

6.2 工程思维培养

通过本实验,掌握了嵌入式开发的标准流程:

需求分析 → 硬件设计 → 软件配置 → 代码编写 → 仿真验证 → 硬件调试

6.3 拓展练习

  1. 多LED控制:添加PB0、PB1引脚控制多个LED
  2. 流水灯效果:实现LED依次点亮的效果
  3. 按键控制:添加按键控制LED开关
  4. 定时器中断:使用TIM2定时器中断替代HAL_Delay()
  5. 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电平
  }
}

七、资源下载


版权声明:本文为原创教程,转载请注明出处。适用于嵌入式初学者学习使用,如有疑问可在评论区留言讨论。

注意事项

  1. 实际硬件开发时注意电源极性,避免短路
  2. LED限流电阻选择要合理,防止电流过大损坏LED或MCU引脚
  3. 仿真与实物可能存在差异,建议先用仿真验证逻辑,再上实物调试

更新日志

  • V1.0 初始版本:基础GPIO控制LED闪烁
  • V1.1 更新说明:添加实际硬件连接注意事项

联系作者:如有技术问题,可在CSDN博客留言或私信联系。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐