【STM32开发】GPIO最全解析及应用实例

2024-09-03 21:12

本文主要是介绍【STM32开发】GPIO最全解析及应用实例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

【1】GPIO概述

GPIO的基本概念

GPIO的应用

【2】GPIO功能描述

1.IO功能框图

2.知识补充

3.功能详述

浮空输入

上拉输入

下拉输入

模拟输入

推挽输出

开漏输出

复用开漏输出和复用推挽输出

【3】GPIO常用寄存器

相关寄存器介绍

4个32位配置寄存器

2个32位数据寄存器

1个32位 置位/复位寄存器

2个32位 复用功能配置寄存器

常用寄存器详述

GPIO端口模式寄存器(GPIOx_MODER)(x=A...D,F)

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

GPIO 口输出速度寄存器 (GPIOx_OSPEEDR) (x = A..D,F)

GPIO 口上拉 / 下拉寄存器 (GPIOx_PUPDR) (x = A..D,F)

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

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

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

 

【4】GPIO实验:点亮LED灯

实验步骤

1.观察开发板

2.分析原理图

3.分析寄存器

4.编写代码

5.编译下载

6.运行测试

结语


【1】GPIO概述

GPIO的基本概念

GPIO,即通用输入输出接口,是一种在数字电子系统中常见的接口类型。GPIO接口既可以作为输入引脚接收来自外部设备的电信号,也可以作为输出引脚向外部设备发送电信号。其“通用”二字意味着GPIO接口具有高度的灵活性,可以根据需要配置为输入或输出模式,实现与外部设备的通信和控制。

GPIO的应用

GPIO在嵌入式系统中的应用极为广泛,包括但不限于以下几个方面:

  1. 设备控制:通过GPIO控制LED灯、数码管、继电器等外部设备的开关状态。
  2. 数据采集:读取按键、光照传感器、ADC(模拟数字转换器)等外部设备的输入信号。
  3. 通信接口:GPIO可以作为串口(如USART)、I2C、SPI等通信协议的数据收发管脚,实现与外部设备的通信。
  4. 复用功能:在某些情况下,GPIO引脚可以被配置为特定外设的接口,如定时器的外部触发输入等。

【2】GPIO功能描述

      查看技术手册的图 第8章通用IO 

1.IO功能框图

2.知识补充

   这里对图中涉及的一些知识点做简要说明,以帮助初学者能够读懂功能框图。

1.模拟信号和数字信号的区别?

模拟信号:连续变化的值,例如读取到的连续的电压值、温度、压力等。

数字信号:离散的数值,通常可以用“0”和“1”两种状态来表示。

2. 施密特触发器的作用

由于外部输入的信号,可能会出现脉冲等噪声的影响,为了让信号更加清晰,所以就设置了TTL施密特触发器来进行整形。

3.VCC、VDD和VSS说明

VCC:接入电路的电压

VDD:器件内部的工作电压,通常VCC>VDD

VSS:电路公共接地端电压

3.功能详述

浮空输入

IO--TTL施密特触发器--输入寄存器--读

通俗讲就是让管脚什么都不接,悬空着。

此时VDD和VSS所在路径的两个开关同时断开。因为没有上拉和下拉,所以当IO口没有接输入的时候,此时的电平状态会是一个不确定的值,完全由外部输入决定。

一般实际运用时,引脚不建议悬空,易受干扰。

优势:

这一种输入模式的电平会完全取决于外部电路而与内部电路无关。

缺点:

在没有外部电路接入的时候,IO脚浮空会使得电平不确定

应用:

该模式是STM32复位之后的默认模式,一般用作对开关按键的读取或用于标准的通讯协议,比如IIC、USART的等。

上拉输入

IO--上拉电阻--TTL施密特触发器--输入寄存器--读

上拉就是把电位拉高。此时如果I/O口断开不接外设,输入端的电平会保持在高电平。

上拉输入就是信号进入芯片后加了一个上拉电阻,再经过施密特触发器转换成0、1信号,读取此时的引脚电平为高电平

上拉:当我们闭合上拉电阻的开关,断开下拉电阻的开关的时候,也就是此时为上拉通路导通。

优势:输入的电平不会因上下浮动而导致输入信号不稳定,在没有信号输入的情况下可以稳定在高电平。

下拉输入

IO--下拉电阻--TTL施密特触发器--输入寄存器--读

下拉就是把电位拉低。与上拉原理相似。

下拉输入就是信号进入芯片后加了一个下拉电阻,再经过施密特触发器转换成0、1信号,读取此时的引脚电平为低电平;

优势:输入的电平不会上下浮动而导致输入信号不稳定,在没有信号输入的情况下可以稳定在低电平。

模拟输入

IO----模拟

信号进入后不经过上拉电阻或者下拉电阻,关闭施密特触发器,经由另一线路把电压信号传送到片上外设模块。所以可以理解为模拟输入的信号是未经处理的信号,是原汁原味的信号。

