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

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

图片

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

二、正式点亮一个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.hqwc.cn/news/312100.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iptables防火墙(二)

目录 1、SNAT策略及应用 1.1、SNAT 策略概述 1.2、SNAT 策略的应用 2、DNAT 策略及应用 2.1、DNAT 策略概述 2.2、DNAT 策略的应用 3、规则的导出、导入 3.1、规则的备份及还原 3.2、使用 iptables 服务 4、使用防火墙脚本 4.1、防火墙脚本的构成 &#xf…

图像拼接——基于homography的特征匹配算法

目录 1. 任务要求2. 数据集3. 基于homography的特征匹配算法4. 拼接流程展示4.1 图片实例4.2 特征点位图4.3 特征点匹配结果4.4 相机校准结果4.5 拼接结果 5. 部分图像拼接结果展示 1. 任务要求 输入:同一个场景的两张待拼接图像(有部分场景重合&#x…

Linux 安装 mysql 【使用 tar.gz | tar.xz安装包-离线安装】

一、以tar.xz压缩包为安装源 网址:https://downloads.mysql.com/archives/community/ 二、解压压缩包 首先,将压缩包从windows传输到linux上 解压到/usr/local下,并且将解压的目录名称改为mysql tar -xvf /tmp/mysql-8.1.0-linux-glibc2.2…

微信小程序-父子页面传值

父子页面传值 父页面向子页面传值 方法一&#xff1a; 父页面&#xff1a; 1. /page/xxx/xxx?id1子页面&#xff1a; onLoad:function(option){ }方法二 <bindtap“func” data-xxx””> 子页面向父页面传值 定义父子页面 父页面&#xff1a;hotspot 子页面&a…

qt中信号槽第五个参数

文章目录 connent函数第五个参数的作用自动连接(Qt::AutoConnection)直接连接(Qt::DirectConnection - 同步)同线程不同线程 队列连接(Qt::QueuedConnection - 异步)同一线程不同线程 锁定队列连接(Qt::BlockingQueuedConnection) connent函数第五个参数的作用 connect(const …

2023年——我和CSDN的一周年纪念日|回顾与展望|汗水与成长

​ ​ &#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 &#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 &#x1f38a;对2023的总结与回顾&#x1f38a; &#x1f3c5;获奖记录 &#x1f4da;学…

Springboot整合MybatisPlus的基本CRUD

目录 前言1. 搭建项目2. 基本的CRUD 前言 发现项目框架是MybatisPlus的&#xff0c;由于个人使用该框架的CRUD比较少 对此学习过程中&#xff0c;从零到有开始搭建学习还是比较重要的&#xff0c;感悟会比较多 关于各个类的使用&#xff0c;可看如下文章&#xff1a; 剖析Ja…

关于求定积分的反函数的导数【认清原函数x变量和反函数x变量】

如图碰到该题该怎么解&#xff1f; 在纸上按①②③的顺序写出这个&#xff0c;其中①是最主要的 第②步和第③步就是在用反函数时要用到的逻辑思维&#xff0c;不是一起用的&#xff0c;你需要用②才去用②&#xff0c;你需要用③才去用③ 在纸上先写出第①步&#xff0c;即 其…

从2023看2024前端发展趋势

前言 流光溯影&#xff0c;纵观2023全年&#xff0c;整个前端业界呈现出百业凋零之状&#xff0c;更不乏有“前端已死”等论调甚嚣尘上。从全局视角看IT行业&#xff0c;除了AI领域的大语言模型爆发外&#xff0c;整体都鲜有特别亮眼及突出的技术展现。故而&#xff0c;作为IT…

Linux文件类型

在 Linux 系统中&#xff1a; b 文件类型&#xff1a;代表块设备文件。块设备文件通常是对应于设备&#xff0c;如硬盘驱动器或其他块设备&#xff0c;使用块级别的 I/O 操作。 c 文件类型&#xff1a;代表字符设备文件。字符设备文件通常是对应于设备&#xff0c;如串口、键盘…

4.32 构建onnx结构模型-Erf

前言 构建onnx方式通常有两种&#xff1a; 1、通过代码转换成onnx结构&#xff0c;比如pytorch —> onnx 2、通过onnx 自定义结点&#xff0c;图&#xff0c;生成onnx结构 本文主要是简单学习和使用两种不同onnx结构&#xff0c; 下面以 Erf 结点进行分析 方式 方法一&…

mysql原理---InnoDB统计数据是如何收集的

以下聚焦于 InnoDB 存储引擎的统计数据收集策略。 1.两种不同的统计数据存储方式 InnoDB 提供了两种存储统计数据的方式&#xff1a; (1). 永久性的统计数据 这种统计数据存储在磁盘上&#xff0c;也就是服务器重启之后这些统计数据还在。 (2). 非永久性的统计数据 这种统计数…