STM32CubeMX+Keil5+Proteus实现按键控制LED灯(入门篇)

2023-10-27

本文说明

学生党,之前学习过嵌入式的课程,跟着正点原子的视频一步一步地构建项目的工程,主要是基于标准库的开发,整个过程实在是过于繁琐。想必有的同学也应深有体会。
最近准备开始嵌入式相关的工作,打算使用HAL库进行开发,所以看了许多视频和教程做一个项目,本文主要做一个学习总结。

STM32CubeMX安装和使用

官网安装链接
选择适应自己的系统即可在这里插入图片描述
安装过程就不细谈了,基本上就是一直下一步
打开软件,安装HAL库,这里我们选择在线安装HAL库
在这里插入图片描述

选择所需的芯片包,安装即可。

在这里插入图片描述
这边我已经安装好了,不再细说。

完事之后我们就可以新建我们的工程了

在这里插入图片描述
接着选择我们的芯片,这里要注意选择Proteus8.9(我安装的版本是8.9)里面有的芯片,如下图所示,因为我们之后要在Proteus里仿真

在这里插入图片描述
这里我们搜索STM32F103R6,选择第二种封装方式,双击即可开始我们的工程

在这里插入图片描述
打开之后我们就看到我们所选的芯片和它的引脚图

在这里插入图片描述

这里我想要实现的效果是用一个按键输入控制两个LED灯的亮灭,所以我们就需要一个GPIO输入和两个GPIO输出
这里我选择PA1,PA2位输出引脚,PB0为按键输入引脚,操作方法是点击芯片上PA1(以PA1的设置为例),选择GPIO_Output即可

在这里插入图片描述
然后你可以右键对PA1引脚进行重命名,比如我们命名为LED1,右键然后选择“Enter User Label”,输入名称即可。

在这里插入图片描述
当然这一步完全可以省略233333
然后点击左侧的System Core的下拉框选择GPIO进行GPIO的配置

在这里插入图片描述

依次配置每个端口,包括
GPIO output level(初始化输出电平)
GPIO mode(模式)
GPIO Pull-up/Pull-down(上下拉)
Maximum output speed (输出响应速度)
User Label(用户标签): 标记这个引脚是做什么用的,便于用户理解

这里我们设置初始化两个输出电平为低电平,即灯亮,每个配置项内容如上图所示

在这里插入图片描述

设置按键输入为上拉,如上图所示。
接下来我们设置一下时钟,HSE(高速外部时钟)这一项选择如下图所示

在这里插入图片描述
点击Clock Configuration,选择HSE,然后设置频率为72MHz,如下图

在这里插入图片描述
由于我们是准备进行仿真,所以我们在SYS中选择Debug模式为"No Debug",如下图所示

在这里插入图片描述
接着我们进行项目配置,准备生成项目代码

选择Project Manager,设置项目名,项目地址,选择IDE和对应的版本,这里我们选择MDK-ARM,V5

在这里插入图片描述
最后,我们配置一下Code Generator,勾选生成.c文件或者./文件
完事点击右上角的GENERATE CODE按钮就完成啦!

在这里插入图片描述
代码生成好之后,会给一个按钮,让你定位到项目目录中,然后打开目录中的MDK-ARM文件夹,就看到了熟悉的Keil工程文件

在这里插入图片描述
至此,STM32CubeMX能做的工作就结束了

u1s1,STM32CubeMX很是方便,不用麻烦地构建工程,不用导入各种文件,不用自己写代码设置引脚和GPIO模式等等,用图形工具就帮我们生成IDE就绪项目,接下来我们只要在Keil里面写入我们的逻辑即可

Keil实现按键控制LED亮灭

打开Keil工程,找到main.c文件,在Private user code内写入按键扫描函数

//按键扫描函数
 uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
 {
     /*检测是否有按键按下,按键按下为低电平,即RESET */
     if (HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == RESET ) {
         /*等待按键释放 */
         while (HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == RESET);
         return  RESET;
     } else
         return SET;
 }

