【STM32仿真】STM32CubeMX+Keil+Proteus单片机仿真

2023-11-07


  博主最近进行单片机的仿真,本篇文章主要利用了STM32CubeMX、Keil和Proteus三个软件,为后期的硬件打下基础。文章主要目的是学习软件的使用和单片机的仿真。

  本文是我在学习proteus软件和STM32CubeMX过程当中的心得和学习笔记,在学习时已经有C, C++的基础。文章附上了学习的代码,仅供大家参考。如果有问题,有错误欢迎大家留言。

  此外,博主还有另外几篇文章,分别关于Python基础知识Python的具体应用C语言指针结构体的难点C++入门和进阶知识点C++高阶知识点,大家点击即可翻阅。

一、软件介绍和下载安装

1.1 STM32CubeMX介绍

  从15-16年开始,意法半导体公司(ST)逐渐停止了对SPL标准外设库的更新和维护,转向了HAL和LL库。对于STM32CubeMX的学习主要是学习HAL库,HAL库是ST公司为STM32的MCU最新推出的抽象层嵌入式软件,为更方便的实现跨STM32产品的最大可移植性,HAL库推出的同时,也加入了很多第三方的中间件,有RTOS,USB,TCP / IP和图形等等。

  • SPL :Standard Peripheral Library 标准外设库
  • HAL:Hardware Abstraction Layer 硬件抽象层库
  • LL:Low-layer 底层库
      STM32CubeMX是一个图形化的软件配置工具,在这种软件中,用户可以通过图形化的操作,完成初始化代码工程。生成的工程是一个可以正常编译的完整工程,使用的时候只需要添加上用户的代码即可。接下来我们创建第一个仿真项目,点亮LED灯

参考了别的博主的博客和B站视频

1.2 Proteus介绍

Proteus软件是英国Lab Center Electronics公司出版的电子设计自动化(Electronic design automation,EDA)工具软件。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是比较好的仿真单片机及外围器件的工具。虽然国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。
Proteus是英国著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。是世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DSPIC33、AVR、ARM、8086和MSP430等,2010年又增加了Cortex和DSP系列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持IAR、Keil和MATLAB等多种编译器。
——百度百科

  proteus功能很强大,它是一个合成了PCB设计、电路仿真、虚拟模型仿真为一体的电子设计自动化软件。具体的软件安装可以参考别的博主的文章,这里不在细述,Proteus8.9 下载与安装教程

二、创建第一个项目

2.1 STM32CubeMX生成代码

  第一步,新建一个项目,在搜索栏中输入本次要使用的仿真硬件,这里是STM32F103C8,属于比较常见的一种单片机。然后,双击搜索结果中出现的项目。第二步将Pinout & Configuration -> system core -> SYS -> Debug 改为Serial Wire, Pinout & Configuration -> system core -> RCC -> High Speed Clock(HSE)和Low Speed Clock(LSE)全部改为Crystal/Ceramic Resonator。最后在图形界面将GPIO口的PA5改为output(双击)。

在这里插入图片描述

  第三步,将Clock Configuration中的HCLK时钟改为72MHz(最高时钟频率),如图所示。

在这里插入图片描述

  第四步,Project Maneger中将项目名称修改为LED,修改保存路径,修改设备型号和版本。最后在Code Generator中将生成.c和.h文件的选项打钩,点击生成代码,就可以在路径底下生成一个工程代码。到这一步为止,我们就生成了.c和.h文件,但是它是不能在单片机上运行的,要生成单片机能够运行的.hex文件还需要keil的帮助。

在这里插入图片描述

2.2 keil5 生成可执行文件

  第五步,在生成的项目文件当中,找到MDK-ARM文件底下的.uvprojx文件,使用keil打开,这里博主使用的keil5。如图所示,输入如下代码,因为小灯闪烁的频率非常快,肉眼观察不到,因此我们加上延时函数。编译运行,生成.hex文件,HEX文件是一种能够烧写到单片机中,被单片机执行的文件格式。代码部分到此就完毕了。这里需要注意的是,我们用户的代码最好写在两个USER CODE注释的中间,这样如果需要用STM32CubeMX改写代码时就不会改变我们写的代码,而写到其他地方去的代码会被覆盖

		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);
		HAL_Delay(200);
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);
		HAL_Delay(200);

在这里插入图片描述

2.3 Proteus 搭建简单电路

  第六步,在Proteus中,点击新建项目,步骤参考自手把手教你上手Proteus。项目建好之后点击P,可以查找元器件。博主的Proteus版本太低,找不到C8,就用C6替代了,效果一样的。我们依次找到LED,电阻。

在这里插入图片描述
在这里插入图片描述

  电源和地在这个图标中可以找到。

在这里插入图片描述

  最终电路图如图所示,点击运行就小灯就闪烁起来了,至此第一个项目就完成了。

