STM32入门教程-2023版【3-2】使用库函数点亮GPIO灯

news2025/4/22 11:41:38

关注 + 点赞   不错过精彩内容

图片

大家好,我是硬核王同学,最近在做免费的嵌入式知识分享,帮助对嵌入式感兴趣的同学学习嵌入式、做项目、找工作! 

二、正式点亮一个LED灯

(3)使用库函数点亮GPIO灯

  1. RCC初始化

首先用的是,RCC里面的APB2外设时钟控制函数,将RCC_APB2PeriphClockCmd函数名复制,粘贴到main函数中,然后右键跳转到定义

图片

我们要点亮PA0口的LED,所以选择RCC APB2外设 GPIOA这一项,放到第一个参数,第二个参数选择ENABLE,放到第二个参数

图片

图片

这样时钟就开启了

图片

2.GPIO初始化

在main函数中,接着调用GPIO_Init函数,然后右键跳转到定义

图片

第一个参数选择GPIOA,第二个参数是一个结构体,我们先把结构体类型复制下来,在GPIO_Init上面粘贴,起个名字,叫GPIO_InitStructure。

图片

图片

这里这个结构体实际上也是一种局部变量,在有些老的编译器,它要求所有的局部变量定义必须放到函数的最前面,如果你的编译器是这样的话,就需要把这一行提到最前面去

图片

接着我们复制结构体名字,用“.”把结构体的成员都引出来。右键跳转,看一下说明,复制粘贴一下参数,后面三个成员都是同一个套路

图片

图片

那我们选择这个GPIOMode_TypeDef,Ctrl+F搜索一下

图片

这里是GPIO的8种工作模式

图片

 
GPIO_Mode_AIN = 0x0,

AIN(Analog IN)模拟输入

GPIO_Mode_IN_FLOATING = 0x04,

IN_FLOATING是浮空输入

GPIO_Mode_IPD = 0x28,

IPD(In Pull Down)是下拉输入

GPIO_Mode_IPU = 0x48,

IPU(In Pull Up)是上拉输入

GPIO_Mode_Out_OD = 0x14,

Out_OD(Out Open Drain)是开漏输出

GPIO_Mode_Out_PP = 0x10,

Out_PP(Out Push Pull)是推挽输出

GPIO_Mode_AF_OD = 0x1C,

AF_OD(Atl Open Drain)是复用开漏

GPIO_Mode_AF_PP = 0x18

AF_PP(Atl Push Pull)是复用推挽

点灯使用的是推挽输出,所以复制GPIO_Mode_Out_PP,粘贴到GPIO_Mode这里来

图片

然后再配置GPIO_Initstructure.GPIO_Pin,同样跳转定义

图片

左下角这里GPIO Pin有多个定义,我们选择member这一项,双击跳转

图片

选择GPIO_pins_define,Ctrl+F

图片

这里因为我们用的是GPIOA外设的0号引脚,所以选择GPIO_Pin_0复制,粘贴到main函数中

图片

图片

第三个GPIO_Speed还是同样的套路,右键跳转到定义,Ctrl+F

图片

输出速度选择50MHz就行了,复制粘贴到main函数中

图片

最后,把GPIO初始化结构体的地址粘贴到GPIO nit的第二个参数,这样就初始化完成了

图片

图片

此时当这个GPIO_Init函数执行完,这个GPIOA外设的0号引脚就自动被配置为推挽输出、50MHz的速度了

图片

内部的主要执行逻辑是,读取结构体参数,执行一堆判断和运算,然后再写入GPIO配置寄存器,至于具体的内部操作的细节我们就不用再关心了

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);        GPIO_InitTypeDef GPIO_InitStructure;        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        GPIO_Init(GPIOA, &GPIO_InitStructure);

这样GPIO的初始化已经完成了,这样就可以使用GPIO的输入输出函数了

3.GPIO输入输出

打开stm32f10x_gpio.h文件,找到用GPIO的输入输出函数

图片

GPIO_SetBits这个函数可以把指定端口设置为高电平:

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

GPIO_ResetBits这个函数可以把指定端口设置为低电平:

*void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

GPIO_WriteBit,前两个参数是指定端口,第三个参数BitVal,这个是根据第三个参数的值来设置指定的端口的:

*void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);

这个函数可以同时对16个端口执行写入操作:

*void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

首先来使用一下void GPIO_ResetBits,看一下函数的定义,第一个参数是GPIOx可以是A到G,第二个是要写入GPIO_Pin_x,x可以是0到15

图片

那我们就写可以写为GPIO_ResetBits(GPIOA, GPIO_Pin_0);

图片

编译、烧录一下,可以看到LED灯就已经点亮了

图片

换成GPIO_ResetBits函数同样可得GPIO_SetBits(GPIOA, GPIO_Pin_0);

图片

编译、烧录一下,可以看到LED灯就已经熄灭了

图片

换成GPIO_WriteBit函数,前两个参数也是一样的,第三个参数我们可以转到定义看一下

这个参数可以是BitAction这个枚举中的一个值,Bit_RESET是清除端口值,也就是置低电平,Bit_SET是设置端口值,也就是置高电平

