使用 Proteus 和 CubeMX 仿真 STM32 单片机(LED 闪烁)

准备工具:

  1. Proteus 仿真软件(确保已安装 STM32 库)
  2. STM32CubeMX
  3. Keil MDK(或其他 C 编译器,本例使用 MDK)

第一部分:新建 Proteus 工程并测试环境

首先,我们新建一个工程并测试一下仿真环境是否正常工作。

  1. 新建工程:

    • 打开 Proteus,点击 “New Project”。
    • 输入项目名称(例如 STM32_Sim_01)并选择一个保存路径(例如桌面)。
    • 接下来的步骤一路点击 “Next”,保持默认设置(默认原理图、无 PCB 布局等),最后点击 “Finish”。
  2. 搭建简单测试电路:

    • 在左侧工具栏点击 “Component Mode”,然后点击 “P” 按钮(Pick Devices)。
    • 搜索并添加以下元件:
      • RES(电阻)
      • LED-YELLOW(黄色 LED,黄色比较显眼)
    • 在左侧工具栏点击 “Terminals Mode”,添加:
      • POWER(电源)
      • GND(接地)
    • 将元件拖拽到原理图中,按照 POWER -> 电阻 -> LED -> GND 的顺序连接起来。
    • 双击电阻,将其阻值(Resistance)从默认的 10k 修改为较小的值,例如 330500 欧姆(330Ω330\Omega330Ω)。(10k 阻值太大,LED 可能无法点亮)。
  3. 运行仿真:

    • 点击左下角的 “Play”(运行)按钮。
    • 如果一切正常,应该能看到黄色的 LED 被点亮。这证明你的 Proteus 仿真功能是正常的。
    • 点击 “Stop”(停止)按钮,删除这些测试元件。

第二部分:搭建 STM32 仿真电路

现在,我们来搭建 STM32 的核心电路。

  1. 添加 STM32 芯片:

    • 点击 “P” 按钮,搜索 STM32F103R6
    • 选择 STM32F103R6(通常是 LQFP64 封装)并将其放置在原理图中心。
  2. 连接电源和接地:

    • 单片机需要供电才能工作。添加 POWERGND 端子。
  3. 连接 LED 电路:

    • 我们要做一个 LED 闪烁的例子。添加 RES(电阻)和 LED-YELLOW(LED)。
    • 将电路连接如下:PA4 引脚 -> 电阻 -> LED -> POWER (+3.3V)
    • 注意电路逻辑: 这是一个"共阳极"接法。LED 的阳极接到了 3.3V 电源。因此,当 PA4 引脚输出**低电平(0V)**时,LED 才会点亮;输出高电平(3.3V)时,LED 熄灭。
    • 同样,将电阻阻值改为 330500 欧姆(500Ω500\Omega500Ω)。

此时,Proteus 中的硬件电路就搭建完成了。


第三部分:使用 STM32CubeMX 生成代码

接下来,我们需要为 STM32 编写程序。我们使用 CubeMX 来生成基础工程。

  1. 新建 CubeMX 工程:

    • 打开 STM32CubeMX。
    • 点击 “ACCESS TO MCU SELECTOR”。
    • 在搜索框中输入 STM32F103R6,在下方列表中选择 STM32F103R6Tx(T 代表 LQFP64 封装),双击启动工程。
  2. 配置系统时钟 (RCC):

    • 在左侧 Pinout & Configuration 视图中,展开 System Core,点击 RCC
    • High Speed Clock (HSE) 下拉菜单中,选择 Crystal/Ceramic Resonator(使用外部晶振)。
  3. 配置 GPIO 引脚:

    • 在右侧的芯片引脚图中,找到 PA4
    • 左键点击 PA4,在弹出的菜单中选择 GPIO_Output(通用输出模式)。
  4. 配置时钟树:

    • 切换到 Clock Configuration 选项卡。
    • Input frequency 处(HSE 晶振频率)输入 8(MHz)。
    • HCLK (MHz) 的输入框中,直接输入 72 并按回车。CubeMX 会自动解算并配置锁相环(PLL),使系统主频达到 72MHz。
  5. 生成工程:

    • 切换到 Project Manager 选项卡。
    • 输入 Project Name(例如 STM32_Blink)。
    • 选择 Project Location(选择一个空文件夹)。
    • Toolchain / IDE 下拉菜单中,选择 MDK-ARM(即 Keil)。
    • 点击右上角的 GENERATE CODE

