【STM32】GPIO

一、GPIO简介

1. 基本介绍

GPIO是通用输入输出端口的简称,STM32芯片通过GPIO与外设连接,从而实现与外设的数据收发。

  • 最基本的输出功能是由STM32控制引脚输出高、低电平,实现开关控制。如把GPIO引脚接入到LED灯控制LED亮灭,或者接入到三极管控制外部大功率电路的通断。
  • 最基本的输出功能是检测外部输入的高、低电平。如通过读取引脚的电平来区分按键是否被按下。
在这里插入图片描述

STM32的GPIO被分成了很多组/端口(Port),每个Port有16个引脚(Pin),如STM32F103ZET6芯片就有GPIOA~GPIOG 7个端口144个引脚,部分引脚除了作为GPIO使用之外,还有其它专用功能在复用。在这里插入图片描述

2. 工作模式

GPIO有8中工作模式,如图所示
在这里插入图片描述

浮空输入:由于没有接上拉电阻或下拉电阻,电平的高低完全取决于外部的输入,所以浮空输入电平极易受到外界的干扰,一般接按键会用到这个模式。

开漏输出等效电路如下图

在这里插入图片描述

  • 工作原理:Ug为高电平时,NMOS关闭,所以外部必须要接上拉电阻,此时OUT输出VDD电压,否则OUT既不输出高电平不输出低电平,为高阻态;Ug为低电平时,NMOS导通,OUT输出接地电压0V
  • 特性:开漏电路具有“线与”特性,即若有多个开漏模式的引脚连接到一起,只有所有都是高阻态时才会输出上来电阻电压,否则只要有一个引脚是低电平,整条线路都会输出低电平0V
  • 应用场景:一般应用在I2C、SMBUS通讯等需要“线与”的总线电路中,或者在驱动电平与输出电平不匹配的场景,如需要输出5V时,而由于STM32的GPIO引脚实际输出的是3.3V,此时就可以通过外部的上拉电阻来输出5V

推挽输出等效电路如下图

在这里插入图片描述

  • 工作原理:输出一个高电平经过反向器后,PMOS得到一个低电平后会导通,NMOS得到一个高电平后关闭,此时OUT对外输出高电平;输出一个低电平时经反相器后,PMOS关闭,NMOS导通,此时OUT对外输出一个低电平。
  • 特性:推挽输出高电平为3.3V,低电平为0V,当引脚高低电平切换时,两个MOS管轮流导通输出高低电平,提高了负载能力和开关速度。
  • 应用场景:一般应用在输出电平为0和3.3V高速切换开关状态的场合,STM32中,除了必须用开漏模式,一般更习惯用推挽输出模式。

3. 框图分析

在这里插入图片描述
1. 保护二极管

  • 两个二极管可以防止引脚外部输入过高或者过低的电压时,对芯片进行损坏,当引脚电压高于Vdd时上方二极管导通,电流不会进入芯片,当引脚电压低于Vss即负电压时下方二极管导通,电路不会吸取芯片的电流。以此防止不正常电压引入芯片导致芯片烧毁。
  • 即便如此,引脚也不可以直接驱动大功率器件时,如直接用引脚驱动电机,要么芯片烧毁,要么电机不转。

2. 输入、输出驱动器

  • 输入驱动器
    • 上拉电阻和下拉电阻,作用通俗来讲就是赋初值,当两个开关都是断开时就是浮空输入,
    • TTL肖特基触发器,作用就是将输入的模拟电压转为高低电平,如果要读取模拟数据,则不需要经过TTL肖特基触发器。
  • 输出驱动器。电路通过反向P-MOS和反向N-MOS,来实现了推挽输出和开漏输出两种模式。
    • 推挽输出:此时两个MOS管都会工作,控制输出高电平时,PMOS导通,NMOS关闭,电路输出Vdd电平;控制输出低电平时,PMOS关闭,NMOS导通,电路输出Vss电平。
    • 开漏输出:此时PMOS是无效的,只有NMOS工作。控制输出高电平时,电路为高阻态不输出电平,要想获取电平只能靠GPIO外部的电源;控制输出低电平时,NMOS导通,电路输出Vss电平

