stm32F407-GPIO的使用——点亮LED并且讲解各个寄存器

stm32F407-GPIO的使用——点亮LED并且讲解各个寄存器

本文为stm32GPIO的介绍与使用,例子是简单的LED点亮。

一、 GPIO

GPIO(General Purpose I/O Ports)意思为通用输入/输出端口,通俗地说,
就是一些引脚,可以控制它们输出高低电平或者通过它们获取引脚的状态,
是高电平或是低电平。GPIO口一是个比较重要的概念,GPIO在嵌入式开发
中应用非常广泛,主要用于:
(1) 开关量的输入、输出,读取开关的状态,控制开关的关和开
(2) 控制硬件,例如LED,蜂鸣器
(3) 用于中断信号的输入引脚
(4) 使用GPIO模拟I2C, SPI接口时序与外部设备通信等

GPIO端口结构如下:
在这里插入图片描述

1.1 GPIO 端口的结构组成

由上面的图可以看出有下面几个重要组成部分:

① 保护二极管
有两个保护二极管,用于保护引脚外部过高或过低的电压输入

②上下拉电阻
阻值约在30k-50k之间,可以通过上、下两个对应的开关控制,这两个开关由寄存器控制
当引脚外部的器件没有干扰引脚的电压时,即没有外部的上、下拉电压,引脚的电平由引脚内部上、下拉决定,开启内部上拉电阻工作,引脚电平为高,开启内部下拉电阻工作,则引脚电平为低。同样,如果内部上、下拉电阻都不开启,这种情况就是我们所说的浮空模式。浮空模式下,引脚的电平是不可确定的。引脚的电平可以由外部的上、下拉电平决定。需要注意的是,STM32 的内部上拉是一种“弱上拉”,这样的上拉电流很弱,如果有要求大电流还是得外部上拉。

③ 施密特触发器
对于标准施密特触发器,当输入电压高于正向阈值电压,输出为;当输入电压低于负向阈值电压,输出为;当输入在正负向阈值电压之间,输出不改变,也就是说输出由高电准位翻转为低电准位,或是由低电准位翻转为高电准位对应的阈值电压是不同的。只有当输入电压发生足够的变化时,输出才会变化.

④ P-MOS 管和 N-MOS 管
这个结构控制 GPIO 的开漏输出和推挽输出两种模式。

STM32F4 的 IO 可以由软件配置成如下 8 种模式中的任何一种:
1、输入浮空
2、输入上拉
3、输入下拉
4、模拟输入
5、开漏输出
6、推挽输出
7、推挽式复用功能
8、开漏式复用功能

开漏输出:只能输出低电平,如果要输出低电平则需要加一个上拉电阻。
推挽输出:这两只对称的 MOS 管每次只有一只导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载拉电流。推拉式输出既能提高电路的负载能力,又能提高开关速度。

在这里插入图片描述

还有要注意的是如何判断是输入还是输出

输入输出是对于CPU而言的,比如我们需要点亮一个LED,则我们需要给LED的的这个引脚口给电平,那么这个电平是需要CPU去主动"给"的,所以这样需要CPU"给"的这种方式就是输出,换而言之就是需要在这个LED引脚口需要输出为某一电平。
相反的输入,就是CPU从某个引脚“获取”电平状态,典型的就是按键,我们是需要不断的检测按键的这个引脚的电平是什么状态,再进行下一步的操作,换而言之,就是按键将自己的电平状态反应给了CPU,进行了“输入”。

二、 LED

LED 是最经典的GPIO的使用,也是新手入门必须学会的——点灯.

LED的电路如下:可以看到右边是接共同的3.3V是共阳的LED模块,所以我们需要给LED引脚低电平就可以点亮该LED。
在这里插入图片描述

可以找到这三个LED最后是连接到是stm32F407VET6上的PE8-PE10引脚上。

在这里插入图片描述

接下来就可以进行代码控制了,那么就需要去了解控制该引脚的寄存器应该如何配置。
与IO配置常用的8个寄存器: MODER、OTYPER、OSPEEDR、PUPDR、ODR、IDR 、AFRH 和 AFRL。寄存器的介绍与配置可以在stm34F4中文参考手册中进行查看。下面是我认为比较重要的。

2.1 I/O相关寄存器简单介绍与分类