第四部分:在 Keil 中编写代码并编译

CubeMX 帮我们生成了 Keil 工程,我们现在来添加闪烁逻辑。

  1. 打开工程:

    • 代码生成后,点击 Open Project,系统会自动用 Keil 打开工程。
  2. 定位到主循环:

    • 在左侧 Project 窗口中,展开 Application/User,双击打开 main.c 文件。
    • 向下滚动,找到 while(1) 循环。
  3. 添加闪烁代码:

    • 为了防止代码在 CubeMX 重新生成时被覆盖,我们必须在 USER CODE BEGIN ...USER CODE END ... 注释块之间编写代码。
    • while(1) 循环内的 /* USER CODE BEGIN 3 *//* USER CODE END 3 */ 之间,添加以下两行代码:
    /* USER CODE BEGIN 3 */
    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_4);  // 翻转 PA4 引脚的电平
    HAL_Delay(300);                        // 延时 300 毫秒
    /* USER CODE END 3 */
    
    • HAL_GPIO_TogglePin 会自动将引脚电平从高变低,或从低变高。
    • HAL_Delay 提供一个简单的延时。
  4. 生成 .hex 文件:

    • 在 Keil 中,点击 “Options for Target…” 按钮(魔术棒图标)。
    • 切换到 Output 选项卡。
    • 勾选 Create HEX File。这是 Proteus 仿真所必需的。
    • 点击 “OK”。
  5. 编译工程:

    • 点击 “Build”(或按 F7)按钮。
    • 等待编译完成,确保 “Error(s): 0”(没有错误)。

第五部分:加载程序并运行仿真

最后一步,我们将编译好的程序加载到 Proteus 中。

  1. 返回 Proteus:

    • 在 Proteus 的原理图中,双击 STM32F103R6 芯片。
    • 会弹出一个 “Edit Component”(编辑元件)窗口。
  2. 加载 .hex 文件:

    • Program File 字段,点击文件夹图标。
    • 导航到您刚刚的 Keil 工程目录,进入 MDK-ARM/STM32_Blink/ 文件夹(STM32_Blink 是您的工程名)。
    • 选择 .hex 文件(例如 STM32_Blink.hex)。
    • 点击 “OK”。
  3. 运行仿真:

    • 点击 Proteus 左下角的 “Play”(运行)按钮。

仿真结果:
你将看到连接到 PA4 引脚的黄色 LED 开始闪烁,大约每 300 毫秒亮灭一次。


第六部分:常见问题排错

问:为什么我的 LED 一直亮或一直灭,或者只闪了一下就停了?

答: 最大的可能是你将代码写错了位置。

  • 错误位置: 如果你将 HAL_GPIO_TogglePinHAL_Delay 写在了 while(1) 循环的外面(例如,写在了 /* USER CODE BEGIN 2 */ 区域)。
  • 原因: main 函数只会从上到下执行一次。程序进入 while(1)(主循环)后,就再也不会执行循环之前的代码了。如果您的代码在循环外,它只会被执行一次(LED 翻转一次),然后程序就 “卡” 在空的 while(1) 循环里,导致 LED 停止变化。
  • 解决方法: 确保闪烁代码一定写在 while(1) 循环内部/* USER CODE BEGIN 3 *//* USER CODE END 3 */ 之间。

结论

通过以上步骤,我们完成了从硬件电路设计(Proteus)、底层代码生成(CubeMX)到应用逻辑编写(Keil)再到仿真验证(Proteus)的整个闭环。你可以在此基础上,尝试添加更多外设(如串口、定时器、传感器)进行更复杂的仿真。

Logo

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

更多推荐