图片

那么我们可以用Bit_RESET置低电平,灯点亮

GPIO_WriteBit(GPIOA,GPIO_Pin0, Bit_RESET);

那么我们可以用Bit_RESET置搞电平,灯熄灭

GPIO_WriteBit(GPIOA,GPIO_Pin0, Bit_SET);

4.LED闪烁

为了实现闪烁功能,在逻辑上应该是在循环里,点亮LED,延时一段时间,熄灭LED,延时一段时间

点亮LED可以用:GPIO_WriteBit(GPIOA,GPIO_Pin0, Bit_RESET);

熄灭LED可以用:GPIO_WriteBit(GPIOA,GPIO_Pin0, Bit_SET);

那么延时函数已经帮大家提供好了,就在STM32入门教程资料\程序源码\STM32Project\1-3 Delay函数模块文件夹里

图片

我们可以复制把它们添加到LED闪烁的工程里,可以再新建一个文件夹,名称可以叫System,存放系统的资源

图片

然后把这两个文件粘贴到System文件夹里

图片

回到Keil软件,点击三个箱子的按钮,添加组,也叫System

图片

把它往上挪个位置,然后右边点击Add Files添加文件,

图片

打开System,把这两个文件添加进来

图片

最后别忘了点击魔术棒按钮,添加这个新文件夹的头文件路径

图片

双击这个文件夹,点击ok完成

图片

我们可以打开Delay.h看一下,这里就是三个延时函数,对应的分别是微秒延时、毫秒延时和秒延时

图片

打开.c文件可以看到这些函数的定义,可以看到是使用SysTick定时器实现的延时,具体怎么实现的可以先不管,直接拿过来用就行了

图片

那我们回到main.c,使用这个延时函数模块,需要先在上面写#include"Delay.h"

图片

然后复制函数到main函数

如以下方式:

#include "stm32f10x.h"                  // Device header#include "delay.h" int main(void){                GPIO_InitTypeDef GPIO_Initstructure;        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);                GPIO_Initstructure.GPIO_Mode = GPIO_Mode_Out_PP;        GPIO_Initstructure.GPIO_Pin = GPIO_Pin_0;        GPIO_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;        GPIO_Init(GPIOA, &GPIO_Initstructure);                while(1)        {                        GPIO_SetBits(GPIOA, GPIO_Pin_0);                Delay_ms(500);                GPIO_ResetBits(GPIOA, GPIO_Pin_0);                Delay_ms(500);                                GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);                Delay_ms(500);                GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);                Delay_ms(500);                //GPIO_WriteBit函数可以不用指定的参数,也可以填0、1,需要加上强制类型转换                GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0);//强制类型转换就可以实现不用填入指定的参数,写0和1即可                Delay_ms(500);                GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1);                Delay_ms(500);        }}

这样就可以实现LED的闪烁了!

作 者 :硬核王同学

------- END ------

关注公众号回复“加群”按规则加入技术交流群  回复“1024”查看更多内容

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1346130.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java | 多线程案例】定时器的实现

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【Java系列专栏】【JaveEE学习专栏】 本专栏旨在分享学习JavaEE的一点学习心得,欢迎大家在评论区交流讨论💌 这里写…

“推荐大战:抖音vs.快手”——背后的秘密全揭晓!

大家好,我是小米,一个热衷于技术分享的小伙伴。最近在面试的时候遇到了一个非常有趣的问题,也是很多人关心的话题——字节跳动产品面试题:说一下抖音和快手的推荐策略有什么不同?今天,就让我们一起来揭开这…

前端vue uni-app使用Vue和ECharts构建交互式树形结构图

题目:使用Vue和ECharts构建交互式树形结构图 摘要:本文介绍了如何使用Vue.js和ECharts构建一个交互式的树形结构图。通过整合ECharts的强大可视化功能,我们创建了一个可拖拽移动、点击展开和收缩的树形结构图,并实现了无限添加子…

《Spring Cloud学习笔记:微服务保护Sentinel + JMeter快速入门》

Review 解决了服务拆分之后的服务治理问题:Nacos解决了服务治理问题OpenFeign解决了服务之间的远程调用问题网关与前端进行交互,基于网关的过滤器解决了登录校验的问题 流量控制:避免因为突发流量而导致的服务宕机。 隔离和降级&#xff1a…

Java EE Servlet之Servlet API详解

文章目录 1. HttpServlet1.1 核心方法 2. HttpServletRequest3. HttpServletResponse 接下来我们来学习 Servlet API 里面的详细情况 1. HttpServlet 写一个 Servlet 代码,都是要继承这个类,重写里面的方法 Servlet 这里的代码,只需要继承…

【数据结构】第2章线性表(头歌习题)【合集】

文章目录 第1关:实现顺序表各种基本运算的算法任务描述编程要求完整代码 第2关:实现单链表各种基本运算的算法任务描述编程要求完整代码 第3关:移除顺序表中所有值等于x的元素任务描述编程要求完整代码 第4关:逆置顺序表任务描述编…

穷举vs暴搜vs深搜vs回溯vs剪枝