上面所说的8个与IO相关的寄存器主要可以分为三类:端口控制寄存器、端口数据寄存器、复用功能输入/输出寄存器。

2.1.1 I/O 端口控制寄存器

每个 GPIO 有 4 个 32 位存储器映射的控制寄存(GPIOx_MODER、GPIOx_OTYPER、 GPIOx_OSPEEDR、GPIOx_PUPDR),可配置多达 16个 I/O.

GPIOx_MODER 寄存器用于 选择 I/O 方向(输入、输出、AF、模拟)。

GPIOx_OTYPER 和 GPIOx_OSPEEDR 寄存器分别用于选择输出类型(推挽或开漏)速度.无论采用哪种 I/O 方向都会直接将 I/O 速度引脚连接到相应的 GPIOx_OSPEEDR 寄存位。无论采用哪种 I/O 方向,GPIOx_PUPDR 寄存器都用于选择上拉/下拉

2.1.2 I/O 端口数据寄存器

每个 GPIO 都具有 2 个 16 位数据寄存器:输入和输出数据寄存器GPIOx_IDRGPIOx_ODR)。
GPIOx_ODR 用于存储待输出数据,可对其进行读/写访问。通过 I/O 输入的数据存储到输入数据寄存器 (GPIOx_IDR) 中,它是一个只读寄存器。

2.1.3 I/O 复用功能输入/输出

有两个寄存器可用来从每个 I/O 可用的 16 个复用功能输入/输出中进行选择。借助这些寄存器,可根据应用程序的要求将某个复用功能连接到其它某个引脚。这意味着可使用 GPIOx_AFRLGPIOx_AFRH 复用功能寄存器在每个 GPIO 上复用多个可用的外设功能。这样一来,应用程序可为每个 I/O 选择任何一个可用功能。由于 AF 选择信号由复用功能输入和复用功能输出共用,所以只需为每个 I/O 的复用功能输入/输出选择一个通道即可。

注意: 对于每个 I/O 而言,应用程序一次只能为其选择一个可用的外设功能。

另外:所有端口都具有外部中断功能。要使用外部中断线,必须将端口配置为输入模式–这就是为什么我们在进行外部中断实验的时候一般都是使用的按键。

2.2 GPIO寄存器

2.2.1 GPIO 端口模式寄存器 (GPIOx_MODER)

在这里插入图片描述

可以通过上面的32位的端口模式寄存器可以知道,每一个IO口都通过这个寄存器的两个位来控制I/O的方向模式

2.2.2 GPIO 端口输出类型寄存器 (GPIOx_OTYPER)

在这里插入图片描述

在这里插入图片描述

GPIOx_OTYPER也是一个32位的寄存器,
但是一个组最多16个GPIO,所以只使用了低16位,用这个寄存器来配置I/O端口的输出类型

2.2.3 GPIO 端口输出速度寄存器 (GPIOx_OSPEEDR)

在这里插入图片描述

GPIOx_OSPEEDR端口输出速度寄存器通过两位来配置I/O的输出速度。

2.2.4 GPIO 端口上拉/下拉寄存器 (GPIOx_PUPDR)

在这里插入图片描述

用来配置I/O的上拉与下拉。

2.2.5 GPIO 端口输入数据寄存器 (GPIOx_IDR)

在这里插入图片描述

输入数据寄存器,用于存储IO口的输入的数据值,注意这个寄存器只能读,不能进行写操作。

2.2.6 GPIO 端口输出数据寄存器 (GPIOx_ODR)与GPIO 端口置位/复位寄存器 (GPIOx_BSRR)

在这里插入图片描述

在这里插入图片描述

2.2.7 GPIO 复用功能低位寄存器 (GPIOx_AFRL)

在这里插入图片描述

配置复用功能 I/O

2.2.8 GPIO 复用功能高位寄存器 (GPIOx_AFRH)

在这里插入图片描述

三、 LED 初始化配置

GPIO 相关的函数和定义分布在固件库文件 stm32f4xx_gpio.c 和头文件 stm32f4xx_gpio.h 文件中。

在固件库开发中,操作四个配置寄存器初始化 GPIO 是通过 GPIO 初始化函数完成:

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)

第一个参数是用来指定需要初始化的 GPIO 对应的 GPIO 组;第二个参数为初始化参数结构体指针,结构体类型为 GPIO_InitTypeDef。
双击入口参数类型 GPIO_InitTypeDef
后右键选择“Go to definition of …”可以查看结构体的定义.

