草庐IT

01-CubeMx+Keil+Proteus仿真STM32(最小系统)

Sheepeach 2023-03-28 原文

源代码:https://github.com/LanLinnet/STM32F103R6

硬件搭建

  1. 打开Proteus,这里使用的是8.9版本,点击新建工程。
  2. 在弹出的窗口中填写工程名和保存路径,其他设置都不变,点击“下一步”直到完成即可。
  3. 在工程窗口中点击“P”图标,打开“Pick Devices”窗口,在“Keywords”中输入“STM32F103”,可以看到Proteus中能进行仿真的STM32F103芯片,这里我们选择“STM32F103R6”,双击即可将芯片添加到“DEVICES”栏。注意这里可以仿真的芯片有哪些,后面我们在Keil或CubeMX中构建时,应该选择Proteus中能仿真的芯片。
  4. 按照上面的步骤再添加一些元件,DEVICES列表如图所示。
  5. 画最小系统,包括复位电路、HSE、BOOT电路,因为在Proteus中进行仿真,所以我们不需要单独再画电源电路。最小系统如图所示。

    6.接下来需要配置供电网。点击“设计--配置供电网”,在弹出的窗口中,将“VSSA”加入“GND”,“VDDA”加入“VCC/VDD”,并将其电压改为“3.3”v。






软件编写

软件编写在“标准外设库(STD)的下载与迁移”和“HAL/LL库”中选择其中一种方式即可。“HAL库”更加简单快捷。

标准外设库(STD)的下载与迁移

20220613更新:官网上好像找不到该固件库了,已上传至GitHub,需要可自行下载。

  1. 下载固件库,在Overview窗口选择STM32F103R6
  2. 在新窗口中点击“Tools & Software”,点击“Quick links”中的“MCU & MPU Embedded Software”,找到“STSW-STM32054”并点击。

  3. 在新窗口中点击"Get latest"下载。
  4. 下载后会得到文件如下
  5. 我们新建一个文件夹用来存放迁移的STD库,文件夹中再新建四个文件夹(CORE、FWLIB、SYSTEM、USER)如下图所示
  6. 一些复制粘贴工作
  7. 在USER文件夹中再建立一个文件夹Project,用来存放后面要建立的工程。
  8. 打开Keil软件,点击“Project→New uvision Project”,将项目的存放位置选择在Keil/USER/Project文件夹。在弹出的窗口“Search”栏输入“STM32F103R6”,选中芯片,点击“OK”。
  9. 在弹出的“Manage Run-Time Environment”窗口中,直接点击“OK”即可。
  10. 进入项目后,点击图中“Manage Project Items”图标,在弹出的窗口中先点击添加新Groups如图所示。随后点击“Add Files”将上面迁移的文件夹中的文件都依次添加到对应的Group中,添加完毕点击“OK”即可。


    注意:由于这里使用的是STM32F103R6芯片,属于低ROM容量芯片,所以在“FWLIB”组中仅需要保留一个“startup_stm32f10x_ld.s”文件即可。若使用其它芯片,要注意选择LD、MD、HD。
  11. 点击“Options for Target”按钮,选择“Output”选项卡,勾选“Create HEX File”选项

    点击“C/C++”选项卡,在Define栏中输入“USE_STDPERIPH_DRIVER,STM32F10X_LD”(如果是MD或HD就改成对应的名称)

    随后在“Include Paths”中,先点击新建路径,随后将我们前面建立的四个文件夹都添加进去,如下图所示

    点击“OK”确认即可。
  12. 打开“main.c”文件,将其修改如下
    #include "stm32f10x.h"
    #include <stdio.h>
    
    int main(void)
    {
    
      /* Add your application code here
         */
    
      /* Infinite loop */
      while (1)
      {
      }
    }
    
    点击运行

    可以看到运行窗口显示HEX文件已创建,则固件库迁移成功。


HAL库/LL库

  1. 下载HAL库包,下拉页面找到“Get Software”,在“STM32CubeF1”处点击“Get latest”下载最新版本的HAL库包。下载完成后解压并安装。
  2. 打开STM32CubeMX,点击“ACCESS TO MCU SELECTOR”新建工程。
  3. 在弹出的“New Project from a MCU/MPU”窗口“Commercial Part Number”中填入“STM32F103R6”,在右半边的选项中选择对应的STM32芯片,点击“Start Project”。
  4. 点击“Project Manager”,配置工程名和保存路径,在“Toolchain / IDE”中选择“MDK-ARM V5.32”。
  5. 取消勾选“Use Default Firmware Location”,将“Firmware Relative Path”设置为刚刚安装的库文件的位置。
  6. 点击“Code Generator”,按照图中所示配置。
  7. 配置时钟:点击“Pinout & Configuration”,找到“RCC”,将“HSE”设置为“Crystal/Ceramic Resonator”。点击“Clock Configuration”,可根据自己的需要配置时钟频率,图中为一个可以参考的例子。

  8. 最后点击“GENERATE CODE”即可生成工程,点击“Open Project”,会自动使用Keil打开工程。
  9. 与上面STD库中生成HEX文件的方式一样,我们点击运行按钮,可以看到HEX文件成功生成,HEX文件一般存放在“CUBEMX工程文件夹/MDK-ARM/工程名”路径下,如图所示。