3. 输出数据寄存器

  • 通过写程序来设置输出数据寄存器GPIOx_ODR的值,以此来实现输出控制高低电平image-20230630232227368

  • 置位/复位寄存器GPIOx_BSRR可以通过修改输出数据寄存器的值来影响电路的输出

在这里插入图片描述

4. 复用功能输出

image-20230630233140463

  • GPIO的引脚除了当作STM32芯片的通用IO口使用之外,还有其它片上外设也可以对其进行控制,即为了减少引脚的数量而对引脚进行了复用,通过输出控制前的选择器来选择数据来源于输出数据寄存器还是片上外设
  • 如进行串口通信,需要进行数据发送时,就可以将UARTx_TX对应的GPIO引脚配置成USART串口复用功能,然后通过该引脚发送数据

5. 输入数据寄存器:就是将肖特基触发器转换后的0/1数字信号,存储到输入数据寄存器中GPIOx_IDR中,通过读取该寄存器就可以知道该该GPIO引脚的电平image-20230630234404716

6. 复用功能输入与复用功能输出类似,不多介绍

7. 模拟输入:一般用于ADC采集电压,此时信号不经过肖特基触发器,从而得到ADC外设采集到的原始模拟信号

4. 寄存器

GPIO配置寄存器:GPIO的每个端口都有2个对应的端口配置寄存器,端口上的每个引脚需要4位来进行配置,因此每个寄存器只能配置8个引脚,所以每个端口的16个引脚需要2个寄存器来配置。

image-20230701000214610

image-20230701000237663

  • 输入模式:肖特基触发器打开,可以通过GPIOx_IDR寄存器读取IO状态,此时GPIOx_ODR无效。
  • 推挽/开漏输出模式:推挽输出时双MOS管都工作,开漏输出时只有NMOS工作,可以同GPIOx_ODR寄存器输出高低电平,此时输出速度配置的越高功耗越大。输出模式时,肖特基触发器是打开的,所以即便是输出模式也可以通过GPIOx_IDR读取IO的实际状态。
  • 复用推挽/开漏输出:复用功能模式时可以配置输出使能和速度,此时GPIOx_ODR无效,但可以通过GPIOx_IDR寄存器读取IO状态,一般直接用外设寄存器来获取。

端口输入数据寄存器

image-20230701002027308

端口输出数据寄存器

image-20230701002052365

端口位设置/清除寄存器

image-20230701002107920

二、程序示例

1. GPIO输出——点亮LED

1.1 原理图

  • LED_R/G/B分别与GPIO的PB5/0/1相连
  • LED共阳极,因此当GPIO输出低电平时LED点亮,高电平LED灭

image-20230701002936381

1.2 配置寄存器

控制LED为输出

  • GPIOB_CRL的[MODE0/1/5]配置为输出模式,最大速度50MHz(此处对最大速度无要求,随便选一个即可)
  • GPIOB_CRL的[CNF0/1/5]配置为通用推挽输出模式

控制LED灯亮

  • GPIOB_ODR的[ODR0/1/5]配置为0,或者对GPIOB_BSRR的[BR0/1/5]置1并且对[BS0/1/5]清0

控制LED灯灭

  • GPIOB_ODR的[ODR0/1/5]配置为1,或者对GPIOB_BSRR的[BS0/1/5]置1

1.3 程序示例

/* --------------------bsp_gpio_led.h--------------------- */
/* 自定义数据结构 */
#define LED_PORT		GPIOB

typedef enum
{
	LED_R = GPIO_Pin_5,
	LED_G = GPIO_Pin_0,	
	LED_B = GPIO_Pin_1,	
}LED_Typedef;

/* -------------------bsp_gpio_led.c--------------------- */
void GPIO_LED_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Pin  	= LED_R;
	GPIO_InitStruct.GPIO_Speed 	= GPIO_Speed_2MHz;
	GPIO_InitStruct.GPIO_Mode 	= GPIO_Mode_Out_PP;

	
	GPIO_Init(LED_PORT, &GPIO_InitStruct);
}

void GPIO_LED_On(LED_Typedef LED_Type)
{
	GPIO_ResetBits(LED_PORT, (uint16_t)LED_Type);
}
void GPIO_LED_Off(LED_Typedef LED_Type)
{
	GPIO_SetBits(LED_PORT, (uint16_t)LED_Type);
}