通过不断追踪GPIO_Init()中的各个参数,你就可以知道关于这个GPIO的配置都与我们前面提到的寄存器相关。

但是,仅仅对GPIO进行配置是远远不行的,还要记得整个单片机的心脏——时钟,所以我们需要将该引脚口所在的时钟线使能。
在这里插入图片描述

可以知道PORTE是使用的AHB1的时钟线,所以使能AHB1时钟。

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE)

LED 完整配置代码

lec.cvoid LED_Init(void)
{ GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);//E8910GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//开漏只能输出高电平,LED需要低电平点亮GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;GPIO_Init(GPIOE,&GPIO_InitStructure);GPIO_SetBits(GPIOE,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10);//输出为0,点亮LED
}

led.h

#ifndef __LED_H
#define __LED_H
void LED_Init(void);
#endif

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

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

相关文章

十个Vue3实用但是冷门的API

文章目录 一、前言二、readonly三、shallowRef四、shallowReactive五、toRef & toRefs5.1、 toRef5.2、toRefs 六、toRaw & markRaw & unref6.1、toRaw6.2、markRaw6.3、unref 七、effectScope & onScopeDispose7.1、收集副作用7.2、全局状态管理 八、provide …

HTML面试题---专题一

文章目录 一、前言二、 HTML5 中 <header> 和 <footer> 标签的用途是什么&#xff1f;三、如何在 HTML 中嵌入 SVG&#xff08;可缩放矢量图形&#xff09;文件&#xff1f;四、解释 contenteditable 属性的用途五、如何创建随屏幕尺寸缩放的响应式图像&#xff1f…

3 文本分类入门finetune:bert-base-chinese

项目实战&#xff1a; 数据准备工作 bert-base-chinese 是一种预训练的语言模型&#xff0c;基于 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;架构&#xff0c;专门用于中文自然语言处理任务。BERT 是由 Google 在 2018 年提出的一…

迅腾文化助力企业品牌创新,加快增强品牌发展新动能

迅腾文化助力企业品牌创新&#xff0c;加快增强品牌发展新动能 随着市场竞争的日益激烈&#xff0c;品牌创新已成为企业持续发展的关键。为了在市场中脱颖而出&#xff0c;许多企业纷纷寻求外部合作伙伴以加快品牌发展。广州迅腾文化传播有限公司拥有13年品宣经验的企业&#…

关于Cython生成的so动态链接库逆向

来个引子&#xff1a;TPCTF的maze题目 如何生成这个so文件 为了研究逆向&#xff0c;我们先搞个例子感受一下生成so的整个过程&#xff0c;方便后续分析 创建对应python库文件 testso.py def test_add(a,b):a int(a)b int(b)return a bdef test_calc(li):for i in range…

JavaWeb笔记之MySQL数据库

#Author 流云 #Version 1.0 一、引言 1.1 现有的数据存储方式有哪些&#xff1f; Java程序存储数据&#xff08;变量、对象、数组、集合&#xff09;&#xff0c;数据保存在内存中&#xff0c;属于瞬时状态存储。 文件&#xff08;File&#xff09;存储数据&#xff0c;保存…

【基于Flask、MySQL和Echarts的热门游戏数据可视化平台设计与实现】

基于Flask、MySQL和Echarts的热门游戏数据可视化平台设计与实现 前言数据获取与清洗数据集数据获取数据清洗 数据分析与可视化数据分析功能可视化功能 创新点结语 前言 随着游戏产业的蓬勃发展&#xff0c;了解游戏销售数据对于游戏从业者和游戏爱好者都至关重要。为了更好地分…

自动化补丁管理软件

什么是自动化补丁管理 自动补丁管理&#xff08;或自动补丁&#xff09;是指整个补丁管理过程的自动化&#xff0c;从扫描网络中的所有系统到检测缺失的补丁&#xff0c;在一组测试系统上测试补丁&#xff0c;将它们部署到所需的系统&#xff0c;并提供定期更新和补丁部署状态…

Duplicate keys detected: This may cause an update error.【Vue遍历渲染报错的解决】

