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

news2024/9/30 1:29:55

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.c

void LED_Init(void)
{ 
 GPIO_InitTypeDef GPIO_InitStructure;
 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
 //E8910
 GPIO_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.coloradmin.cn/o/1309272.html

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

相关文章

关于AISD300系列三相智能安全配电装置的详细介绍-安科瑞 蒋静

1概述 AISD300系列三相智能安全配电装置是安科瑞专为低压配电侧开发的一款智能安全配电产品,本产品主要针对低压配电系统人身触电、线路老化、短路、漏电等原因引起电气安全问题而设计。 产品主要应用于学校、加油站、医院、银行、疗养院、康复中心、敬老院、酒店…

Python 自动化之收发邮件(一)

imapclient / smtplib 收发邮件 文章目录 imapclient / smtplib 收发邮件前言一、基本内容二、发送邮件1.整体代码 三、获取邮件1.整体代码 总结 前言 简单给大家写个如何用Python进行发邮件和查看邮件教程,希望对各位有所帮助。 一、基本内容 本文主要分为两部分…

动画制作与动画控制器的使用_unity基础开发教程

动画制作与动画控制器的使用 导入素材创建动画控制器制作人物动画 前面我们讲过2D游戏中环境地图的制作,这里教大家使用动画控制器的使用 导入素材 先导入一下素材 选择window,点击Asset Store 点击Search online 搜索栏输入Sunny,然后回车…

2022年AMC8数学竞赛真题的典型考点和解析

大家好! 从战争中学习战争。 在2024年AMC8考前一个多月的时间中,孩子除了完成学校作业外,备考AMC8的有效方法就是做往年真题,通过往年真题进一步了解AMC8的考点、题型,建立自己的解题策略和方法。并且查漏补缺&#…

Docker容器如何优雅地访问宿主机网络

# 前言 某些时候,我们会有在容器内容访问宿主机某个服务的需求,比如现在 openai 无法直接访问,需要给项目添加代理,我的 chatgpt-dingtalk (opens new window) 项目支持了通过环境变量指定代理地址。 添加方式如下: …

使用对象处理流ObjectOutputStream读写文件

注意事项: 1.创建的对象必须实现序列化接口,如果属性也是类,那么对应的类也要序列化 2.读写文件路径问题 3.演示一个例子 (1)操作的实体类FileModel,实体类中有Map,HashMap这些自带的本身就实现了序列化。 public class File…

c语言printf函数与==和=

介绍&#xff1a; 本篇文章 是一些 关于c语言的 细节代码讲解 代码与讲解&#xff1a; 代码&#xff1a; #include <stdio.h>int main(void) {int a 1, b 2, c 3;printf("%d %d %d %d\n", a b c, a b c, a (b c), a (b c));return 0; } 大家先自…

玉米浸泡液回收植酸,植酸回收树脂

植酸为环己六醇六磷酸&#xff0c;分子量为660&#xff0c;植酸钠为环己六醇六磷酸钠&#xff08;Na12C6H6O24P6&#xff09;分子量为924。 植酸用途&#xff1a;在食品工业中植酸钠可用作食品添设剂&#xff0c;菲丁&#xff08;植酸钙&#xff09;可用于生产肌醇&#xff0c…

02.尚医通 Mybatis-Plus

1、前期准备 a. 创建数据库 CREATE TABLE USER (id BIGINT(20)NOT NULL COMMENT 主键ID,NAME VARCHAR(30)NULL DEFAULT NULL COMMENT 姓名,age INT(11)NULL DEFAULT NULL COMMENT 年龄,email VARCHAR(50)NULL DEFAULT NULL COMMENT 邮箱,PRIMARY KEY (id) );INSERT INTO user…

jdk+zookeeper+kafka 搭建kafka集群

环境准备 环境资源包&#xff1a; jdk-8u341-linux-x64.tar.gz kafka_2.12-2.2.0.tgz zookeeper-3.4.14.tar.gz server-idip状态server110.206.120.10leaderserver210.206.120.2followerserver310.206.120.3follower 一、安装jdk 因为kafka需要Java环境&#xff0c;所以优先…

Liunx高级系统设计9-线程间同步与互斥

同步与互斥的概念 互斥&#xff1a;同一时间&#xff0c;只能有一个任务&#xff08;进程或线程&#xff09;执行&#xff0c;谁先执行不确定。 同步&#xff1a;同一时间&#xff0c;只能有一个任务&#xff08;进程或线程&#xff09;执行&#xff0c;有顺序的执行。 同步…

CSS的基本选择器及高级选择器(附详细示例以及效果图)

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍HTML中CSS的基础选择及高级选择器&#xff08;详解&#xff09;以及部分理论知识 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主收将持续更新学习记录获&#xf…

螺丝厂家:什么是钣金螺丝?

金属板由常见的金属或合金&#xff08;钢、铜、镍、锡、钛等&#xff09;组成&#xff0c;比木材更硬、更坚固。因此&#xff0c;它需要使用特殊的螺钉。您通常无法将传统螺钉拧入钣金中。值得庆幸的是&#xff0c;有专为钣金设计的特殊类型的螺钉。被称为钣金螺钉&#xff0c;…

对多个 App 设计工具组件使用一个回调

当要在App 中提供多种方法来执行某个操作时&#xff0c;在组件间共享回调非常有用。例如&#xff0c;当用户点击按钮或在编辑字段中按下 Enter 键时&#xff0c;App 可以用同样的方式响应。 共享回调的示例 此示例说明如何创建一个 App&#xff0c;其中包含共享一个回调的两个…

运筹优化 | 模拟退火求解旅行商问题 | Python实现

"""模拟退火旅行商""" import random import numpy as np import math import time import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False location np.loadtxt(city_location.t…

蓝牙插座_风扇_灯

项目需求 通过蓝牙模块&#xff0c;实现手机控制蓝牙插座 / 风扇 / 灯。 本质&#xff1a; 1. 采用蓝牙的透传功能&#xff1b; 2. 控制 IO 口的输出。 HC01_TX -- RX1 HC01_RX -- TX1 项目实现 1、串口非中断法 2. 串口中断法

【UML】第4篇 UML公共机制(补扩展机制)

目录 一、扩展机制 1.1 构造型 1.2 标记值&#xff08;Tagged Value&#xff09; 1.3 约束&#xff08;Constraint&#xff09; 上节扩展机制没有讲完&#xff0c;如上图。 一、扩展机制 1.1 构造型 UML中的扩展机制包括约束、构造型和标记值&#xff0c;其中的构造型定义…

Github、Gitee优秀的开源项目分享

先赞后看&#xff0c;养成习惯&#xff01;&#xff01;&#xff01;❤️ ❤️ ❤️ 资源收集不易&#xff0c;如果喜欢可以关注我哦&#xff01; ​如果本篇内容对你有所启发&#xff0c;欢迎访问我的个人博客了解更多内容&#xff1a;链接地址 ​ Java 项目 javacore - Java …

电子印章法律风险点及安全防范措施

公章是公司处理内外部事务的印鉴&#xff0c;公司对外的正式信函、文件、报告使用公章&#xff0c;盖了公章的文件具有法律效力。公章由公司的法定代表人执掌&#xff0c;法定代表人如果把法定代表人章与公章一同使用就代表公司行为。 随着社会数字化转型&#xff0c;电子印章及…

SLAM算法与工程实践——相机篇:传统相机使用(1)

SLAM算法与工程实践系列文章 下面是SLAM算法与工程实践系列文章的总链接&#xff0c;本人发表这个系列的文章链接均收录于此 SLAM算法与工程实践系列文章链接 下面是专栏地址&#xff1a; SLAM算法与工程实践系列专栏 文章目录 SLAM算法与工程实践系列文章SLAM算法与工程实践…