欢迎来到Cefler的博客😁 🕌博客主页:那个传说中的man的主页 🏠个人专栏:题目解析 🌎推荐文章:题目大解析(3) 目录 👉🏻全排列👉&#…

使用WSL

一、下载 Microsoft Store下载Ububtu,然后点击打开 二、报错WslRegisterDistribution failed with error: 0x800701bc 解决办法: 1、开启Windows Subsystem for Linux dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linu…

Unity之组件的生命周期

PS:第二天,依旧在摸鱼学unity 一、组件的概念 我本身是由Web后端转到了游戏后端,最近因为工作原因在学ET框架。学到了 ECS 编程模式开发(E —— Entity,C —— Component , S —— System)实体、…

玩转MYSQL|详细分析mysql-MGR集群搭建

目录 1、简介 2、环境准备 2.1 数据库服务器规划 2.2 安装mysql5.7.20 2.3 设置hostname和ip映射 3、创建复制环境 3.1 服务器host68.cn 3.1.1 配置/etc/my.cnf 3.1.2 服务器host68.cn上建立复制账号: 3.1.3 在mysql服务器host68.cn上安装group replicatio…

docker搭建minio集群,集群分享文件URL踩坑问题

一、环境准备 3台机器,Ip地址依次为IP1,IP2,IP3二、设置服务器时间同步 Minio集群需要各个节点的时间保持同步,使用NTP作为时间同步服务,这里以Minio-1(IP1)为上游服务器,其它2个节点为下游服务器&#x…

idea实现Java连接MySQL数据库

1.下载MySQL并安装 首先如果没有mysql的需要先下载MySQL,可以看这个教程: Mysql超详细安装配置教程(保姆级)_mysql安装及配置超详细教程-CSDN博客 2.下载mysql 的jdbc驱动 官网:MySQL :: Download Connector/J 解压并将驱动jar包导入id…

信息网络协议基础_IP移动网络管理

文章目录 概述移动IPv6待解决的问题关键词基本过程分组拦截技术移动检测和转交地址自动配置到家乡代理绑定注册通信对端不支持IPv6通信对端支持移动IPv6 对IP以上层屏蔽移动性 移动IPv6存在的问题移动IPv6优化代理移动IP概述原理基本过程初始接入切换 概述 移动IPv6 待解决的问…

证明:切线垂直于半径

证明: 切线垂直于过切点的半径。 下面是网上最简单的证明方法。 证明: 利用反证法。 如下图所示,直线AB和圆O切于点A,假设OA 不垂直于 AB,而 O B ⊥ A B OB \perp AB OB⊥AB,则 ∠ O B A 90 \angle OB…

Apache SSI 远程命令执行漏洞

一、环境搭建 二、访问upload.php 三、写shell <!--#exec cmd"id" --> 四、访问 如图所示&#xff0c;即getshell成功&#xff01;​

C#上位机与欧姆龙PLC的通信06---- HostLink协议(FINS版)

1、介绍 对于上位机开发来说&#xff0c;欧姆龙PLC支持的主要的协议有Hostlink协议&#xff0c;FinsTcp/Udp协议&#xff0c;EtherNetIP协议&#xff0c;本项目使用Hostlink协议。 Hostlink协议是欧姆龙PLC与上位机链接的公开协议。上位机通过发送Hostlink命令&#xff0c;可…

Spring Cloud Gateway集成Knife4j

1、前提 网关路由能够正常工作。 案例 基于 Spring Cloud Gateway Nacos 实现动态路由拓展的参考地址&#xff1a;Spring Cloud Gateway Nacos 实现动态路由 详细官网案例&#xff1a;https://doc.xiaominfo.com/docs/middleware-sources/spring-cloud-gateway/spring-gatewa…

使用anaconda创建爬虫spyder工程

1.由于每个工程使用的环境都可能不一样&#xff0c;因此一个好的习惯就是不同的工程都创建属于自己的环境&#xff0c;在anaconda中默认的环境是base&#xff0c;我们现在来创建一个名为spyder的环境&#xff0c;专门用于爬虫工程&#xff1a; //括号中名字&#xff0c;代表当…

【网络安全 | Misc】Aesop_secret(ISCC)

正文 动态gif&#xff0c;使用工具进行分解&#xff1a; https://tu.sioe.cn/gj/fenjie/ 得到ISCC字样 由Winhex看到密文&#xff1a; U2FsdGVkX19QwGkcgD0fTjZxgijRzQOGbCWALh4sRDec2w6xsY/ux53Vuj/AMZBDJ87qyZL5kAf1fmAH4Oe13Iu435bfRBuZgHpnRjTBn5xsDHONiR3t0Oa8yG/tOKJMN…

模式识别与机器学习-SVM(带软间隔的支持向量机)

SVM&#xff08;带软间隔的支持向量机&#xff09; 软间隔思想的由来软间隔的引入 谨以此博客作为复习期间的记录。 软间隔思想的由来 在上一篇博客中&#xff0c;回顾了线性可分的支持向量机,但在实际情况中&#xff0c;很少有完全线性可分的情况&#xff0c;大部分线性可分…