然后在主函数while循环内写下如下代码

  while (1)
  {
		if(Key_Scan(KEY_GPIO_Port,KEY_Pin) == RESET)
		{
				HAL_GPIO_TogglePin(GPIOA,LED1_Pin|LED2_Pin);    //翻转电平
		}
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

完事编译项目,生成hex文件即可导入Proteus进行仿真了

Proteus仿真

先绘制原理图,找到需要的元件,根据设置好的引脚进行连线即可。
原理图如下图所示

在这里插入图片描述

双击芯片STM32F103R6,导入Keil项目中生成的hex文件,设置主频为72MHz,选择PCB封装包(对应STM32CubeMX选择芯片包那一步),确定即可。

在这里插入图片描述
记得配置一下电源,点击上方 设计–配置供电网,然后配置VCC/VDD
就像这样

在这里插入图片描述
最后我们运行仿真一下,按键按下可以控制LED灯
那么我们的任务就完成了!

(补)Proteus连线问题

如何做到不直接将元件和芯片相连线?
比如上面那张原理图的按钮就没有直接和芯片连线
我们只要找到对应的引脚,点击左键拉出一条线,然后拉到网格的某个点,再次点击左键形成一个黑色的连接结点。

在这里插入图片描述

接着我们右键生成的这条连线,选择"添加网络标号",然后给这条连线添加标签即可

在这里插入图片描述
而为了将按钮和引脚PB0虚拟地连接起来,我们只需要用同样的方法给电源和按钮之间的连线添加同样的标签(即PB0)就好了,详情请看原理图

总结

主要是做一个学习的记录,方便下次查看

我是爱学习的诸葛铁锤,觉得有用的话点个赞哈,啾咪

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

STM32CubeMX+Keil5+Proteus实现按键控制LED灯(入门篇) 的相关文章

  • CMSIS 库是否应该包含在版本控制中? [复制]

    这个问题在这里已经有答案了 通常 我曾经在版本控制中包含芯片供应商 ST 提供的设备特定标头和源以及 CMSIS Core 标头 数量不多 也没有更新的习惯 我使用STM32微控制器 但我不使用立方体框架 or the 标准外设库 最近 我
  • 优化 ARM Cortex M3 代码

    我有一个 C 函数 它尝试将帧缓冲区复制到 FSMC RAM 这些函数将游戏循环的帧速率降低至 10FPS 我想知道如何分析反汇编的函数 我应该计算每个指令周期吗 我想知道CPU把时间花在哪里 在哪个部分 我确信该算法也是一个问题 因为它的
  • 当数据大小较小时,内存到内存 DMA 传输是否需要权衡?

    我正在学习 STM32 F4 微控制器 我正在尝试找出使用 DMA 的限制 根据我的理解和研究 我知道如果数据量较小 即设备使用DMA生成或消耗少量数据 则开销会增加 因为DMA传输需要DMA控制器执行操作 从而不必要地增加系统成本 我做了
  • 134-基于stm32单片机矿井瓦斯天然气浓度温湿度检测自动通风系统Proteus仿真+源程序...

    资料编号 134 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 ds1302时钟 DHT11温湿度 电机 蜂鸣器 制作一个基于stm32单片机矿井瓦斯天然气浓度温湿度检测自动通风系统Proteus仿真 2 通过DH
  • 138-基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真+源程序

    资料编号 138 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 LED灯 蜂鸣器 电位器 制作一个基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真 2 通过DHT1
  • Push_back() 导致程序在进入 main() 之前停止

    我正在为我的 STM32F3 Discovery 板使用 C 进行开发 并使用 std deque 作为队列 在尝试调试我的代码 直接在带有 ST link 的设备上或在模拟器中 后 代码最终在 main 中输入我的代码之前在断点处停止 然
  • 物联网网关

    物联网网关是 连接物联网设备和互联网的重要桥梁 它负责将物联网设备采集到的数据进行处理 存储和转发 使其能够与云端或其它设备进行通信 物联网网关的作用是实现物联网设备与云端的无缝连接和数据交互 物联网网关功能 数据采集 物联网网关可以从物联
  • [屏驱相关]【SWM166-SPI-Y1.28C1测评】+ 有点惊艳的开箱

    耳闻华芯微特许久了 看到论坛得评测活动赶紧上了末班车 毕竟对有屏幕得板子也是很喜欢得 京东快递小哥客客气气 微笑着把快递给了我 好评 直接拆了包 在此之前没看过视频号 所以这个圆盘盘得模具还是有点惊喜的 正面照如下 开机有灯光秀 还有动画
  • Java18都在路上了,你还在用Java8吗?

    Java18都在路上了 你还在用Java8吗 在开始前我有一些资料 是我根据自己从业十年经验 熬夜搞了几个通宵 精心整理了一份 Java的资料从专业入门到高级教程 工具包 点个关注 全部无偿共享给大家 在评论区回复 888 之后私信回复 8
  • [MM32硬件]搭建灵动微MM32G0001A6T的简易开发环境

    作为学习单片机的经典 自然是通过GPIO点亮LED 或者是响应按钮的外部中断例程 这我们看看SOP8封装的芯片MM32G0001A6T得引脚 除了VDD和GND固定外 我们可以使用PA14 PA1 PA13 PA15 PA2 PA3这六个G
  • VS Code 有没有办法导入 Makefile 项目?

    正如标题所说 我可以从现有的 Makefile 自动填充 c cpp properties json 吗 Edit 对于其他尝试导入 makefile 的人 我找到了一组脚本 它们完全可以实现我想要实现的目标 即通过 VS Code 管理
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • 最终启动顺序错误 - STM32L476 的 Eclipse System Workbench 调试

    我正在尝试调试和运行 STM32L476 的简单汇编代码 我已经设置了 Eclipse Oxygen 在 Eclipse 中安装了最新版本的 System Workbench 插件并安装了 ST Link 驱动程序 IDE 成功构建了程序
  • 嵌入式开发--STM32G4系列片上FLASH的读写

    这个玩意吧 说起来很简单 就是几行代码的事 但楞是折腾了我大半天时间才搞定 原因后面说 先看代码吧 读操作 读操作很简单 以32位方式读取的时候是这样的 data IO uint32 t 0x0800F000 需要注意的是 当以32位方式读
  • 特殊寄存器

    特殊寄存器 文章目录 前言 一 背景 二 2 1 2 2 总结 前言 前期疑问 STM32特殊寄存器到底是什么 特殊寄存器怎么查看和调试代码 本文目标 记录和理解特殊寄存器 一 背景 最近在看ucosIII文章是 里面提到特殊寄存器 这就进
  • PWM DMA 到整个 GPIO

    我有一个 STM32F4 我想对一个已与掩码进行 或 运算的 GPIO 端口进行 PWM 处理 所以 也许我们想要 PWM0b00100010一段时间为 200khz 但随后 10khz 后 我们现在想要 PWM0b00010001 然后
  • 在 Contiki 程序中使用 malloc

    考虑以下 Contiki 程序 include
  • STM32F0、ST-link v2、OpenOCD 0.9.0:打开失败

    我在用着发射台 http www ti com ww en launchpad about htmlgcc arm none eabi 4 9 2015q2 为 STM32F0 进行编译 现在我想使用该集合中的 arm none eabi
  • 使用 STM32F0 ADC 单独读取不同的输入

    STM32F072CBU 微控制器 我有多个 ADC 输入 并且希望单独读取它们 STMcubeMX 生成样板代码 假设我希望按顺序读取所有输入 但我无法弄清楚如何纠正这个问题 这篇博文 http blog koepi info 2015
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d

随机推荐

  • 听说你还不知道什么是 python?带你深入理解什么是 python

    文章目录 前言 什么是python python的由来 我们为什么要学习python 帮助python学习的网站 前言 各位朋友们 大家好 在之后的时间里 我将陆续为大家分享我在python学习过程中学习到的知识点 如果你也对python感
  • 【随机过程】 17 -离散时间马氏链典型应用

    离散时间马尔科夫链的典型应用 文章目录 离散时间马尔科夫链的典型应用 0 概述 1 Page Rank 1 1 背景 1 2 模型建立 1 3 模型求解 2 MCMC 2 1 概述 2 2 实现思路 2 3 具体实现 2 3 1 第一步 细
  • Qt基础之五:使用invokeMethod异步调用函数

    在主线程中如果执行比较耗时的任务 但是又不想单独开子线程来处理 不妨试试Qt中提供QMetaObject invokeMethod方法 该方法支持函数的异步调用 这样就会在界面显示后去执行 而不会卡主主界面 QMetaObject invo
  • [linux-sd-webui]图生文,blip/deepbooru

    GitHub pharmapsychotic clip interrogator Image to prompt with BLIP and CLIPImage to prompt with BLIP and CLIP Contribute
  • 【hadoop学习之路】Spark-SQL 实验报告 RDD转DataFrame

    1 Spark SQL 基本操作 1 1 需求 将下列JSON格式数据复制到Linux系统中 并保存命名为employee json id 1 name Ella age 36 id 2 name Bob age 29 id 3 name
  • Pandas处理日期数据

    一 pandaas日期处理的作用 将2018 01 01 1 1 2018等多种日期格式映射成统一的格式对象 在该对象上提供强大的功能支持 几个概念 1 pd to datetime pandas的一个函数 能将字符串 列表 series变
  • 数据结构——个人学习笔记

    系列目录 数据结构第一章绪论 数据结构第二章线性表 文章目录 系列目录 2 1线性表的定义和特点 2 2线性表的操作定义 2 3线性表的顺序表示和实现 线性表的重要基本操作 1 初始化线性表 参数用指针 2 插入 新增 3 取值 4 查找
  • easy modbus tcp

    public static void Main string args ModbusClient modbusClient new ModbusClient 190 201 100 100 502 Ip Address and Port o
  • Android组件化和插件化的概念,android快速开发框架

    开发单个模块时可以共享资源和工具类 可以针对单个模块测试 开发调试时不需要对整个项目进行编译 多人合作时可以只关注自己的业务模块 把某一业务当成单一项目来开发 可以灵活的对业务模块进行组装和拆分 4 组件化开发的主要思路 就是将一个Modu
  • c++求行列式的值(全排列法)

    用全排列的方式求行列式的值 递归体现在全排列中 上代码 f函数是求行列式的值 include
  • flink中通过jdbc查询结果集使用 flink table api 创建临时视图

    1 maven依赖
  • [转]QNX_HMI_crank工程的系统移植

    如果你认为本系列文章对你有所帮助 请大家有钱的捧个钱场 点击此处赞助 赞助额0 1元起步 多少随意 声明 本文只用于个人学习交流 若不慎造成侵权 请及时联系我 立即予以改正 锋影 email 174176320 qq com 开发软件 Cr
  • python如何输出多个星号_如何使用python输出连续星号?

    小编依稀记得 自己初学编程时候 第一节课 老师就给我们演示了输出连续星号内容 那时候真感叹python的神奇 重温一遍这个内容 入门小伙伴们可以来看下啦 有关语法 用嵌套打印小星星 需求 在控制台连续输出五行 每一行星号的数量依次递增 使用
  • 如何从配置文件中获取属性

    在项目中添加了一个腾讯云的短信业务 领导说要我把这个项目整合到原本的业务中去 业务那么多 怎么搞 继续询问后得知 是整合到原本的短信业务中 原本用的短信业务是短信猫来发短信 问 需要前端加传的参数吗 答 不允许 继续询问得知 是要在配置文件
  • [转]Tangram框架应用开发的一般模式

    框架其实就是一种开发模式 用tangram框架开发应用程序意味着选择一种面向接口 模块化的开发方式 这和传统的Delphi应用程序开发方式有一定区别 对于刚刚接触框架的童鞋可能不知道如何下手 因此有必要把框架的一般开发方式说明一下 不过框架
  • 深入分析HBase Compaction机制

    Compaction介绍 Compaction是buffer gt flush gt merge的Log Structured Merge Tree模型的关键操作 主要起到如下几个作用 1 合并文件 2 清除删除 过期 多余版本的数据 3
  • 二叉树算法

    每日一句 少年就是少年 他们看春风不喜 看夏蝉不烦 看秋风不悲 看冬雪不叹 看满身富贵懒察觉 看不公不允敢面对 只因他们是少年 目录 用递归和非递归两种方式实现二叉树的先序 中序 后序遍历 递归方法 非递归方法 如何完成二叉树的宽度优先遍历
  • 报文摘要算法

    1 报文摘要算法 报文摘要算法是一种将任意长度报文转换成固定长度的报文摘要算法 它具有以下六个特点 能够作用于任意长度的报文 产生有限位数的标识信息 易于实现 具有单向性 具有抗碰撞性 具有高灵敏性 1 1 MD5 1 1 1 添加填充位
  • Pytorch —— nn.Module类(nn.sequential)

    对于前面的线性回归模型 Logistic回归模型和神经网络 我们在构建的时候定义了需要的参数 这对于比较小的模型是可行的 但是对于大的模型 比如100 层的神经网络 这个时候再去手动定义参数就显得非常麻烦 所以 PyTorch 提供了两个模
  • STM32CubeMX+Keil5+Proteus实现按键控制LED灯(入门篇)

    嵌入式HAL库实战项目 本文说明 STM32CubeMX安装和使用 Keil实现按键控制LED亮灭 Proteus仿真 补 Proteus连线问题 总结 本文说明 学生党 之前学习过嵌入式的课程 跟着正点原子的视频一步一步地构建项目的工程