在这里插入图片描述

  如果出现下面的错误,就是电网布置错误了,Design -> Configure Power Rails -> Power Rails -> Name, 在GND中将VDDA和VSSA移除,VDDA和VSSA添加到VCC/VDD中,点击OK,重新运行即可

在这里插入图片描述
在这里插入图片描述

三、按键开发

  如图所示,我们打开在STM32CubeMX创建的第一个项目(以.ioc结尾的文件),将管脚改成如下所示,其中PB7、PB8为输出,PC13、PB5、PB1为输入,GPIO设置为pull-up。这个主要用来区分GPIO口用于输入还是输出如果是输出,那么选择no-pull-up and no-pull-down,如果是input,那么需要看具体应用的默认输入值是0还是1,如果默认是输入0,则最好配置为pull down,反之则配置为pull up。这里我们根据实际电路设置,我们的仿真电路默认输入为高电平,为1, 因此设置为pull-up。
在这里插入图片描述

  在keil中修改代码,可以使用宏定义简化代码。按键的两个引脚的一端通过电阻上拉到高电平,另一端则接地。在没有按键按下的时候,输入引脚为高电平,当有按键按下,输入引脚则为低电平。单片机通过反复读取按键输入引脚的信号,然后识别高低电平来判断是否有按键触发。

  按键的输入引脚有低电平产生不一定是按键按下引起的,有可能是干扰信号。因此,按键需要进行防抖操作处理。首次检测到按键输入引脚有低电平后,稍作延时,再次读取该引脚,如还是低电平,则确认为按键触发信号;否则,判断为干扰信号,不予处理。然后我们在主函数循环当中调用Scan_Keys()函数。注意以下代码都要写在用户代码注释之间。

// 宏定义,简化代码
#define KEY2 HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)		
#define KEY3 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)
#define KEY4 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_5)
void Scan_Keys()
{
	// 默认为高电平1,如果输入为0,则检测到一次按键输入
    if(KEY2 == GPIO_PIN_RESET)		
    {
        HAL_Delay(5);		// 防抖,按钮不按下,排除电源不稳等等误判因素
        if(KEY2 == GPIO_PIN_RESET)
        {
						// 确认按下之后,立刻翻转直至按钮松开
            HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);		
            while(KEY2 == GPIO_PIN_RESET);	
        }
    }
    if(KEY3 == RESET)
    {
        HAL_Delay(5);
        if(KEY3 == RESET)
        {
						// 按下之后,直至按钮松开,再进行翻转操作
            while(KEY3 == RESET);
            HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
        }
    }
    if(KEY4 == 0)		// RESET可以用0代替
    {
        HAL_Delay(5);
        if(KEY4 == 0)
        {
						// 对两个GPIO口同时操作
            HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9|GPIO_PIN_8,GPIO_PIN_RESET);
            while(KEY2 == 0);
        }
    }
}

四、中断和定时器开发

持续更新~

end

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【STM32仿真】STM32CubeMX+Keil+Proteus单片机仿真 的相关文章