2. GPIO输入——检测按键

2.1 原理图

在这里插入图片描述

  • 由于下拉GND的存在,当松开按键时,PA0和PC13引脚读取到低电平
  • 按下按键时,3V3导通,PA0和PC13读取到高电平

2.2 数据手册

在这里插入图片描述

2.3 示例代码

/* --------------------bsp_gpio_key.h--------------------- */
#define KEY1_PORT		GPIOA
#define KEY2_PORT		GPIOC

typedef enum
{
	KEY1 = GPIO_Pin_0,
	KEY2 = GPIO_Pin_13
}KEYNum_Typedef;

typedef enum
{
	Key_Relase,
	Key_Press
}KEYStatus_Typedef;

/* --------------------bsp_gpio_key.c--------------------- */
void GPIO_KEY_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Pin  	= KEY1;
  	GPIO_InitStruct.GPIO_Mode 	= GPIO_Mode_IN_FLOATING;

	GPIO_Init(KEY1_PORT, &GPIO_InitStruct);
}

/* 返回指定按键的状态 */
KEYStatus_Typedef GPIO_KEY_Status(KEYNum_Typedef KEYNum)
{
	KEYStatus_Typedef ret_status;
	if(KEYNum == KEY1)			
		ret_status = GPIO_ReadInputDataBit(KEY1_PORT, KEYNum);
	else			
		ret_status = GPIO_ReadInputDataBit(KEY2_PORT, KEYNum);
		
	return ret_status;
}


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

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

相关文章

49天精通Java,第0天,编程语言类型有哪些?我心中的TOP1编程语言,什么是java跨平台性?

目录 一、常见的编程语言类型1、机器语言2、汇编语言3、高级语言 二、计算机编程语言三、跨平台性1、跨平台的优势包括:2、实现跨平台的方式包括: 四、Java的跨平台性五、java运行时和虚拟机六、Java内存管理和Java垃圾回收1、Java内存管理2、Java垃圾回…

SSM学习笔记-------SpringMVC(二)

SSM学习笔记-------SpringMVC(二) SpringMVC_day021、SSM整合1.1 流程分析1.2 整合配置步骤1:创建Maven的web项目步骤2:添加依赖步骤3:创建项目包结构步骤4:创建SpringConfig配置类步骤5:创建JdbcConfig配置类步骤6:创建MybatisConfig配置类步…

ACL 2023|如何智能生成吸引人又符合实际的标题?

夕小瑶科技说 原创 作者 | 小戏、Python 标题生成,乍一看似乎并不是一个复杂的任务,要数据简单的爬虫就可以获得许多标题-文本对,要评价通过用户点击与浏览的次数就多少可以区分“好标题”与“坏标题”,万事俱备使用一些经典的监…

HTTP/HTTPS 简介||HTTP 消息结构

