(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 管结构了,模拟信号直接
通过管脚输出。 

GPIO功能框图的更多相关文章

  1. 使用寄存器点亮LED(第1节)—GPIO功能框图讲解

    GPIO简介 GPIO 是通用输入输出端口的简称,简单来说就是 STM32 可控制的引脚, STM32 芯片的 GPIO 引脚与外部设备连接起来,从而实现与外部通讯.控制以及数据采集的功能.STM32 ...

  2. stm32学习笔记之GPIO功能框图分析

    GPIO 是通用输入输出端口的简称,简单来说就是STM32 可控制的引脚,STM32 芯片的GPIO 引脚与外部设备连接起来,从而实现与外部通讯.控制以及数据采集的功能.STM32 芯片的GPIO被分 ...

  3. 树莓派学习路程No.1 GPIO功能初识 wiringPi安装

    WiringPi是应用于树莓派平台的GPIO控制库函数,WiringPi遵守GUN Lv3.wiringPi使用C或者C++开发并且可以被其他语言包转,例如python.ruby或者PHP等.Wiri ...

  4. 树莓派学习路程No.2 GPIO功能初识 wiringPi安装

    WiringPi是应用于树莓派平台的GPIO控制库函数,WiringPi遵守GUN Lv3.wiringPi使用C或者C++开发并且可以被其他语言包转,例如python.ruby或者PHP等.Wiri ...

  5. 树莓派学习笔记——GPIO功能学习

    0.前言     树莓派现在越来越火,网上树莓派的资料也越来越多.树莓派的学习可以分为linux系统学习和linux驱动学习,利用树莓派制作LED流水灯应该算是驱动学习吧.树莓派来自国外,国外嵌入式开 ...

  6. imx6q GPIO功能的用法

    假如我们要使用扩展口的第11脚EIM_D18. 先在arch/arm/plat-mxc/include/mach/iomux-mx6q.h中找有EIM_18. 能够找到MX6Q_PAD_EIM_D18 ...

  7. SysTick系统定时器(功能框图和优先级配置)

    SysTick—系统定时器是属于 CM3 内核中的一个外设,内嵌在 NVIC 中.系统定时器是一个 24bit (2^24)的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般我们设置 ...

  8. LPC4370使用学习:GPIO的引脚功能使用,和12864OLED模拟I2C驱动

    一: 手中有块LPC4370的开发板,因为便宜,所以引脚引出的不多,而且只有基本的底板资源驱动代码和例程. 看着手册和例程看了老半天,写程序写了半天,结果GPIO老是驱动不起来,因为引脚配置寄存器中有 ...

  9. stm32开发笔记(二):stm32系列使用V3.5固件库的帮助文件以及GPIO基本功能(一)

    前言   stm32系列是最常用的单片机之一,不同的版本对应除了引脚.外设.频率.容量等'不同之外,其开发的方法是一样的.  本章讲解使用库函数使用GPIO引脚功能.   补充   本文章为多年前学习 ...

随机推荐

  1. python机器学习(四)分类算法-决策树

      一.决策树的原理 决策树思想的来源非常朴素,程序设计中的条件分支结构就是if-then结构,最早的决策树就是利用这类结构分割数据的一种分类学习方法 . 二.决策树的现实案例 相亲   相亲决策树 ...

  2. git init 后关联github仓库是发生错误:

    : failed to push some refs to 'git@github.com:AlanKnightly/reactC.git'hint: Updates were rejected be ...

  3. 5.6 Go 常用函数

    5.6 Go 常用函数 最正确的学习模块姿势: https://golang.org/pkg/ //golang官网 程序开发常用函数 strings处理字符串相关 统计字符串长度,按字节 len(s ...

  4. 03 返回静态文件的高级web框架

    03 返回静态文件的高级web框架 服务器server端python程序(高级版): import socket server=socket.socket() server.bind(("1 ...

  5. docker 学习(一)

    1. docker介绍 1)docker的出现 Docker是诞生于2013年,是dotCloud的一个开源项目,基于Google推出的GO语言实现.遵从Apache2.0协议. 2)docker介绍 ...

  6. Oracle数据库连接、存储过程及调用

    Oracle数据库连接.存储过程及调用 1. 定义一个存储过程 create or replace procedure getuser(eid in number, na out varchar, e ...

  7. Java Web之路一:过滤器(Filter)

    一.过滤器(Filter)简介 过滤器是对web资源进行拦截,做一些处理后再交给下一个过滤器或Servlet处理,主要可以拦截request和response 过滤器是以一种组件的形式与web程序绑定 ...

  8. 基于Hdl Coder实现卡尔曼滤波算法

    总所周知,FPGA极其不擅长复杂算法的运算,但是如果项目中又涉及一些高级算法的实现,在没有可封装IP核调用的形式下,我们应该如何进行程序开发呢?今夕已经是2020年,我们一味依赖于用verilog写代 ...

  9. 去重函数unique,sort,erase的应用

    std::unique 一.总述 unique函数属于STL中比较常用函数,它的功能是元素去重.即"删除"序列中所有相邻的重复元素(只保留一个).此处的删除,并不 是真的删除,而是 ...

  10. vue 实例化使用模板

    var vm = new Vue({ el:"", data:{ }, methods:{ } })