
(1)保护二极管
引脚内部加上这两个保护二级管可以防止引脚外部过高或过低的电压输入,
当引脚电压高于 VDD_FT 或 VDD 时,上方的二极管导通吸收这个高电压,当引脚
电压低于 VSS 时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。
尽管 STM32 芯片内部有这样的保护,但并不意味着 STM32 的引脚就无所不能,如
果直接将引脚连接大功率器件,比如电机,那么要么电机不转,要么烧坏芯片。
如果要驱动一些大功率器件,必须要加大功率及隔离电路驱动。也可以说 STM32
引脚是用来做控制,而不是做驱动使用的。
(2)上下拉电阻
从图中可以看到,上拉和下拉电阻上都有一个开关,通过配置上下拉电阻开
关,可以控制引脚的默认状态电平。当开启上拉时引脚默认电压为高电平,开启
下拉时,引脚默认电压为低电平,这样就可以消除引脚不定状态的影响。当然也
可以将上拉和下拉的开关都关断,这种状态我们称为浮空模式,一旦配置成这个
模式,引脚的电压是不确定的,如果用万用表测量此模式下管脚电压时会发现只
有 1 点几伏,而且还不时改变,所以一般情况下我们都会给引脚设置成上拉或者
下拉模式,使它有一个默认状态。STM32 上下拉及浮空模式的配置是通过
GPIOx_CRL 和 GPIOx_CRH 寄存器控制的,大家可以通过《STM32F1xx 中文参考手
册》查阅。
STM32 内部的上拉其实是一个弱上拉,也就是说通过此上拉电阻输出的电流
很小,如果想要输出一个大电流,那么就需要外接上拉电阻了。
(3)P-MOS 和 N-MOS 管
GPIO 引脚经过两个保护二极管后就分成两路,上面一路是“输入模式”,
下面一路是“输出模式”。我们先讲输出模式,线路经过一个由 P-MOS 和 N-MOS
管组成的单元电路,这让 GPIO 引脚具有了推挽和开漏两种输出模式。
所谓推挽输出模式,是根据 P-MOS 和 N-MOS 管的工作方式命名的。在该结构
单元输入一个高电平时,P-MOS 管导通,N-MOS 管截止(可以将 P-MOS 当作 NPN
三极管,N-MOS 当作 PNP 三极管来看就非常清楚),对外输出高电平(3.3V)。
在该单元输入一个低电平时,P-MOS 管截止,N-MOS 管导通,对外输出低电平(0V)。
如果当切换输入高低电平时,两个 MOS 管将轮流导通,一个负责灌电流(电流输
出到负载),一个负责拉电流(负载电流流向芯片),使其负载能力和开关速度
都比普通的方式有很大的提高。图 7.1.4 为推挽输出模式的等效电路。
在开漏输出模式时,不论输入是高电平还是低电平,P-MOS 管总处于关闭状
态。当给这个单元电路输入低电平时,N-MOS 管导通,输出即为低电平。当输入
高电平时,N-MOS 管截止,这个时候引脚状态既不是高电平,又不是低电平,我
们称之为高阻态。如果想让引脚输出高电平,那么引脚必须外接一个上拉电阻,
由上拉电阻提供高电平。开漏输出模式等效电路图如图 7.1.5 所示。
在开漏输出模式中还有一个特点,引脚具有“线与”关系。就是说如果有很
多个开漏输出模式的引脚接在一起,只要有一个引脚为低电平,其他所有管脚都
为低,即把所有引脚连接在一起的这条总线拉低了。只有当所有引脚输出高阻态
时这条总线的电平才由上拉电阻的 VDD 决定。如果 VDD 连接的是 3.3V,那么引
脚输出的就是 3.3V,如果 VDD 连接的是 5V,那么引脚输出的就是 5V。因此如果
想要让 STM32 管脚输出 5V,可以选择开漏输出模式,然后在外接上拉电阻的电
源 VDD 选择 5V 即可,前提是这个 STM32 引脚是容忍 5V 的。开漏输出模式一般应
用在 I2C、SMBUS 通讯等需要“线与”功能的总线电路中。还可以用在电平不匹
配的场合中,就如上面说的输出 5V 一样。
推挽输出模式一般应用在输出电平为 0-3.3V 而且需要高速切换开关状态的
场合。除了必须要用开漏输出模式的场合,我们一般选择推挽输出模式。要配置
引脚是开漏输出还是推挽输出模式可以使用 GPIOx_CRL 和 GPIOx_CRH 寄存器,寄
存器详细内容可以参考《STM32F1xx 中文参考手册》“通用和复用 I/O(GPIO 和
AFIO)”章节。
(4)输出数据寄存器
前面提到的双 MOS 管结构电路的输入信号,是由 GPIO“输出数据寄存器
GPIOx_ODR”提供的,因此我们通过修改输出数据寄存器的值就可以修改 GPIO 引
脚的输出电平。而“置位/复位寄存器 GPIOx_BSRR”可以通过修改输出数据寄存
器的值从而影响电路的输出。
(5)复用功能输出
由于 STM32 的 GPIO 引脚具有第二功能,因此当使用复用功能的时候,也就
是通过其他外设复用功能输出信号与 GPIO 数据寄存器一起连接到双 MOS 管电路
的输入,其中梯形结构是用来选择使用复用功能还是普通 IO 口功能。例如我们
使用 USART 串口通讯时,需要用到某个 GPIO 引脚作为通讯发送引脚,这个时
候就可以把该 GPIO 引脚配置成 USART 串口复用功能,由串口外设控制该引脚,
发送数据。
(6)输入数据寄存器
输入数据寄存器是由 IO 口经过上下拉电阻、施密特触发器引入。当信号经
过触发器,模拟信号将变为数字信号 0 或 1,然后存储在输入数据寄存器中,通
过读取输入数据寄存器 GPIOx_IDR 就可以知道 IO 口的电平状态。
(7)复用功能输入
此模式与前面讲解的复用功能输出类似。在复用功能输入模式时,GPIO 引
脚的信号传输到 STM32 其他片上外设,由该外设读取引脚的状态。同样,如我们
使用 USART 串口通讯时,需要用到某个 GPIO 引脚作为通讯接收引脚,这个时
候就可以把该 GPIO 引脚配置成 USART 串口复用功能,使 USART 可以通过该通
讯引脚的接收远端数据。
(8)模拟输入输出
当 GPIO 引脚用于 ADC 采集电压的输入通道时,用作“模拟输入”功能,
此时信号是不经过施密特触发器的,因为经过施密特触发器后信号只有 0、1 两
种状态,ADC 外设要采集到原始的模拟信号,信号源输入必须在施密特触发器之
前。类似地,当 GPIO 引脚用于 DAC 作为模拟电压输出通道时,此时作为“模
拟输出”功能, DAC 的模拟信号输出就不经过双 MOS 管结构了,模拟信号直接
通过管脚输出。
- 使用寄存器点亮LED(第1节)—GPIO功能框图讲解
GPIO简介 GPIO 是通用输入输出端口的简称,简单来说就是 STM32 可控制的引脚, STM32 芯片的 GPIO 引脚与外部设备连接起来,从而实现与外部通讯.控制以及数据采集的功能.STM32 ...
- stm32学习笔记之GPIO功能框图分析
GPIO 是通用输入输出端口的简称,简单来说就是STM32 可控制的引脚,STM32 芯片的GPIO 引脚与外部设备连接起来,从而实现与外部通讯.控制以及数据采集的功能.STM32 芯片的GPIO被分 ...
- 树莓派学习路程No.1 GPIO功能初识 wiringPi安装
WiringPi是应用于树莓派平台的GPIO控制库函数,WiringPi遵守GUN Lv3.wiringPi使用C或者C++开发并且可以被其他语言包转,例如python.ruby或者PHP等.Wiri ...
- 树莓派学习路程No.2 GPIO功能初识 wiringPi安装
WiringPi是应用于树莓派平台的GPIO控制库函数,WiringPi遵守GUN Lv3.wiringPi使用C或者C++开发并且可以被其他语言包转,例如python.ruby或者PHP等.Wiri ...
- 树莓派学习笔记——GPIO功能学习
0.前言 树莓派现在越来越火,网上树莓派的资料也越来越多.树莓派的学习可以分为linux系统学习和linux驱动学习,利用树莓派制作LED流水灯应该算是驱动学习吧.树莓派来自国外,国外嵌入式开 ...
- imx6q GPIO功能的用法
假如我们要使用扩展口的第11脚EIM_D18. 先在arch/arm/plat-mxc/include/mach/iomux-mx6q.h中找有EIM_18. 能够找到MX6Q_PAD_EIM_D18 ...
- SysTick系统定时器(功能框图和优先级配置)
SysTick—系统定时器是属于 CM3 内核中的一个外设,内嵌在 NVIC 中.系统定时器是一个 24bit (2^24)的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般我们设置 ...
- LPC4370使用学习:GPIO的引脚功能使用,和12864OLED模拟I2C驱动
一: 手中有块LPC4370的开发板,因为便宜,所以引脚引出的不多,而且只有基本的底板资源驱动代码和例程. 看着手册和例程看了老半天,写程序写了半天,结果GPIO老是驱动不起来,因为引脚配置寄存器中有 ...
- stm32开发笔记(二):stm32系列使用V3.5固件库的帮助文件以及GPIO基本功能(一)
前言 stm32系列是最常用的单片机之一,不同的版本对应除了引脚.外设.频率.容量等'不同之外,其开发的方法是一样的. 本章讲解使用库函数使用GPIO引脚功能. 补充 本文章为多年前学习 ...
随机推荐
- Spring Boot集成H2数据库
需求 平时学习的时候,涉及到一些连接数据库相关的操作,经常需要初始化本地数据库,比如装个MySQL,初始化一些脚本,比较麻烦,H2是内存数据库,Spring Boot可以在应用启动的时候对H2数据库初 ...
- linux文档目录
- Java基础知识面试题及答案-整理
1.String类可以被继承吗? 不能.String类在声明中使用final关键字修饰符.使用final关键字修饰的类无法被继承. Java语言的开发者为什么要将String类定义为final类呢? ...
- 解决el-tree横向滚动条问题
代码如下 效果如图 仅做下记录,不做过多解释
- LaunchScreen作为启动图设置,修改无效的解决方案
原有的推流APP用launchScreen做的启动图,现在要修改一张,发现修改无效. 当前测试的方法有 1,重启Xcode 卸载app 清楚xcode缓存 2,修改launchScreen.stor ...
- BZOJ1077 并查集
1077: [SCOI2008]天平 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 416 Solved: 224[Submit][Status][ ...
- 基于Unity实现油画风格的着色器
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' Shader "Cust ...
- 如何为Form表单的多个提交按钮指定不同的Action地址?
这是我很久以前看到的一个技巧,但我忘记在哪里了,当时遇到这样的需求,做了笔记,现在整理成文章分享出来,因为我感觉这个小技巧还是挺有用的,这种应用场景也算比较常见,比如一个表单有"保存&quo ...
- Python的元类简单介绍
* 类型 和类 在Python中,一切都是对象.类也是对象.所以一个类必须有一个类型 注意: 1.type Python3中所有的类都是通过type来创建出来的 2.object:Python3中所有 ...
- C++ 海量代码 排查内存/GDI泄漏历程
排查分两大部分: 1.代码静态分析,通过Code Review查找不合规范的代码点: 2.运行目标软件,结合内存监控工具,分析目标软件的代码,定位内存泄漏点. 目前能找到的代码静态分析软件:Cover ...