proteus仿真STM32过程
·
使用 Proteus 和 CubeMX 仿真 STM32 单片机(LED 闪烁)
准备工具:
- Proteus 仿真软件(确保已安装 STM32 库)
- STM32CubeMX
- Keil MDK(或其他 C 编译器,本例使用 MDK)
第一部分:新建 Proteus 工程并测试环境
首先,我们新建一个工程并测试一下仿真环境是否正常工作。
-
新建工程:
- 打开 Proteus,点击 “New Project”。
- 输入项目名称(例如
STM32_Sim_01)并选择一个保存路径(例如桌面)。 - 接下来的步骤一路点击 “Next”,保持默认设置(默认原理图、无 PCB 布局等),最后点击 “Finish”。
-
搭建简单测试电路:
- 在左侧工具栏点击 “Component Mode”,然后点击 “P” 按钮(Pick Devices)。
- 搜索并添加以下元件:
RES(电阻)LED-YELLOW(黄色 LED,黄色比较显眼)
- 在左侧工具栏点击 “Terminals Mode”,添加:
POWER(电源)GND(接地)
- 将元件拖拽到原理图中,按照
POWER->电阻->LED->GND的顺序连接起来。 - 双击电阻,将其阻值(Resistance)从默认的
10k修改为较小的值,例如330或500欧姆(330Ω330\Omega330Ω)。(10k 阻值太大,LED 可能无法点亮)。
-
运行仿真:
- 点击左下角的 “Play”(运行)按钮。
- 如果一切正常,应该能看到黄色的 LED 被点亮。这证明你的 Proteus 仿真功能是正常的。
- 点击 “Stop”(停止)按钮,删除这些测试元件。
第二部分:搭建 STM32 仿真电路
现在,我们来搭建 STM32 的核心电路。
-
添加 STM32 芯片:
- 点击 “P” 按钮,搜索
STM32F103R6。 - 选择
STM32F103R6(通常是 LQFP64 封装)并将其放置在原理图中心。
- 点击 “P” 按钮,搜索
-
连接电源和接地:
- 单片机需要供电才能工作。添加
POWER和GND端子。
- 单片机需要供电才能工作。添加
-
连接 LED 电路:
- 我们要做一个 LED 闪烁的例子。添加
RES(电阻)和LED-YELLOW(LED)。 - 将电路连接如下:
PA4引脚 ->电阻->LED->POWER (+3.3V)。 - 注意电路逻辑: 这是一个"共阳极"接法。LED 的阳极接到了 3.3V 电源。因此,当
PA4引脚输出**低电平(0V)**时,LED 才会点亮;输出高电平(3.3V)时,LED 熄灭。 - 同样,将电阻阻值改为
330或500欧姆(500Ω500\Omega500Ω)。
- 我们要做一个 LED 闪烁的例子。添加
此时,Proteus 中的硬件电路就搭建完成了。
第三部分:使用 STM32CubeMX 生成代码
接下来,我们需要为 STM32 编写程序。我们使用 CubeMX 来生成基础工程。
-
新建 CubeMX 工程:
- 打开 STM32CubeMX。
- 点击 “ACCESS TO MCU SELECTOR”。
- 在搜索框中输入
STM32F103R6,在下方列表中选择STM32F103R6Tx(T 代表 LQFP64 封装),双击启动工程。
-
配置系统时钟 (RCC):
- 在左侧
Pinout & Configuration视图中,展开System Core,点击RCC。 - 在
High Speed Clock (HSE)下拉菜单中,选择Crystal/Ceramic Resonator(使用外部晶振)。
- 在左侧
-
配置 GPIO 引脚:
- 在右侧的芯片引脚图中,找到
PA4。 - 左键点击
PA4,在弹出的菜单中选择GPIO_Output(通用输出模式)。
- 在右侧的芯片引脚图中,找到
-
配置时钟树:
- 切换到
Clock Configuration选项卡。 - 在
Input frequency处(HSE 晶振频率)输入8(MHz)。 - 在
HCLK (MHz)的输入框中,直接输入72并按回车。CubeMX 会自动解算并配置锁相环(PLL),使系统主频达到 72MHz。
- 切换到
-
生成工程:
- 切换到
Project Manager选项卡。 - 输入
Project Name(例如STM32_Blink)。 - 选择
Project Location(选择一个空文件夹)。 - 在
Toolchain / IDE下拉菜单中,选择MDK-ARM(即 Keil)。 - 点击右上角的
GENERATE CODE。
- 切换到
第四部分:在 Keil 中编写代码并编译
CubeMX 帮我们生成了 Keil 工程,我们现在来添加闪烁逻辑。
-
打开工程:
- 代码生成后,点击
Open Project,系统会自动用 Keil 打开工程。
- 代码生成后,点击
-
定位到主循环:
- 在左侧
Project窗口中,展开Application/User,双击打开main.c文件。 - 向下滚动,找到
while(1)循环。
- 在左侧
-
添加闪烁代码:
- 为了防止代码在 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提供一个简单的延时。
- 为了防止代码在 CubeMX 重新生成时被覆盖,我们必须在
-
生成
.hex文件:- 在 Keil 中,点击 “Options for Target…” 按钮(魔术棒图标)。
- 切换到
Output选项卡。 - 勾选
Create HEX File。这是 Proteus 仿真所必需的。 - 点击 “OK”。
-
编译工程:
- 点击 “Build”(或按 F7)按钮。
- 等待编译完成,确保 “Error(s): 0”(没有错误)。
第五部分:加载程序并运行仿真
最后一步,我们将编译好的程序加载到 Proteus 中。
-
返回 Proteus:
- 在 Proteus 的原理图中,双击
STM32F103R6芯片。 - 会弹出一个 “Edit Component”(编辑元件)窗口。
- 在 Proteus 的原理图中,双击
-
加载 .hex 文件:
- 在
Program File字段,点击文件夹图标。 - 导航到您刚刚的 Keil 工程目录,进入
MDK-ARM/STM32_Blink/文件夹(STM32_Blink是您的工程名)。 - 选择
.hex文件(例如STM32_Blink.hex)。 - 点击 “OK”。
- 在
-
运行仿真:
- 点击 Proteus 左下角的 “Play”(运行)按钮。
仿真结果:
你将看到连接到 PA4 引脚的黄色 LED 开始闪烁,大约每 300 毫秒亮灭一次。
第六部分:常见问题排错
问:为什么我的 LED 一直亮或一直灭,或者只闪了一下就停了?
答: 最大的可能是你将代码写错了位置。
- 错误位置: 如果你将
HAL_GPIO_TogglePin和HAL_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)的整个闭环。你可以在此基础上,尝试添加更多外设(如串口、定时器、传感器)进行更复杂的仿真。
更多推荐



所有评论(0)