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.mfbz.cn/a/281632.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python2.x编码Unicode字符串

1 python2.x编码Unicode字符串 python2.x默认编码方法为ASCII码。字符串赋值时按系统默认编码自动编码,通过decode()方法解码为Unicode,再通过encode()方法编码为指定码。 1.1 编码解码基础知识 1.1.1 位 位(bit)是计算机存储数据的最小单位&#xf…

基于PHP的高校学生宿舍信息系统

有需要请加文章底部Q哦 可远程调试 基于PHP的高校学生宿舍系统 一 介绍 此学生宿舍信息系统基于原生PHP开发,数据库mysql,前端jquery.js。系统角色分为学生,辅导员和宿管员。(附带配套设计文档) 技术栈:phpmysqljquery.jsphpstu…

段永平浙江大学捐赠;合计超10亿元;OpenAI 年收超16亿美元;邻汇吧5000万元C+轮融资

投融资 • 「邻汇吧」完成5000万元C轮融资,安吉政府产业基金投资• 投资者预计明年黄金价格或将创新高• 至臻云完成 A 轮数千万元融资 大模型 • ChatGPT 产品增长强劲 OpenAI 年化收入超 16 亿美元• 周鸿祎:明年大模型一方面追求“大”&#xff0c…

超真实随身WiFi测评,你确定不看一下?随身WiFi靠谱吗? 看完这篇文章你就懂了?随身WiFi真实评测

用了一年多的格行随身wifi,屏幕都磨花了。直接看图,都是自己实测! 设备是去年买的,到现在也快1年了,一直有朋友蹲后续,现在把后续给大家!到底是大牌子,确定是不跑路的随身wifi&…

解决基于VectorGrid的矢量瓦片Y轴偏移的问题

目录 前言 一、GeoServer的瓦片 1、GeoWebcache缓存配置 2、矢量瓦片本地缓存 3、瓦片访问 二、VectorGrid加载本地瓦片 1、加载关键代码 2、默认模式的问题 3、问题分析 4、tms参数修改 总结 前言 在前面的博文介绍中,在线连接如下:浅谈前端自定义…

国图公考:研究生可以考选调生吗?

研究生可以报考选调生吗?当然是可以的,但是同样需要满足一定的条件才可以。 除本科生外,具有硕士、博士学位的考生均可申请考试。但是,除了满足应届毕业生的身份,还需要满足年龄限制。一般来说,本科生不超过25岁&…

【损失函数】SmoothL1Loss 平滑L1损失函数

1、介绍 torch.nn.SmoothL1Loss 是 PyTorch 中的一个损失函数,通常用于回归问题。它是 L1 损失和 L2 损失的结合,旨在减少对异常值的敏感性。 loss_function nn.SmoothL1Loss(reductionmean, beta1.0) 2、参数 size_average (已弃用): 以前用于确定是…

CANopen DS402 Home offset理解

本文通俗解释CANopen DS402中Home offset的含义。 一 原本解释 CANopen DS402中规定对象字典项0x607C用于存放Home offset,文档中对其解释如下, The home offset object is the difference between the zero position for the application and the mach…

一起玩儿物联网人工智能小车(ESP32)——21. ESP32的LED PWM控制器说明

摘要:本文介绍ESP32的LED PWM控制器的详细原理说明 ESP32芯片提供了2种用于输出PWM的信号的PWM控制器,一种LED控制器(LEDC),一种是马达PWM控制器(MCPWM)。其中MCPWM是专门用于马达调速控制的控制…

缺失的第一个正数(LeetCode 41)

文章目录 1.问题描述2.难度等级3.热门指数4.解题思路4.1 暴力4.2 排序4.3 哈希表4.4 空间复杂度为 O(1) 的哈希表4.5 置换 参考文献 1.问题描述 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级…

k8s搭建(详细演示完整一篇)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

2023年度总结—你是你的年度MVP吗?

这段年度总结其实我之前就想写了,大概就是市赛比完之后18号的样子把,但是因为太懒了就一直拖到了现在哈哈,我思来想去,翻来覆去,彻夜难眠,想了想,还是决定把它写了吧!毕竟&#xff0…

【ROS2】MOMO的鱼香ROS2(一)ROS2入门篇——从Ubuntu操作系统开启

从Ubuntu操作系统开启 引言1 术语汇总2 Ubuntu (操作系统)2.1 Ubuntu权限管理2.2 Ubuntu安装软件2.2.1 使用apt命令安装2.2.2 dpkg安装deb包2.2.3 make install源代码安装 2.3 Ubuntu之常用指令2.3.1 ls命令(查看文件)2.3.2 cd 命…

生财有术项目精选

生财有术项目精选 25700读者,71内容 这绝对是小报童这个平台的第一名了,背靠着生财有术这个国内最大的副业平台,再加上现如今的副业热潮,成功造就了2W订阅的奇迹 专栏包含66个精选实操赚钱项目,可以说每一个项目都蕴含…

Vue(二):计算属性与 watch 监听器

03. Vue 指令拓展 3.1 指令修饰符 可以通过 . 来指明一些指令的后缀,不同的后缀中封装了不同的操作,可以帮助我们简化代码,比如之前使用过的监听 enter 键的弹起,我们需要操作事件对象,来检测用户使用了哪个键&#…

Python 中的运算符介绍(1)

算数运算符 常见的% 、//、/ 用法 赋值运算符 赋值运算:将等号右边赋值给等号左边 常见场景: 比较运算符 代码解析: 逻辑运算符 位运算符(了解) 三目运算符 身份证运算符 成员运算符

Vue独立组件开发-动态组件

文章目录 一、前言二、实现三、优化四、总结五、最后 一、前言 在开发中&#xff0c;你经常会遇到这么一种情况&#xff1a;根据条件动态地切换某个组件&#xff0c;或动态地选择渲染某个组件。 Vue 提供了另外一个内置的组件 <component> 和 is 特性&#xff0c;可以更…

【零基础入门VUE】在 Vue 中构建复杂表单

✍面向读者&#xff1a;所有人 ✍所属专栏&#xff1a;零基础入门VUE专栏https://blog.csdn.net/arthas777/category_12537076.html 目录 v-modelVue 中的 指令 Vue 中的组件 没有构建步骤 随着构建步骤 注册 VUE 组件 Vue 道具 VUE 中的道具声明 在 VUE 中传递 PROP…

【web安全】短信等各类验证码的绕过思路整理

前言 本文是对一些验证码可能出现的问题的总结。 验证码的种类分析 首先验证码有两种&#xff1a; 1.短信验证码&#xff0c;这种通常出现在一些登录&#xff0c;修改绑定信息等位置处。 2.人机验证码&#xff0c;这种一般是用来防止机器操作和密码爆破的&#xff0c;通常…

计算机组成原理-总线概述

文章目录 总线简图总线的物理实现总览总线定义总线的特性总线的分类按数据格式分类串行总线并行总线 按总线功能分类注意系统总线的进一步分类 总线的结构单总线的机构双总线的结构三总线的结构四总线的结构 小结 总线简图 总线的物理实现 如果该为数据总线&#xff0c;那么当…