HTTP/HTTPS 简介 HTTP 协议是 Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网( WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。 HTTP 是一个基于 TCP/IP 通信协议来传递数据&a…

IBM N系列存储和NetApp FAS之间的对应关系

IBM在很长一段时间都是OEM NetApp的FAS存储作为他的NAS产品线,在IBM叫做Storage N series,就是N系列,在2014年IBM终止了和NetApp之间的OEM关系,目前在市场上的OEM的NetApp存储型号主要是 FAS3000,FAS31和FAS32的中端系…

【新星计划·2023】Linux系统的架构和组件讲解

作者:Insist-- 个人主页:insist--个人主页 作者会持续更新网络知识和python基础知识,期待你的关注 前言 本文将讲解Linux系统的架构和组件。 目录 一、Linux系统的架构 1、硬件层 2、内核层 3、进程管理子系统 4、内存管理子系统 5、…

C语言 base32与base64加解密

概述 Base32、Base64编码就是分别用32个、64个可打印字符表示二进制数据。 一、Base32规则 32 2^5,所以需要5 Bit来表示一个base32字符。一个字节8 Bit,5和8的最小公倍数是40。编码的过程中,以5个字节为一组转为8个base32字符,不…

服务端⾼并发分布式结构演进之路

1.前置概念 应⽤(Application)/系统(System) 为了完成一整套服务的一个程序或相互配合的程序群 模块(Module)/组件(Component) 当应⽤较复杂时,为了分离职责&#xf…

2023年测试之路,从功能测试进阶测试开发工程师,突破内卷...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 测试开发工程师到…

SpringBoot配置外部Tomcat项目启动流程源码分析

前言 SpringBoot应用默认以Jar包方式并且使用内置Servlet容器(默认Tomcat),该种方式虽然简单但是默认不支持JSP并且优化容器比较复杂。故而我们可以使用习惯的外置Tomcat方式并将项目打War包。 【1】创建项目并打War包 ① 同样使用Spring Initializer方式创建项目 …

并发编程_jmm部分

1. JMM 理解 前提:并发编程有3大问题,可见性、有序性、原子性。 导致可见性的原因是缓存,有序性的原因是 编译器优化。解决方法就是直接禁用缓存和编译器优化,导致程序性能堪忧。 因此合理的方案就是按需禁用缓存和编译器优化。 …

JUC之ThreadLocal

文章目录 1 基础知识1.1 强软弱虚四种引用 2 ThreadLocal出现的好处3 ThreadLocal源码分析3.1 ThreadLocal内存泄露问题3.2 ThreadLocal为什么使用的是弱引用3.3 清扫过期的Entry 4 ThreadLocal使用建议 1 基础知识 1.1 强软弱虚四种引用 【整体结构】 【强引用】 【软引用…

初始网络原理

目录 网络发展史 独立模式 网络互连 局域网LAN 广域网WAN 网络通信基础 IP地址 端口号 认识协议 五元组 协议分层 OSI七层模型 TCP/IP五层(或四层) 网络设备所在分层 封装和分用 网络发展史 独立模式 独立模式:计算机之间相互…

【技能实训】Day01

文章目录 任务1 项目准备一、开发环境二、系统简介三、项目创建 任务2【任务2.1】菜单项设计及其测试【任务2.2】使用数组存储采集的数据【任务2.3】控制显示采集的数据 任务1 项目准备 一、开发环境 1.JDK8下载及其环境变量配置(JDK8以上版本) 2.IDE :Eclipse 或…

应用层:万维网WWW

1.万维网WWW 笔记来源: 湖科大教书匠:应用层概述 湖科大教书匠:万维网WWW 声明:该学习笔记来自湖科大教书匠,笔记仅做学习参考 浏览器最重要的部分是渲染引擎,也就是浏览器内核。负责对网页内容进行解析和…

postgresql 数据库 索引 介绍

postgresql 数据库 索引 介绍 文章目录 postgresql 数据库 索引 介绍前言一 什么是索引?二 简介三 索引的种类B-treeHash索引GiST索引GIN 索引BRIN 索引SP-GiST索引 CREATE INDEX1.大纲2.描述3. 参数UNIQUECONCURRENTLYIF NOT EXISTSINCLUDEnameONLYmethodcolumn_na…

Vue3:在 VSCode 中如何成功安装 Mockjs 及成功引入 Mock 的详细过程

Ⅰ、Mock 简介: 1、什么是 Mock? 其一、Mock 的解释一: Mock 服务是指在测试过程中对于某些复杂(或者不太好构造)的对象,用一个虚拟的对象替代它;对于前端来说,就是后台数据还没有…

RS485或RS232转ETHERCAT连接安川ethercat总线伺服

最近,生产管理设备中经常会遇到两种协议不相同的情况,这严重阻碍了设备之间的通讯,串口设备的数据不能直接传输给ETHERCAT。这可怎么办呢? 别担心,远创智控YC-ECT-RS485/232来了!这是一款自主研发的ETHER…

数据结构第一章 绪论——走进数据的世界

名人说:唯一可以确定的是,明天会使我们所有人大吃一惊。——阿尔文托夫勒 本篇笔记整理:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) ✔ 课件资料及视频课程学习:王道 数据结构&#xff08…

Linux 网络延迟排查方法详解

概要 在 Linux 服务器中,可以通过内核调优、DPDK 以及 XDP 等多种方式提高服务器的抗攻击能力,降低 DDoS 对正常服务的影响。在应用程序中,可以使用各级缓存、WAF、CDN 等来缓解 DDoS 对应用程序的影响。 但是需要注意的是,如果 …