STM32F4X之GPIO

一、GPIO概述

主控芯片信息如下:

  • 主频:168MHZ
  • 内核:ARM-M4
  • FLASH:1M
  • SRAM:192KB
  • 引脚:100
  • GPIO:82
  • 电压:1.8~3.6V

 1.1GPIO概念及其作用

GPIO概念:通用输入输出(General Purpose Input Output),主要作用是与外部器件或设备进行数据交流和信息交换

注意:

芯片管脚和GPIO的区别:管脚不一定是GPIO口,但是GPIO(IO)口一定是管脚

芯片管脚:STM32F407VGT6总共100管脚,其中GPIO口82

1.2GPIO口的管理与控制

1PORT:端口/组 每组16个IO口

GPIO口的4种工作模式

  • 输出
  • 输入
  • 模拟
  • 复用

以上4大模式可以划分为八种功能:

(1)输入浮空

(2)输入上拉

(3)输入下拉

(4)模拟功能

(5)具有上拉或下拉功能的开漏输出情况下。

(6)具有上拉或下拉功能的推挽输出。

(7)具有上拉或下拉功能的复用功能推挽。

(8)具有上拉或下拉功能的复用功能开漏。

注意:GPIO的以上8中功能由芯片内部的GPIO控制器控制

二、GPIO口框架分析

整体框架图分析

输出框架分析

GPIO口配置为输出模式信号传输方向:芯片内部到芯片外部

是否打开弱上拉电阻和下拉电阻 ,取决于GPIOx_PUPDR 寄存器中的值。

补充:

上拉一个管脚接一个电阻的一端,电阻的另一端接到电源。

上拉电阻是用来解决总线驱动能力不足时提供电流的即拉电流。

 下拉一个管脚接一个电阻的一端,电阻的另一端接到地,电阻同时起限流作用!

  1. 当选择的是推挽功能:输出控制的输入源输入了一个“1”,P-MOS管导通,N-MOS管不导通,由于P-MOS管导通以后输出的IO口与VDD连接,这时输出高电平。输出控制的输入源输入了一个“0”,P-MOS管不导通,N-MOS管导通以后输出的IO口与VSS连接,这个时候输出低电平。

重点:在推挽输出模式下,可以输出高电平(逻辑1)与低电平(逻辑0)。

应用:需要驱动能力强的地方:如驱动LED灯、驱动三极管、驱动蜂鸣器、通信协议中的时钟线或输出数据线。

  1. 当选择的是开漏功能的时候:输出控制的输入源输入一个“1”,P-MOS管和N-MOS管都不工作,这个时候输出什么电平状态不确定,取决于外部电路。输出控制的输入源输入一个“0”,P-MOS管不工作,N-MOS管导通,IO口输出低电平。

重点在开漏输出模式下,可以输出低电平(逻辑0)但是不能输出高电平(逻辑1)。

注意:在使用开漏的情况下也可以输出高点平,但是必须外接上拉才可以。

应用: 一般在通信协议(IIC,单总线)中的输入数据线。