应用:当 GPIO 引脚用于 ADC 采集电压的输入通道时,则需要选择“模拟输入”功能,因为经过施密特触发器后信号只有 0、1 两种状态,所以 ADC 外设要采集到原始的模拟信号,信号源输入必须在施密特触发器之前。

推挽输出

输出寄存器上的’0’激活 N-MOS,而输出寄存器上的’1’将激活 P-MOS,具备输出高低电平的能力。

当上面的MOS管导通时,GPIO输出高电平1,称为“推”,

当下面MOS管导通时,GPIO输出低电平0,称为“挽”。

高低电平值由芯片内部的电源决定。

开漏输出

输出寄存器上的’0’激活 N-MOS,使得输出接地。

输出寄存器上的’1’将端口置于高阻状态 (P-MOS从不被激活)。

所以引脚既不输出高电平,也不输出低电平。

即:写0输出低电平,写1输出高阻态(High Impedance)

无法真正输出高电平,即高电平时没有驱动能力,需要借助外部上拉电阻完成对外驱动。

可以利用改变上拉电源的电压来适应所需,进而提高外部电路的驱动能力。

复用开漏输出和复用推挽输出

复用推挽和复用开漏其实很简单,如果不想用单片机内部来输出控制,那么可以进行复用,将输出转移到其他外设上面,由外设的信号驱动输出缓冲器。

【3】GPIO常用寄存器

相关寄存器介绍

4个32位配置寄存器

GPIOx_MODER:模式寄存器,用于配置GPIO引脚的工作模式(输入、输出、复用、模拟等)。

GPIOx_OTYPER:输出类型寄存器,用于配置GPIO引脚为输出时的类型(推挽输出或开漏输出)。

GPIOx_OSPEEDR:输出速度寄存器,用于配置GPIO引脚输出信号的速度。

GPIOx_PUPDR:上拉/下拉寄存器,用于配置GPIO引脚的上拉或下拉电阻。

2个32位数据寄存器

GPIOx_IDR:输入数据寄存器,只读,用于读取GPIO引脚当前的输入电平状态。

GPIOx_ODR:输出数据寄存器,用于设置GPIO引脚当前的输出电平状态。

1个32位 置位/复位寄存器

GPIOx_BSRR :可以直接置位或复位,对其他位没影响

2个32位 复用功能配置寄存器

GPIOx_AFRH 复用功能高位寄存器(8-16)

GPIOx_AFRL 复用功能低位寄存器 (0-7)

常用寄存器详述

GPIO端口模式寄存器(GPIOx_MODER)(x=A...D,F)

偏移地址:0x00

复位值:

0xEBFF FFFF 端口A

0xFFFF FFFF 其他口

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

偏移地址:0x04

复位值: 0x0000 0000

GPIO 口输出速度寄存器 (GPIOx_OSPEEDR) (x = A..D,F)

偏移地址:0x08

复位值: 0x0000 0000

GPIO 口上拉 / 下拉寄存器 (GPIOx_PUPDR) (x = A..D,F)

偏移地址:0x0C

复位值:

0x2400 0000 端口A

0x0000 0000 其它端口

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

偏移地址:0x10

复位值: 0x0000 XXXX (X 表明不定 )

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

偏移地址:0x14

复位值: 0x0000 0000

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

偏移地址:0x18

复位值:0x0000 0000

【4】GPIO实验:点亮LED灯

实验步骤

1.观察开发板

查看LED灯的丝印

2.分析原理图

      找到控制LED灯的引脚编号,并通过分析电路,确定输出高/低电平信号来点亮LED。

      这里我们以PB1引脚为例,假设让芯片的PB1引脚输出低电平信号即可点亮LED灯。

3.分析寄存器

1)使能GPIOB端口时钟

RCC->IOPENR |= 1<<1;   //使能GPIOB端口时钟

2)配置GPIO模式

将PB1引脚配置为输出模式

3)配置输出类型

将PB1配置为推挽输出模式

4)配置输出数据寄存器

让PB1输出低电平信号

方式一:配置置位复位寄存器

方式二:配置输出数据寄存器

4.编写代码

5.编译下载

6.运行测试

下载完代码后,按下单片机复位键重新上电,观察LED状态。

结语

STM32的GPIO接口功能强大、配置灵活,是嵌入式系统开发中不可或缺的一部分。通过合理配置GPIO引脚的工作模式、输出类型、速度等参数,可以实现与外部设备的有效通信和控制。本文详细介绍了GPIO的概念、应用、功能及相关寄存器,并给出了一个简单的开发示例,希望能为开发者在STM32 GPIO开发过程中提供一些帮助。

创作不易,如果感觉这篇文章对你有帮助,记得点赞收藏。

这篇关于【STM32开发】GPIO最全解析及应用实例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1134058

相关文章

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

一文解析C#中的StringSplitOptions枚举

《一文解析C#中的StringSplitOptions枚举》StringSplitOptions是C#中的一个枚举类型,用于控制string.Split()方法分割字符串时的行为,核心作用是处理分割后... 目录C#的StringSplitOptions枚举1.StringSplitOptions枚举的常用

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工