STM32单片机学习记录3——GPIO(上)输出模式之点亮LED灯

2023-11-15

1、硬件准备

我使用的是市面上常见的黑色开发板,烧入器使用的是正点原子的无线烧入器,普通的烧入器也行,这个无所谓。开发板的原理图我放在下面链接里,我们需要知道相应的LED引脚。
在这里插入图片描述 在这里插入图片描述

2、预期功能

通过函数实现LED灯的闪烁,这里直接采用模块化编程,并且介绍如何完成模块化编程。

3、程序编写

3.1、Cubemx部分

先前的RCC设置与上一篇一致,可以直接将上一个项目直接复制,修改项目名称即可,这里我直接复制上次的项目,把名称修改为GPIO_UP,就不用重新配置RCC与时钟设置了。
在这里插入图片描述但是里面的名称不能修改了,打开复制后的文件夹中的CUBEMX文件。这里不介绍GPIO是什么了,但是简单来说就是板子上面的引脚,可以将其设置不同的模式,例如输出模式,可以向外输出高低电平;输入模式,可以读取外界的电平情况。
首先我们查看,相关的原理图,找到LED灯连接的引脚,从原理图中可知LED连接的引脚为:LED1-PF9;LED2-PF10。
在这里插入图片描述并且从电路图可以,LED灯的一端连接到高电平3V3,因此当引脚输出为高电平时LED灯才发光,接下来我们去CUBEMX中进行初始化配置。
第一步,打开CUBEMX后在红框Pinout View选项中找到相应的引脚PF9和PF10,点击它将其设置为输出模式GPIO_Output。
在这里插入图片描述第二步,将页面调整到左侧的GPIO页面,就能显示刚才设置的两个输出模式的引脚,接下来介绍一下,初始化页面需要的设置。
初始电平:就是引脚没有上电时的引脚电平,通过原理图可知若初始化为高电平则LED不亮,若为低电平则LED亮,这里不想让LED灯上电就亮,因此设为高电平。
输出模式:推挽输出或开漏输出,这里设置为推挽输出。
上拉或者下拉:设置为上拉模式。
输出速度:不需要很高的速度,设置为LOW。
用户标签:这个还是比较好用的,因为设置了用户标签之后,会在生成的Keil文件的main.h中宏定义相关的引脚,这样对于代码的可提更性有着良好的帮助。这里将两个LED分别命名为LED1与LED2。
在这里插入图片描述下面是用户标签设定后生成的宏定义:
在这里插入图片描述接下来点击【Generate Code】生成初始化代码。
在这里插入图片描述

3.2、Keil文件编写

我们首先介绍一下HAL库中有关于GPIO的函数,我们可以在Keil软件中找到GPIO的相关函数,本次我们主要介绍黑色方框中的两个函数。
在这里插入图片描述1.HAL_GPIO_WritePin:设置对应的引脚输出的电平。

`void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)`

2.HAL_GPIO_TogglePin:反转相应引脚的电平。

void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

接下来我们编写led.c与led.h文件,实现模块化编程。
首先,在项目文件夹中新建一个存放自己编写函数的文件夹,我一般命名为Func。
在这里插入图片描述其次,在Keil中点击新建按钮,新建两个空白文件。
在这里插入图片描述然后,ctrl+s保存,保存在我们刚刚创建的Func文件夹中,保存时分别命名为【led.c】和【led.h】。
在这里插入图片描述接着,我们先对led.h进行编写,大家可以直接复制下面的代码进去,当然这不是最终的头文件,首先我们要先引入main.h。

#ifndef __LED_H__
#define __LED_H__

#include "main.h"

#endif

其次我们编写led.c,我们首先要引入其自身的头文件【led.h】
在这里插入图片描述然后,我们将这两个led的函数文件,与项目连接,连接之后好像才能使用代码联想功能。
在这里插入图片描述完成上述步骤之后需要将,Func文件夹添加到项目路径中。
在这里插入图片描述添加完成之后,在main.c中包含led.h头文件,如果不报错说明操作成功。
在这里插入图片描述这样就完成了模块化编程,我们不用把函数全部塞到main.c中了。
接下来我们编写led.c文件。
这里我写了两个函数,分别控制LED1与LED2的亮,灭与闪烁。
led.c:

#include "led.h"

/* **************LED相关函数****************** */
// LED1
void LED1_Style(uint8_t i)
{
	switch(i)
	{
		case 1:
			HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);
			break;
		case 2:
			HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);
			break;
		case 3:
			HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
			break;
	}
}
// LED2
void LED2_Style(uint8_t i)
{
	switch(i)
	{
		case 1:
			HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_RESET);
			break;
		case 2:
			HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_SET);
			break;
		case 3:
			HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin);
			break;
	}
}

led.h:

#ifndef __LED_H__
#define __LED_H__

#include "main.h"

void LED1_Style(uint8_t i);
void LED2_Style(uint8_t i);

#endif

然后我们再在main.c中编写,在使用CUBEMX生成的文件中,我们只能在规定的地方编写,否则当重新生成文件时,位于其他区域的代码会被删除。
例如在main.c函数的开头会有这么一段区域


```c
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
用户开始定义类
/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
用户开始宏定义
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

因此我们只能在USER CODE BEGIN和USER CODE END之间编写代码。
这次我们编写的主函数功能为:复位-LED1亮-500ms-LED1灭-500ms-LED2亮-500ms-LED2灭-1000ms-LED1与LED2共同以2000ms的周期闪烁。
main.c:

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		LED1_Style(1);
		HAL_Delay(500);
		LED1_Style(2);
		HAL_Delay(500);
		LED2_Style(1);
		HAL_Delay(500);
		LED2_Style(2);
		HAL_Delay(1000);
		while(1)
		{
			LED1_Style(3);
			LED2_Style(3);
			HAL_Delay(2000);
		}
  }
  /* USER CODE END 3 */

简单的LED闪烁程序就编写好了,平时写程序时有喜欢用printf调试大法的,我还喜欢用LED调试大法,所以基本每个项目都会有这个文件。简单的程序但是背后的知识有很多,我也没全懂,有错误有问题一定要告诉我,谢谢。

最后附上程序源码,对了这个ZGT6与VET6通用的只要在KEIL里面改一下就能烧进板子里。
链接:https://pan.baidu.com/s/1Y6SWO4kXpsYy_COL0KyjLA
提取码:1234

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

STM32单片机学习记录3——GPIO(上)输出模式之点亮LED灯 的相关文章

  • 普冉32位单片机 PY32C642,M0+内核,1.7 V ~ 5.5 V宽工作电压

    PY32C642 单片机采用高性能的 32 位 ARM Cortex M0 内核 宽电压工作范围 嵌入 24Kbytes Flash 和 3 Kbytes SRAM 存储器 最高工作频率 24 MHz 包含多种不同封装类型产品 工作温度范围
  • 1.常用单词学习

    1 1 听力练习 第一课 Av264771740 P1 Av736460000 P1 哔哩哔哩 bilibili 有推荐的吗 这个和这个都很推荐 这个多少钱 请给我这个 全部 这些一共多少钱 卫生间在哪呢 一度 願 麻烦再来一次 英語話 会
  • 在职状态下继续学习的心得体会

    本来平时记录的都是一些技术点的学习和使用 今天打算记录一下学习方法 当然不一定适合所有人 因人而异 仅供参考 学习这件事 对于IT行业来说 真的是活到老学到老 技术的更新迭代速度非常快 而且总是有那么一些公司特别的卷 没办法 改变不了外因
  • 为什么C语言没有被C++所取代呢?

    今日话题 为什么C语言没有被C 所取代呢 C 的复杂编译器实现和嵌入式平台的限制 使C语言保持了其地位 嵌入式系统多数仅支持C 即使支持C 也会限制某些功能 尤其是异常处理和RTTI 此外 C 引入的功能增加了二进制文件大小和运行时内存占用
  • 会stm32有机会进大公司吗?

    今日话题 会stm32有机会进大公司吗 我本科期间参与了飞思卡尔和电赛等比赛 使用过多种单片机 但渐渐发现单片机只是其中的一小部分 不要过分迷恋所谓的单片机基础和技巧 更值得深入研究的是C语言 如果你对此感兴趣 我愿意无偿分享一个资源包 其
  • Java 学习路线 2024 最新版!

    又对上次分享的 Java 学习路线进行了简单修改完善 并增加了免登录下载和黑夜模式 这里重发一下 花了一个月零碎的时间 我根据当下 Java 后端求职和招聘的最新要求 对之前写的 Java 后端学习路线进行了全面的优化和改进 添加图片注释
  • 物联网项目分享 Stm32单片机的音乐播放器设计 - 物联网 嵌入式

    文章目录 0 前言 1 简介 2 主要器件 3 实现效果 4 设计原理 5 部分核心代码 6 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求 这两年不断有学弟学妹告诉
  • 太阳诱电 | 电容器为什么会发热?什么是纹波电流

    电容器中存在寄生于电极和电介质的电阻成分 当纹波电流等交流电流通过电容器时 电阻的成分会产生热量 为了抑制发热 选择ESR较低的电容器非常重要 陶瓷电容器在电容器中ESR较低 非常适合抑制发热 电容器中的纹波电流主要是指电源电路中由于IC的
  • Arm:objcopy 如何知道 elf 中的哪些部分要包含在二进制或 ihex 中?

    我正在开发一个项目 其中涉及解析arm elf 文件并从中提取部分 显然 elf 文件中有很多部分没有加载到闪存中 但我想知道 objcopy 到底如何知道要在二进制文件中包含哪些部分以直接闪存到闪存中 以arm elf文件的以下reade
  • 白帽子如何快速挖到人生的第一个漏洞 | 购物站点挖掘商城漏洞

    本文针对人群 很多朋友们接触安全都是通过书籍 网上流传的PDF 亦或是通过论坛里的文章 但可能经过了这样一段时间的学习 了解了一些常见漏洞的原理之后 对于漏洞挖掘还不是很清楚 甚至不明白如何下手 可能你通过 sql labs 初步掌握了sq
  • 嵌入式开发--STM32G4系列片上FLASH的读写

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

    文章目录 开发板资料下载 目标 点亮LD1 绿 LD2 黄 和LD3 红 三个LED灯 开箱过程 博主使用的是STM32CubeMX配置生成代码 具体操作如下 打开STM32CubeMX File gt New project 选择开发板型
  • 特殊寄存器

    特殊寄存器 文章目录 前言 一 背景 二 2 1 2 2 总结 前言 前期疑问 STM32特殊寄存器到底是什么 特殊寄存器怎么查看和调试代码 本文目标 记录和理解特殊寄存器 一 背景 最近在看ucosIII文章是 里面提到特殊寄存器 这就进
  • 为什么我强烈推荐大学生打CTF!

    前言 写这个文章是因为我很多粉丝都是学生 经常有人问 感觉大一第一个学期忙忙碌碌的过去了 啥都会一点 但是自己很难系统的学习到整个知识体系 很迷茫 想知道要如何高效学习 这篇文章我主要就围绕两点 减少那些罗里吧嗦的废话 直接上干货 CTF如
  • 手把手教你使用HarmonyOS本地模拟器

    我们通过下面的动图来回顾下手机本地模拟器的使用效果 本期 我们将为大家介绍HarmonyOS本地模拟器的版本演进 并手把手教大家使用HarmonyOS本地模拟器 一 本地模拟器的版本演进 2021年12月31日 经过一个版本的迭代优化 随D
  • 通过JTAG恢复STM32 MCU磨掉的标记

    我有一块可能带有 STM32 MCU 的板 我想为该板制作定制固件 因为库存板有很多问题 不幸的是 电路板制造商很友善地磨掉了所有标记 有没有办法通过 jtag 获取设备 系列 ID 并将其交叉引用到型号 我能找到的一切都是关于获取芯片的唯
  • PWM DMA 到整个 GPIO

    我有一个 STM32F4 我想对一个已与掩码进行 或 运算的 GPIO 端口进行 PWM 处理 所以 也许我们想要 PWM0b00100010一段时间为 200khz 但随后 10khz 后 我们现在想要 PWM0b00010001 然后
  • 使用 STM32 USB 设备库将闪存作为大容量存储设备

    我的板上有这个闪存IC 它连接到我的STM32F04 ARM处理器 处理器的USB端口可供用户使用 我希望我的闪存在通过 USB 连接到 PC 时被检测为存储设备 作为第一步 我在程序中将 USB 类定义为 MSC 效果很好 因为当我将主板
  • 使用 STM32F0 ADC 单独读取不同的输入

    STM32F072CBU 微控制器 我有多个 ADC 输入 并且希望单独读取它们 STMcubeMX 生成样板代码 假设我希望按顺序读取所有输入 但我无法弄清楚如何纠正这个问题 这篇博文 http blog koepi info 2015
  • stm32l0: 执行MI命令失败。使用 vFlashErase 数据包擦除闪存时出错

    我正在使用 Nucleo STM32L031 和 AC6 STM32 工作台 eclipse 我编写应用程序并进入调试模式 一切正常 直到我在应用程序中添加另一个功能 我注意到当我删除 评论 新函数 软件可以再次进入调试模式 但是当我添加

随机推荐

  • java Unreachable错误

    Unreachable code 错误 不可达代码 比如在循环的break或者return后面的代码就是不可达代码 因为执行它们之前就已经跳出循环了 只要把这段代码移到break return之前就好了 参考https blog csdn
  • np.mean()和np.std()函数

    一 np mean 函数定义 numpy mean a axis dtype out keepdims mean 函数功能 求取均值 经常操作的参数为axis 以m n矩阵举例 axis 不设置值 对 m n 个数求均值 返回一个实数 ax
  • kibana启动问题:Kibana server is not ready yet

    第一点 KB ES版本不一致 网上大部分都是这么说的 解决方法 把KB和ES版本调整为统一版本 第二点 kibana yml中配置有问题 通过查看日志 发现了Error No Living connections的问题 解决方法 将配置文件
  • Vue3通透教程【八】获取DOM、操作组件

    文章目录 写在前面 Vue2 ref 的使用 Vue3获取DOM Vue3操作组件 写在最后 写在前面 专栏介绍 凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章 应粉丝要求开始更新 Vue3 的相关技术文章 Vue 框架目前的地位
  • 【Linux】计算机操作系统和软硬件体系结构

    目录 1 冯诺依曼体系结构 1 1 中央处理器 CPU 2 操作系统 OS 2 1 操作系统的概念 2 2 操作系统的作用 2 3 操作系统如何进行管理 2 3 1 操作系统通过分级管理的方式 实现对整体的管理 2 3 2 管理的本质是对数
  • 如何使用chrome 浏览器自带截屏?

    1 ctrl shift c 2 ctrl shift p 3 输入 capture 4 选择capture full size screenshot 实现截取整个网页
  • enscape各种材质参数_它来了!Enscape专属素材库!

    ENSCAPE素材库 近两年风靡整个设计的渲染器 一款实时渲染软件Enscape 凭借入门低 成效快 效果逼真 从渲染界脱颖而出 用其他渲染器1 的时间渲出VRAY等老大哥级别90 的效果 作为建筑师的你会怎么选择呢 简单的分析了下渲染界最
  • MySQL connector/C++ 连接mysql效率低下解决

    这个问题 说解决也不算是被解决了 只能是让数据库插入的时候不会有像直接插入一样有那么多的问题了 我的解决方法是 开启mysql的事务 开始我也不知道是不是我的mysql配置优化的问题 WAMP统一安装 无限默认下一步的 在用PHP测试的时候
  • int与byte[]之间进行转换

    如何将int与byte 之间转换 int类型在内存中占4个字节 采用补码方式存储 而一个byte占一个字节 下面有两种方法进行转换 package cn fh vertxboot utils description int与Byte数组转换
  • 苹果app上架流程之傻瓜式教程剖析

    iOS开发者开发好一款APP之后 进行内测后没问题 下一步就是要上架AppStore了 一些开发者不知道该如何上架AppStore 下面 我们来说说iOS上架流程 以及如何快速上架AppStore 工具 1 iOS开发者账号 2 App U
  • Linux内存泄露案例分析和内存管理分享

    一 问题 近期我们运维同事接到线上LB 负载均衡 服务内存报警 运维同事反馈说LB集群有部分机器的内存使用率超过80 有的甚至超过90 而且内存使用率还再不停的增长 接到内存报警的消息 让整个团队都比较紧张 我们团队负责的LB服务是零售 物
  • Xamarin.Forms(移动应用)轮盘抽签软件(Android)

    该文章由我前面的文章https blog csdn net dabo 520 article details 129760956 spm 1001 2014 3001 5501改编而来 它是程序的核心 具体详细可自行前往观看 1 软件开发准
  • 基于Python的顺序表实现一元多项式相加

    具体代码 from operator import itemgetter class PolyList def init self self data def Add self e self data append e def Create
  • JavaWeb案例:实现注册和登录功能

    业务需求分析 在实际开发中 通常会有专门的人去跟客户进行沟通从而了解客户需要什么样的系统 之后由专业的美工将要做的系统以图片的形式表现出来 客户确认后作出一些静态的html demo页面 然后由软件开发人员创建相关数据库 编写代码将该静态页
  • python多线程_Python多线程爬虫,效率真的高

    有些时候 比如下载图片 因为下载图片是一个耗时的操作 如果采用之前那种同步的方式下载 那效率肯会特别慢 这时候我们就可以考虑使用多线程的方式来下载图片 多线程介绍 多线程是为了同步完成多项任务 通过提高资源使用效率来提高系统的效率 线程是在
  • PAT 乙级 1033 旧键盘打字 python

    题目 思路 因为坏键盘的输入是大写字母 遍历输入的字符 将输入字母的字符转换为大写 与坏键盘对比 如果 坏掉 当字母字符不在坏键盘之列 则是小写时 字符才能输出 代码 import sys bad key sys stdin readlin
  • Python语言实现批量视频分帧,保存视频帧

    本篇博客介绍利用python脚本实现视频分帧 并将每一帧保存到本地 主要基于opencv包来实现 在运行代码前确保opencv包已正确安装 下面是主要代码 import os import cv2 videos src path home
  • 大模型落地金融业,想象力在哪?

    金融大模型的难点在于 能否在产业中扎得更深 其颠覆性也更建立在 纵深到产业中去 赋能金融行业的长尾场景发展 以及重拾 金融信任 作者 思杭 编辑 皮爷 出品 产业家 从经济角度讲 整个金融业的数字化进程并非匀速 从技术角度讲 催化剂的出现会
  • TypeError: parse() got an unexpected keyword argument 'transport_encoding'

    import cv2时发现没有这个包 然后就安装一下 结果发现安装时出错了 错误如下 注 我是在pycharm里面配的anaconda 然后利用anaconda安装cv2 发现pip版本太低 我的是9 0 1 新的已经是10 0 1 于是就
  • STM32单片机学习记录3——GPIO(上)输出模式之点亮LED灯

    1 硬件准备 我使用的是市面上常见的黑色开发板 烧入器使用的是正点原子的无线烧入器 普通的烧入器也行 这个无所谓 开发板的原理图我放在下面链接里 我们需要知道相应的LED引脚 2 预期功能 通过函数实现LED灯的闪烁 这里直接采用模块化编程