芯片内部有上拉与下拉;并且内部上拉与下拉都有独立开关控制。内部上下拉都是弱上下拉{上下拉电阻阻值不一样而已,如果想要输出能力强必须外接上下拉。

注意:

当配置为GPIO口配置为输出时,输入部分依然可以正常工作

输入框架分析

信号传输方向:芯片外部到芯片内部

 GPIO口配置为输入模式:

  1. 输出缓冲器被关闭即输出功能断开了。
  2. 根据 GPIOx_PUPDR 寄存器中的值决定是否打开上拉和下拉电阻.。

输入数据寄存器的读访问可获取 I/O 状态.即要获取IO端口的高点电平,直接读取输入数据寄存器即可。

IO口来的信号经过施密特触发器,这个时候外部的模拟量就转成了数字量(逻辑电平)。并且这个数字量会被存储到输入数据寄存器.

IO口作为输入情况时,IO口的输出部分已经关闭。

根据要不要使用上下拉将输入分为以下三种情况:

浮空输入模式:即不采用上下拉,I/O的电平状态是不确定的,完全由外部输入决定;如果在无信号输入的情况下,读取该端口的电平是不确定的。

注意: 在I/O引脚悬空时,接电阻就是为了防止输入端悬空,从而提高系统的抗干扰能力。减弱外部电流对芯片产生的干扰.

上拉输入模式:即采用上拉电阻。在无信号输入的情况下,输入端的电平可以保持在高电平;此模式下可以检测到外部低电平。

下拉输入模式:即采用下拉电阻。在无信号输入的情况下,输入端的电平可以保持在低电平;此模式下可以检测到外部高电平。

三、GPIO口相关寄存器分析

内存映射:将芯片内存空间分配的过程。

FLASH:0X080000000~0X080FFFFFF =1M

SRAM:CCM+112SRMA+16SRAM = 192KB

注意:CCM专门给内核使用的高速SRAM

112SRMA+16SRAM = 128KB组成如下:

FLASH数据空间组成:

寄存器映射:将一段具体的内存空间分配给某一个外设使用的的过程。
1.寄存器:寄存器就是一个变量,只不过这个变量的地址固定,变量名固定,也是一个全局变量。
寄存器可以同时被内部电路和外部电路或软件访问,CPU中的寄存器就是其中一种,作为软硬件的接口,广泛的应用在单片机电路中。
2寄存器的特点:
(1)寄存器地址是在芯片中固定好的即和相关硬件绑定在一起的,当向该寄存器写入不同的数据时,硬件的状态会跟随寄存器的数据改变而改变。{重点}
(2)通过寄存器的名字访问每个寄存器。  
3寄存器的操作:
寄存器赋值:寄存器名 = 值;
读寄存器的值:变量名 = 寄存器名。
4每个通用 I/O 组包括10个寄存器如下描述:
4 个 32 位配置寄存器( GPIOx_MODER、 GPIOx_OTYPER、GPIOx_OSPEEDR 和 GPIOx_PUPDR)、
2 个 32 位数据寄存器(GPIOx_IDR 和GPIOx_ODR)、
1 个 32 位置位/复位寄存器 (GPIOx_BSRR)、 
1 个 32 位锁定寄存器(GPIOx_LCKR) 
2 个 32 位复用功能选择寄存器( GPIOx_AFRH 和 GPIOx_AFRL)。

寄存器的访问方式

GPIOA

#define GPIOA             ((GPIO_TypeDef *) GPIOA_BASE)

#define GPIOA_BASE        (AHB1PERIPH_BASE + 0x0000)

#define AHB1PERIPH_BASE   (PERIPH_BASE + 0x00020000)

#define PERIPH_BASE       ((uint32_t)0x40000000)

typedef struct

{

  __IO uint32_t MODER;  

  __IO uint32_t OTYPER; 

  __IO uint32_t OSPEEDR;

  __IO uint32_t PUPDR;  

  __IO uint32_t IDR;    

  __IO uint32_t ODR;    

  __IO uint16_t BSRRL;  

  __IO uint16_t BSRRH;  

  __IO uint32_t LCKR;   

  __IO uint32_t AFR[2]; 

} GPIO_TypeDef;

GPIOA   0x40000000+0x00020000+ 0x0000 = (GPIO_TypeDef *) 0x40020000

可以看出ST将寄存器封装在结构体中,并强行转为结构体指针

所以可以使用结构体指针访问结构体成员,也就是寄存器(适用于所有的外设:GPIO UART….

GPIOA->ODR

GPIOA->IDR

STM32F407VGT6的GPIO相关的寄存器有以下几个:

GPIO 端口模式寄存器 (GPIOx_MODER) (x = A..I)(GPIOA_MODER地址:0x4002 0000)

MODERy[1:0]:端口 x 配置位 (Port x configuration bits) (y = 0..15)

这些位通过软件写入,用于配置 I/O 方向模式。

00:输入(复位状态)

01:通用输出模式

10:复用功能模式

11:模拟模式

举例PC4:配置为输出模式如何配置???

GPIOC->MODER &=~(3 << (4*2));

GPIOC->MODER |=0X1 << (4*2);

GPIO 端口输出类型寄存器 (GPIOx_OTYPER) (x = A..I)

位 31:16 保留,必须保持复位值。

位 15:0 OTy[1:0]:端口 x 配置位 (Port x configuration bits) (y = 0..15)

这些位通过软件写入,用于配置 I/O 端口的输出类型。

0:输出推挽(复位状态)

1:输出开漏

举例PC4:配置为推挽类型 如何配置???

GPIOC->OTYPER &=~(0X1 << 4);//推挽输出

GPIO 端口输出速度寄存器 (GPIOx_OSPEEDR) (x = A..I/)

OSPEEDRy[1:0]:端口 x 配置位 (Port x configuration bits) (y = 0..15)

这些位通过软件写入,用于配置 I/O 输出速度。

00:2 MHz(低速)

01:25 MHz(中速)

10:50 MHz(快速)

11:30 pF 时为 100 MHz(高速)(15 pF 时为 80 MHz 输出(最大速度))

配置多少的速度与功能相关。

注意:这里的速度指的是IO口的高低电平的切换速度,而且速度越大,功耗也越大。

举例PC4:配置为2mhz如何配置???

GPIOC->OSPEEDR &=~(0X3 << (4*2));

GPIO 端口上拉/下拉寄存器 (GPIOx_PUPDR) (x = A..I/)

PUPDRy[1:0]:端口 x 配置位 (Port x configuration bits) (y = 0..15)

这些位通过软件写入,用于配置 I/O 上拉或下拉。

00:无上拉或下拉(浮空)

01:上拉

10:下拉

11:保留

举例PC4:配置为无上下拉  如何配置???

GPIOC->PUPDR  &=~(0X3 << (4*2));//无上下拉

GPIO 端口输入数据寄存器 (GPIOx_IDR) (x = A..I)

位 31:16 保留,必须保持复位值。

位 15:0 IDRy[15:0]:端口输入数据 (Port input data) (y = 0..15)

这些位为只读形式,只能在只读模式下访问。它们包含相应 I/O 端口的输入值。

当前IO口的状态结果。

GPIO 端口输出数据寄存器 (GPIOx_ODR) (x = A..I)

位 31:16 保留,必须保持复位值。

位 15:0 ODRy[15:0]:端口输出数据 (Port output data) (y = 0..15)

这些位可通过软件读取和写入。

想要IO口输出高电平还是低电平,通过该寄存器写1/0操作即可。

GPIO 端口置位/复位寄存器 (GPIOx_BSRR) (x = A..I)

位 31:16 BRy:端口 x 复位位 y (Port x reset bit y) (y = 0..15)(让IO口输出低电平)

这些位为只写形式,只能在字、半字或字节模式下访问。读取这些位可返回值 0x0000。

0:不会对相应的 ODRx 位执行任何操作

1:对相应的 ODRx 位进行复位

注意: 如果同时对 BSx 和 BRx 置位,则 BSx 的优先级更高。

位 15:0 BSy:端口 x 置位位 y (Port x set bit y) (y= 0..15)(让IO口输出高电平)

这些位为只写形式,只能在字、半字或字节模式下访问。读取这些位可返回值 0x0000。

0:不会对相应的 ODRx 位执行任何操作

1:对相应的 ODRx 位进行置位

 RCC AHB1 外设时钟使能寄存器 (RCC_AHB1ENR)

时钟关系:由于STM32是一款低功耗的芯片,每个功能都进行时钟控制,不开启相应的时候,不能正常工作。使用到GPIO口,就必须开启GPIO口相关的时钟。

有芯片框图得知GPIO口挂载在AHB1总线上,它的时钟线就是AHB1时钟线。

时钟相关的配置在RCC单元中。RCC是专门的时钟控制单元。

四、GPIO口实验设计

设计思路:

硬件初始化

Void led_init(void)

{

IO配置:

1开时钟

2模式:输出模式

3类型:推挽

4速度:2MHZ(默认)

5上下拉:无上下拉(默认)(内部的上下拉很微弱)

注意:初始时刻灯默认不亮

}

点灯算法实现

按键识别(验证基本输入功能)
实验设计:让MCU检测IO口的输入电平,从而判断按键是否按下。

KEY1-->PA0  高电平按下

KEY2-->PE2 低电平按下

KEY3-->PE3 低电平按下

KEY4-->PE4 低电平按下

软件设计
硬件初始化
Void key_init(void)
{
    //IO配置:
1开时钟
2模式:输入模式
3上下拉:无上下拉(浮空输入) 
}

 

如何判断按键按下算法实现。

需要判断GPIO口的电平状态,去确定按键是否按下如下图(理想状态):

如上图所示按下之后是低电平,松开是高电平,但是按键按下过程中有按键不稳定的情况出现,所以,实现按键操作必须要进行消斗功能,为什么要消斗????

原因如下:

    因为按键都是机械式的,两个金属片在接触的瞬间,从微秒级的时间段来看,会存在接触-断开-再接触这样的轻微的抖动。直到两个金属片牢牢的接触到一起之后,抖动才会消失。

消斗原理:

所谓按键去抖动,就是通过各种处理(延时)来消除掉接触再断开这种异常状态的。

一般选择延时来去除抖动。

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

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

相关文章

How to add a jar to a project in eclipse?

Project -> Properties -> Java Build Path -> Libraries -> Add External JARs

前端多媒体处理工具——ffmpeg的使用

写在前面 在前端领域&#xff0c;FFmpeg 是一个非常有用的工具&#xff0c;它提供了多种媒体格式的封装和解封装&#xff0c;包括多种音视频编码、多种协议的流媒体、多种色彩格式转换、多种采样率转换、多种码率切换等。可以在多种操作系统安装使用。 安装 下载FFmpeg 在网…

免费Scrum管理工具-Leangoo领歌

Leangoo领歌是一款永久免费的专业的敏捷开发管理工具&#xff0c;提供端到端敏捷研发管理解决方案&#xff0c;涵盖敏捷需求管理、任务协同、进展跟踪、统计度量等。 
 Leangoo领歌上手快、实施成本低&#xff0c;可帮助企业快速落地敏捷&#xff0c;提质增效、缩短周期、加速…

vue PWA serviceWorker 有新内容时,如何自动刷新内容

vue PWA serviceWorker 有新内容时&#xff0c;如何自动刷新内容 一、问题描述 vue 自带的 pwa 插件可以很方便管理 serviceWorker 的使用&#xff0c;但会有一个问题。 ServiceWorker 的运行机制是这样的&#xff1a; 后台检测到新版本新版 ServiceWorker 下载并安装安装完…

【MySQL】8.0新特性、窗口函数和公用表表达式

文章目录 1. 新增特性2. 移除旧特性2.1 优点2.2 缺点 3. 新特性1&#xff1a;窗口函数3.1 使用窗口函数前后对比3.2 窗口函数分类3.3 语法结构3.4 分类讲解3.4.1 序号函数3.4.1.1 ROW_NUMBER()函数3.4.1.2 RANK()函数3.4.1.3 DENSE_RANK()函数 3.4.2 分布函数3.4.2.1 PERCENT_R…

Qt使用QListWidget实现自定义Item效果

Q&#xff1a;如何在Qt库的基础上&#xff0c;实现自定义控件呢&#xff1f; A&#xff1a;根据官方文档回答&#xff0c;就是继承需实现的控件&#xff0c;然后实现自定义功能。 以下是实现QListWidget控件的自定义item。 先看下最终效果是如何&#xff1a; listItem 主界面U…

linux安装新版本git2、配置github-ssh。(centos、aws)

一、安装Git 1、yum默认版本git #1.安装git sudo yum install git -y #2.确认Git已经安装成功 git --version如果要安装较新版本&#xff0c;可以安装一个repo &#xff0c;但是我这第一次尝试失败了&#xff0c;执行完提示找不到git2u&#xff0c;ius repo也连不上。而且每次…

HTML图像标签

html文件&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>图像标签学习</title> </head> <body> <img src"../resources/image/01.jpg" alt"小狗图…

通过WinSCP实现Windows给Ubuntu(Linux)虚拟机传输数据

要实现传输有几个准备工作需要做 1.在虚拟机运行工具&#xff08;VMware或者其他&#xff09;中设置网络&#xff08;或者网络适配器&#xff09;为桥接模式&#xff08;之前是NAT模式&#xff09; 2.使用ifconfig命令查看虚拟机的网络地址 3.确定虚拟机中安装了ssh 安装 sudo…

YOLOv5算法改进(17)— 手把手教你去更换损失函数(IoU/GIoU/DIoU/CIoU/EIoU/AlphaIoU/SIoU)

前言:Hello大家好,我是小哥谈。损失函数(loss function)是机器学习中用来衡量模型预测值与真实值之间差异的函数。它用于度量模型在训练过程中的性能,以便优化模型参数。在训练过程中,损失函数会根据模型的预测结果和真实标签计算出一个标量值,代表了模型预测的错误程度…

FreeRTOS_队列

目录 1. 队列简介 1.1 数据存储 1.2 多任务访问 1.3 出队阻塞 1.4 入队阻塞 1.5 队列操作过程 1.5.1 创建队列 1.5.2 向队列发送第一个消息 1.5.3 向队列发送第二个消息 1.5.4 从队列中读取消息 2. 队列结构体 3. 队列创建 3.1 函数原型 3.1.1 函数 xQueueCreate…

分类预测 | MATLAB实现SSA-CNN-LSTM麻雀算法优化卷积长短期记忆神经网络数据分类预测

分类预测 | MATLAB实现SSA-CNN-LSTM麻雀算法优化卷积长短期记忆神经网络数据分类预测 目录 分类预测 | MATLAB实现SSA-CNN-LSTM麻雀算法优化卷积长短期记忆神经网络数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现SSA-CNN-LSTM数据分类预测&…

Python 创建或读取 Excel 文件

Excel是一种常用的电子表格软件&#xff0c;广泛应用于金融、商业和教育等领域。它提供了强大的数据处理和分析功能&#xff0c;可进行各种计算和公式运算&#xff0c;并能创建各种类型的图表和可视化数据。Excel的灵活性使其成为处理和管理数据的重要工具。本文将介绍如何使用…

24---WPF缓存

一、什么是缓存&#xff1a; 1.缓存指的是将需要频繁访问的网络内容存放在离用户较近、访问速度更快的系统中&#xff0c;以提高内容访问速度的一种技术。缓存服务器就是存放频繁访问内容的服务器。 2.缓存就是一个临时存放区域--离用户比较近 二、作用--意义---如果系统出现故…

解决IDEA中SpringBoot项目创建多个子模块时配置文件小绿叶图标异常问题

在新建子模块下创建配置文件&#xff1a; 在子模块gateway中新建的配置文件,正常情况下配置文件左侧是小树叶标识&#xff0c;而这次新建application-dev.yml是个小树叶标识&#xff0c;bootstrap.yml是个方框。 看其他方案都是在project structure中设置&#xff0c;但未显示…

UWB安全数据通讯STS-加密、身份认证

DW3000系列才能支持UWB安全数据通讯&#xff0c;DW1000不支持 IEEE 802.15.4a没有数据通讯安全保护机制&#xff0c;IEEE 802.15.4z中指定的扩展得到增强&#xff08;在PHY/RF级别&#xff09;&#xff1a;增添了一个重要特性“扰频时间戳序列&#xff08;STS&#xff09;”&a…

【TensorFlow1.X】系列学习笔记【基础一】

【TensorFlow1.X】系列学习笔记【基础一】 大量经典论文的算法均采用 TF 1.x 实现, 为了阅读方便, 同时加深对实现细节的理解, 需要 TF 1.x 的知识 文章目录 【TensorFlow1.X】系列学习笔记【基础一】前言线性回归非线性回归逻辑回归总结 前言 本篇博主将用最简洁的代码由浅入…

KubeSphere安装mysql8

需要持久化储存数据的&#xff0c;建立有状态服务。 无状态服务是不会持久化的&#xff0c;重启就归零 KubeSphere 创建自建应用后&#xff0c;创建有状态服务&#xff0c;但是自己应用的有状态服务不能外放端口&#xff0c;需要在服务哪里删除pod&#xff0c;在创建负载指定相…

Android Studio(2022.3.1)设置阿里云源-新旧版本

新版本 #settings.gradle.ktsmaven { url uri("https://maven.aliyun.com/repository/public/") }maven { url uri("https://maven.aliyun.com/repository/google/") }maven { url uri("https://maven.aliyun.com/repository/jcenter/") }ma…

【算法|动态规划No.29】leetcode132. 分割回文串 II

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…