联合调试

  1. 在Proteus中,双击STM32F103R6芯片,打开“编辑元件”窗口。
  2. 点击文件夹图标,配置“Program File”为刚刚生成的HEX文件。
  3. 配置“Crystal Frequency”为72MHz,点击确认。
  4. 点击页面左下角的运行按钮,可以看到程序开始运行,且没有报错,表示联合调试成功。

有关01-CubeMx+Keil+Proteus仿真STM32(最小系统)的更多相关文章

  1. 电脑0x0000001A蓝屏错误怎么U盘重装系统教学 - 2

      电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。  准备工作:  1、U盘一个(尽量使用8G以上的U盘)。  2、一台正常联网可使用的电脑。  3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。  4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。  U盘启动盘制作步骤:  注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注

  2. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  3. STM32读取串口传感器数据(颗粒物传感器,主动上传) - 2

    文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,

  4. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  5. ruby - 获取数组中的值并最小化某个类属性的最优雅的方法是什么? - 2

    假设我有以下类(class):classPersondefinitialize(name,age)@name=name@age=ageenddefget_agereturn@ageendend我有一组Person对象。是否有一种简洁的、类似于Ruby的方法来获取最小(或最大)年龄的人?如何根据它对它们进行排序? 最佳答案 这样做会:people_array.min_by(&:get_age)people_array.max_by(&:get_age)people_array.sort_by(&:get_age)

  6. ruby - 在没有基准或时间的情况下用 Ruby 测量用户时间或系统时间 - 2

    因为我现在正在做一些时间测量,我想知道是否可以在不使用Benchmark类或命令行实用程序time的情况下测量用户时间或系统时间。使用Time类只显示挂钟时间,而不显示系统和用户时间,但是我正在寻找具有相同灵active的解决方案,例如time=TimeUtility.now#somecodeuser,system,real=TimeUtility.now-time原因是我有点不喜欢Benchmark,因为它不能只返回数字(编辑:我错了-它可以。请参阅下面的答案。)。当然,我可以解析输出,但感觉不对。*NIX系统的time实用程序也应该可以解决我的问题,但我想知道是否已经在Ruby中实

  7. ruby - 以毫秒为单位获取当前系统时间 - 2

    在Ruby中,以毫秒为单位获取自纪元(1970)以来的当前系统时间的正确方法是什么?我试过了Time.now.to_i,好像不是我想要的结果。我需要结果显示毫秒并且使用long类型,而不是float或double。 最佳答案 (Time.now.to_f*1000).to_iTime.now.to_f显示包含十进制数字的时间。要获得毫秒数,只需将时间乘以1000。 关于ruby-以毫秒为单位获取当前系统时间,我们在StackOverflow上找到一个类似的问题:

  8. ruby-on-rails - 如何构建复杂的 Rails 系统 - 2

    关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭8年前。Improvethisquestion我们有以下(以及更多)系统,我们将数据从一个应用推送/拉取到另一个:托管CRM(InsideSales.com)Asterisk电话系统(内部)横幅广告系统(openx,我们托管)潜在客户生成系统(自行开发)电子商务商店(spree,我们托管)工作板(本土)一些工作网站抓取+入站工作提要电子邮件传送系统(如Mailchimp,自主开发)事件管理系统(如eventbrite,自主开发)仪表板系统(大量图表和

  9. ruby-on-rails - Rails 3,在RAILS_ROOT上方显示来自本地文件系统的jpg图片 - 2

    我正在尝试找出一种方法来显示来自不在RAILS_ROOT下(在RedHat或Ubuntu环境中)的已安装文件系统的图像。我不想使用符号链接(symboliclink),因为这个应用程序实际上是通过Tomcat部署的,而当我关闭Tomcat时,Tomcat会尝试跟随符号链接(symboliclink)并删除挂载中的所有图像。由于这些文件的数量和大小,将图像放在public/images下也不是一种选择。我查看了send_file,但它只会显示一张图片。我需要在一个格式良好的页面中显示6个请求的图像。由于膨胀,我宁愿不使用Base64编码,但我不知道如何将图像数据与呈现的页面一起传递下去。

  10. ruby - 我可以从 Ruby 中的系统调用中获得连续输出吗? - 2

    当您在Ruby脚本中使用系统调用时,您可以像这样获得该命令的输出:output=`ls`putsoutput这就是thisquestion是关于。但是有没有办法显示系统调用的连续输出?例如,如果您运行此安全复制命令,以通过SSH从服务器获取文件:scpuser@someserver:remoteFile/some/local/folder/...它显示随着下载进度的连续输出。但是这个:output=`scpuser@someserver:remoteFile/some/local/folder/`putsoutput...不捕获该输出。如何从我的Ruby脚本中显示正在进行的下载进度?

随机推荐