今天在写项目时&#xff0c;写到一个嵌套评论的遍历时&#xff0c;控制台出现了一个报错信息&#xff0c;但是并不影响页面的渲染&#xff0c;然后一看这个错的原因是 key值重复&#xff0c;那么问题的解决方式就很简单了。&#xff08;vue for循环读取key值时&#xff0c; key…

LLM Agent发展演进历史(观看metagpt视频笔记)

LLM相关的6篇重要的论文&#xff0c;其中4篇来自谷歌&#xff0c;2篇来自openai。技术路径演进大致是&#xff1a;SSL (Self-Supervised Learning) -> SFT (Supervised FineTune) IT (Instruction Tuning) -> RLHF。 word embedding的问题&#xff1a;新词如何处理&…

文档或书籍扫描为 PDF:ScanPapyrus Crack

ScanPapyrus 可让您快速轻松地将文档或书籍扫描为 PDF&#xff0c;批处理模式使扫描过程快速高效&#xff0c;自动处理书籍并将其拆分为单独的页面 用于快速扫描文档、书籍或打印照片的扫描仪软件 快速扫描文档 使用此扫描仪软件&#xff0c;您无需在扫描仪和计算机之间来回移动…

JavaEE 09 锁策略

1.锁策略 1.1 乐观锁与悲观锁 其实前三个锁是同一种锁,只是站在不同的角度上去进行描述,此处的乐观与悲观其实是指在预测的角度上看会发生锁竞争的概率大小,概率大的则是悲观锁,概率小的则是乐观锁 乐观锁在加锁的时候就会做较少的事情,加锁的速度较快,但是消耗的cpu资源等也会…

大数据机器学习与深度学习——过拟合、欠拟合及机器学习算法分类

大数据机器学习与深度学习——过拟合、欠拟合及机器学习算法分类 过拟合&#xff0c;欠拟合 针对模型的拟合&#xff0c;这里引入两个概念&#xff1a;过拟合&#xff0c;欠拟合。 过拟合&#xff1a;在机器学习任务中&#xff0c;我们通常将数据集分为两部分&#xff1a;训…

beebox靶场A3 low级别 xss通关教程(二)

六&#xff1a;xss get型 eval 通过观察我们可以发现url地址中存在一个date函数 那我们可以试一下把后面的date()函数去掉&#xff0c;直接写入一个alert(555) 发现直接弹出一个框&#xff0c;证明有xss漏洞 七&#xff1a;xss href 直接进入页面会看到是get方法&#xff0c…

【JVM从入门到实战】(五)类加载器

一、什么是类加载器 类加载器&#xff08;ClassLoader&#xff09;是Java虚拟机提供给应用程序去实现获取类和接口字节码数据的技术。 类加载器只参与加载过程中的字节码获取并加载到内存这一部分。 二、jdk8及之前的版本 类加载器分为三类&#xff1a; 启动类加载器-加载Ja…

Docker Compose入门:打造多容器应用的完美舞台

Docker Compose 是一个强大的工具&#xff0c;它允许开发者通过简单的 YAML 文件定义和管理多容器的应用。本文将深入讨论 Docker Compose 的基本概念、常用命令以及高级应用场景&#xff0c;并通过更为丰富和实际的示例代码&#xff0c;助您轻松掌握如何通过 Docker Compose 打…

VLAN协议与单臂路由

文章目录 VLAN协议与单臂路由一、VLAN的概念及优势1、分割广播域2、VLAN的优势3、VLAN数据帧 二、VLAN的种类1、静态VLAN2、动态VLAN3、VLAN划分方式 三、静态VLAN的配置1、VLAN的范围2、静态VLAN的配置2.1 配置静态VLAN的步骤2.2 vlan三种端口类型举例&#xff1a;配置静态VLA…

1688按关键字搜索工厂数据,商品详情页数据的采集

公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中,点击获取测试key和secret&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_shop等]cacheStrin…

【稳定检索】2024年物理化学工程与应用力学国际会议(ICPCEAM 2024)

2024年物理化学工程与应用力学国际会议(ICPCEAM 2024) 2024 International Conference on Physical and Chemical Engineering and Applied Mechanics(ICPCEAM) 一、【会议简介】 2024年物理化学工程与应用力学国际会议(ICPCEAM 2024)将于2024年3月9日在中国上海盛大召开。本次…

SpringIOC之@EnableLoadTimeWeaving

博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…