随机推荐

  • 解决Python中的循环引用和内存泄漏问题

    在Python编程中 循环引用和内存泄漏是两个常见的问题 本文将详细介绍如何识别和解决这些问题 并提供详细的代码示例 1 什么是循环引用 循环引用是指两个或多个对象之间相互引用的情况 这种情况可能导致内存泄漏 因为Python的垃圾回收机制
  • 数据治理体系建设

    01 数据治理建设路径 1 业务数字化的目的是打造一体化的业务流 信息流与数据流 从企业整体经营管理的角度 战略制定及分解 领域业务目标制定 业务方案设计 业务需求识别 信息系统功能及数据库设计 数据汇聚及分析 业务目标监测及改善 这个过程
  • 图片在网页能打开,小程序上不显示的解决方法

    这种情况可能是图片被小程序自动加上了防盗链 导致显示不出来 解决方案 1 在img标签是上加属性 referrerPolicy no referrer
  • 使用VS Code打造Python编程与Markdown写作利器,打破知乎、WordPress和微信公众号的壁垒

    目录 1 前言 2 安装与环境搭建 2 1 VS Code安装 2 2 VS Code常用快捷键 2 3 打造Python编辑器 2 4 打造Markdown编辑器 3 一些技巧 3 1 更舒适的Python编程环境 3 2 Markdow
  • oracle数据库中选择桌面类和服务器类的区别

    在以前的学习过程中 一直用到的都是sql server数据库 之后接触到了oracle数据库 在安装过程中 有两个选项 桌面类和服务器类 当时按照网上的安装步骤 选择了桌面类 后来公司里他们安装都是用的服务器类 后来查了查两者的区别 桌面类
  • 【MyBatis】resultMap和resultType的区别

    mybatis中resultMap和resultType的区别 mybatis中在查询进行select映射的时候 返回类型可以用resultType 也可以用resultMap resultType是直接表示返回类型的 而resultMap
  • 使用jira的sprint面板进行敏捷开发——scrum master笔记(待完善)

    一 jira中sprint面板的创建 这个很简单 键入jira后 顶栏处找 面板 查看全部面板 此时页面右上侧有 创建面板 的按钮 点击 选择 创建一个Scrum面板 根据提示填信息到完成即可 二 jira中sprint面板的配置 点击进入
  • 如何清除win7系统中的开机密码

    设置系统的开机密码是很正常的事情 当然 忘记开机密码也是常有的事情 下面的方法是通过PE盘清除win7的卡机密码 首先 看一下我的电脑是有密码的 有密码的机器 二 PE盘的准备 我用的pe是we 这是我用过的最良心的PE环境 关于PE的安装
  • java查找算法:二分查找(两种方式)

    二分查找算法思想 二分查找针对的是一个有序的数据集合也就是数组 这也成为了二分查找的一个重要局限性 查找思想有点类似分治思想 每次都通过跟区间的中间元素对比 将待查找的区间缩小为之前的一半 直到找到要查找的元素 或者区间被缩小为0 一 返回
  • Cocos Creator 3D 梦想再起航!

    在 Cocos 不算长的生命历程中 我们曾多次尝试给开发者带来 3D 游戏的开发能力 2014 年 我们的 3D 团队开辟了 Cocos2d x 对 3D 的支持 至今已孵化出莉莉丝的 剑与家园 腾讯的 乱世王者 这样的超级大作 同时 Co
  • Skywalking web页面空白问题解决

    问题描述 今天微服务报错想用链路id追踪这个服务的流向 发现skywalking页面空白 查看后台进程发现skywalking oap server服务掉了 重启还是不行 tail n500 skywalking oap server lo
  • Python实现飞机大战游戏(后附完整代码文件和素材)

    前言 自学Python的记录 不喜勿喷 本程序的代码是以B站黑马程序员的视频代码为基础 个人加以总结思考 写就的博文 纯属记录自己的学习历程 当初想到要用Python的pygame模块开发飞机大战游戏的时候 顿时就兴奋了 毕竟学以致用是最好
  • 网络自动化运维(NetDevOps)创作者推荐

    前言 随着NetDevOps技术登上了历史舞台 越来越多的从业者开始利用NetDevOps简化网络的运维 并进行了技术分享 将蛋糕越做越大 在这里 仅代表个人对这些无私奉献的网络 运维工程师们表达由衷的敬意 此外 我也想向大家推荐一些我认识
  • 【Java】POJO

    POJO Plain Ordinary Java Object 简单的Java对象 通指没有使用Entity Beans的普通java对象 可以把POJO作为支持业务逻辑的协助类 POJO实质上可理解为简单的实体类 顾名思义 POJO类的作
  • 深夜更新,C语言笔记整理

    C 语言笔记整理 C语言一经出现就以其功能丰富 表达能力强 灵活方便 应用面广等特点迅速在全世界普及和推广 C语言不但执行效率高而且可移植性好 可以用来开发应用软件 驱动 操作系统等 C语言也是其它众多高级语言的鼻祖语言 所以说学习C语言是
  • GLFW初体验

    GLFW初体验 GLFW 很遗憾 没有找到FW的确切含义 Wiki上没有 GLFW主页也没有 猜测F表示for W表示Window GLFW是干啥用的 一个轻量级的 开源的 跨平台的library 支持OpenGL及OpenGL ES 用来
  • Tengine/nginx配置https/ssl/443端口健康检查

    这里列出 nginx upstream check module 模块所支持的指令意思 Syntax check interval milliseconds fall count rise count timeout millisecond
  • k8s学习-CKS真题-ImagePolicyWebhook容器镜像扫描

    目录 题目 环境搭建 imagePolicyWebhook搭建 解题 任务二 任务三 任务一 检查 模拟考题 参考 题目 Context cluster上设置了容器镜像扫描器 但尚未完全集成到 cluster 的配置中 完成后 容器镜像扫描
  • 函数作业(2023.1.4)

    函数作业 1 计算数组中完数的个数 完数 除本身约数和等于本身 例如6 1 23 1 2 3 6 例如28 1 2 4 7 14 28 在该函数 void PerfectFun int arr int n 循环数组每一个值 在该函数 int
  • 【STM32仿真】STM32CubeMX+Keil+Proteus单片机仿真

    文章目录 一 软件介绍和下载安装 1 1 STM32CubeMX介绍 1 2 Proteus介绍 二 创建第一个项目 2 1 STM32CubeMX生成代码 2 2 keil5 生成可执行文件 2 3 Proteus 搭建简单电路 三 按键