当前位置:首页 >> 信息与通信 >>

+STM32


对通用输入输出 GPIO 的深入理解
二.GPIO 的各种模式 GPIO 管脚可以被配置为多种工作模式,其中有 3 种比较常用: 高阻输入、推挽输出、开漏输出 1. 高阻输入(Input)

图 1.1 GPIO 高阻输入模式结构示意图 为减少信息传输线的数目,大多数计算机中的信息传输线采用 总线形式,即凡要传输的同类信息都在同一组传输线,且信息是分

时 传送的。在计算机中一般有三组总线,即数据总线、地址总线和控制 总线。 为防止信息相互干扰, 要求凡挂到总线上的寄存器或存储器等, 它的输入输出端不仅能呈现 0、1 两个信息状态,而且还应能呈现第 三个状态----高阻抗状态,即此时好像它们的输出被开关断开,对总 线状态不起作用,此时总线可由其他器件占用。三态缓冲器即可实现 上述功能,它除具有输入输出端之外,还有一控制端。 如图 1.1 所示, GPIO 管脚在高阻输入模式下的等效结构示意 为 图。这是一个管脚的情况,其它管脚的结构也是同样的。输入模式的 结构比较简单,就是一个带有施密特触发输入(Schmitt-triggered input)的三态缓冲器(U1),并具有很高的输入等效阻抗。施密特

触发输入的作用是能将缓慢变化的或者是畸变的输入脉冲信号整形 成比较理想的矩形脉冲信号。执行 GPIO 管脚读操作时,在读脉冲 (Read Pulse)的作用下会把管脚(Pin)的当前电平状态读到内部 总线上(Internal Bus)。在不执行读操作时,外部管脚与内部总线 之间是隔离的。

2. 推挽输出(Output)

图 1.2 GPIO 推挽输出模式结构示意图

推挽输出原理:在功率放大器电路中大量采用推挽放大器 电路,这种电路中用两只三极管构成一级放大器电路,两只三极管分 别放大输入信号的正半周和负半周, 即用一只三极管放大信号的正半 周,用另一只三极管放大信号的负半周,两只三极管输出的半周信号 在放大器负载上合并后得到一个完整周期的输出信号。 推挽放大器电路中,一只三极管工作在导通、放大状态时,另一 只三极管处于截止状态, 当输入信号变化到另一个半周后, 原先导通、 放大的三极管进入截止,而原先截止的三极管进入导通、放大状态,

两只三极管在不断地交替导通放大和截止变化, 所以称为推挽放大器 (armjishu.com)。 如图 1.2 所示,为 GPIO 管脚在推挽输出模式下的等效 结构示意图。U1 是输出锁存器,执行 GPIO 管脚写操作时,在写脉冲 (Write Pulse)的作用下,数据被锁存到 Q 和/Q。T1 和 T2 构成 CMOS 反相器,T1 导通或 T2 导通时都表现出较低的阻抗,但 T1 和 T2 不会 同时导通或同时关闭,最后形成的是推挽输出。在推挽输出模式下, GPIO 还具有回读功能,实现回读功能的是一个简单的三态门 U2。注 意:执行回读功能时,读到的是管脚的输出锁存状态,而不是外部管 脚 Pin 的状态。

3. 开漏输出(OutputOD)

图 1.3 GPIO 开漏输出结构示意图 如图 1.3 所示,为 GPIO 管脚在开漏输出模式下的等效结构 示意图。开漏输出和推挽输出相比结构基本相同,但只有下拉晶体管 T1 而没有上拉晶体管。同样,T1 实际上也是多组可编程选择的晶体 管。 开漏输出的实际作用就是一个开关, 输出“1”时断开、 输出“0”

时连接到 GND(有一定内阻)。回读功能:读到的仍是输出锁存器的 状态,而不是外部管脚 Pin 的状态。因此开漏输出模式是不能用来输 入的。 开漏输出结构没有内部上拉,因此在实际应用时通常都要外 接合适的上拉电阻(通常采用 4.7~10kΩ)。开漏输出能够方便地 实现“线与”逻辑功能,即多个开漏的管脚可以直接并在一起(不需 要缓冲隔离) 使用, 并统一外接一个合适的上拉电阻, 就自然形成“逻 辑与”关系。 开漏输出的另一种用途是能够方便地实现不同逻辑电平 之间的转换(如 3.3V 到 5V 之间),只需外接一个上拉电阻,而不需 要额外的转换电路。 典型的应用例子就是基于开漏电气连接的 I2C 总 线。

4. 钳位二极管 GPIO 内部具有钳位保护二极管,如图 1.4 所示。其作用是防 止从外部管脚 Pin 输入的电压过高或者过低。VDD 正常供电是 3.3V, 如果从 Pin 输入的信号(假设任何输入信号都有一定的内阻)电压超 过 VDD 加上二极管 D1 的导通压降(假定在 0.6V 左右),则二极管 D1 导通,会把多于的电流引到 VDD,而真正输入到内部的信号电压不 会超过 3.9V。同理,如果从 Pin 输入的信号电压比 GND 还低,则由 于二极管 D2 的作用,会把实际输入内部的信号电压钳制在-0.6V 左 右。

图 1.4 GPIO 钳位二极管示意图 假设 VDD=3.3V,GPIO 设置在开漏模式下,外接 10kΩ 上拉 电阻连接到 5V 电源,在输出“1”时,我们通过测量发现:GPIO 管 脚上的电压并不会达到 5V,而是在 4V 上下,这正是内部钳位二极管 在起作用。虽然输出电压达不到满幅的 5V,但对于实际的数字逻辑 通常 3.5V 以上就算是高电平了(armjishu.com)。

图 1.5 解决开漏模式上拉电压不足的方法 如果确实想进一步提高输出电压,一种简单的做法是先在 GPIO 管脚上串联一只二极管(如 1N4148),然后再接上拉电阻。参 见图 1.5,框内是芯片内部电路。向管脚写“1”时,T1 关闭,在 Pin 处得到的电压是 3.3+VD1+VD3=4.5V,电压提升效果明显;向管脚

写“0”时,T1 导通,在 Pin 处得到的电压是 VD3=0.6V,仍属低电 平

漏极开路的分析

电力场效应管又名电力场效应晶体管分为结型和绝缘栅型, 通常 主要指绝缘栅型中的 MOS 型(Metal Oxide Semiconductor FET) ,简

称电力 MOSFET(Power MOSFET) ,结型电力场效应晶体管一般称 作静电感应晶体管(Static Induction Transistor——SIT) 。 A:我们先来说说集电极开路输出的结构。集电极开路输出的结 构如图 1 所示,右边的那个三极管集电极什么都不接,所以叫做集电 极开路 (左边的三极管为反相之用, 使输入为 “0” 输出也为 时, “0”。 ) 对于图 1,当左端的输入为“0”时,前面的三极管截止(即集电极 C 跟发射极 E 之间相当于断开) 所以 5V 电源通过 1K 电阻加到右边的 , 三极管上,右边的三极管导通(即相当于一个开关闭合) ;当左端的 输入为“1”时,前面的三极管导通,而后面的三极管截止(相当于 开关断开) 。 我们将图 1 简化成图 2 的样子。图 2 中的开关受软件控制, “1” 时断开, “0”时闭合。很明显可以看出,当开关闭合时,输出直接接 地,所以输出电平为 0。而当开关断开时,则输出端悬空了,即高阻 态。这时电平状态未知,如果后面一个电阻负载(即使很轻的负载) 到地,那么输出端的电平就被这个负载拉到低电平了,所以这个电路 是不能输出高电平的。 再看图三。 图三中那个 1K 的电阻即是上拉电阻。 如果开关闭合, 则有电流从 1K 电阻及开关上流过,但由于开关闭和时电阻为 0(方 便我们的讨论,实际情况中开关电阻不为 0,另外对于三极管还存在 饱和压降) ,所以在开关上的电压为 0,即输出电平为 0。如果开关断 开,则由于开关电阻为无穷大(同上,不考虑实际中的漏电流) ,所 以流过的电流为 0,因此在 1K 电阻上的压降也为 0,所以输出端的

电压就是 5V 了,这样就能输出高电平了。但是这个输出的内阻是比 较大的(即 1KΩ) ,如果接一个电阻为 R 的负载,通过分压计算,就 可以算得最后的输出电压为 5*R/(R+1000)伏,即 5/(1+1000/R)伏。所 以,如果要达到一定的电压的话,R 就不能太小。如果 R 真的太小, 而导致输出电压不够的话,那我们只有通过减小那个 1K 的上拉电阻 来增加驱动能力。但是,上拉电阻又不能取得太小,因为当开关闭合 时,将产生电流,由于开关能流过的电流是有限的,因此限制了上拉 电阻的取值,另外还需要考虑到,当输出低电平时,负载可能还会给 提供一部分电流从开关流过, 因此要综合这些电流考虑来选择合适的 上拉电阻。 如果我们将一个读数据用的输入端接在输出端,这样就是一个 IO 口了(51 的 IO 口就是这样的结构,其中 P0 口内部不带上拉,而 其它三个口带内部上拉) ,当我们要使用输入功能时,只要将输出口 设置为 1 即可,这样就相当于那个开关断开,而对于 P0 口来说,就 是高阻态了。 对于漏极开路(OD)输出,跟集电极开路输出是十分类似的。 将上面的三极管换成场效应管即可。这样集电极就变成了漏极,OC 就变成了 OD,原理分析是一样的。 另一种输出结构是推挽输出。 推挽输出的结构就是把上面的上拉 电阻也换成一个开关,当要输出高电平时,上面的开关通,下面的开 关断;而要输出低电平时,则刚好相反。比起 OC 或者 OD 来说,这 样的推挽结构高、低电平驱动能力都很强。如果两个输出不同电平的

输出口接在一起的话,就会产生很大的电流,有可能将输出口烧坏。 而上面说的 OC 或 OD 输出则不会有这样的情况,因为上拉电阻提供 的电流比较小。如果是推挽输出的要设置为高阻态时,则两个开关必 须同时断开(或者在输出口上使用一个传输门) ,这样可作为输入状 态,AVR 单片机的一些 IO 口就是这种结构。

在平时的电路设计时我们会遇到开漏(open drain)和开集(open collector)的概念,可能大家在念书时就知道其基本的用法,而且在 设计中也并未遇到过问题。 但是我忽然觉得自己也对这个概念了解的 并不系统。 于是进行了以下总结: 所谓开漏电路的概念里提到的 “漏” 就是指 MOS FET 的漏极,同理,开集电路中的“集”就是指三极管 的集电极,开漏电路就是指以 MOS FET 的漏极为输出的电路。一般 的常规用法是会在漏极外部的电路添加一个上拉电阻。 完整的开漏电 路应该由开漏器件和开漏的上拉电阻组成。如下图中所示:

组成开漏形式的电路有以下几个特点: 1. 利用外部电路的驱动能力,减少 IC 内部的驱动。当 IC 内部 MOSFET 导通时,驱动电流是从外部的 VCC 流经 R pull-up , MOSFET 到 GND。IC 内部仅需很下的栅极驱动电流。如图 1。 2. 可以将多个开漏输出的 Pin, 连接到一条线上。 形成 “与逻辑” 关系。如图 1,当 PIN_A、PIN_B、PIN_C 任意一个变低后,开漏线 上的逻辑就为 0 了。这也是 I2C,SMBus 等总线判断总线占用状态的 原理。 3. 可以利用改变上拉电源的电压,改变传输电平。如图 2, IC 的 逻辑电平由电源 Vcc1 决定,而输出高电平则由 Vcc2 决定。这样我 们就可以用低电平逻辑控制输出高电平逻辑了。 4. 开漏 Pin 不连接外部的上拉电阻,则只能输出低电平。 5. 标准的开漏脚一般只有输出的能力。添加其它的判断电路, 才能具备双向输入、输出的能力。

应用中需注意: 1. 开漏和开集的原理类似,在许多应用中我们利用开集电路代 替开漏电路。例如,某输入 Pin 要求由开漏电路驱动。则我们常见的 驱动方式是利用一个三极管组成开集电路来驱动它, 即方便又节省成 本。如图 3。

2. 上拉电阻 R pull-up 的阻值决定了逻辑电平转换的沿的速度。 阻值越大,速度越低功耗越小。反之亦然!

本 文 来 自 : 电 子 电 路 图 网 (www.4667.cn) 详 细 出 处 参 考 : http://www.4667.cn/article/dlt/200912/06-4064.html

GPIO 配置
(1)GPIO_Mode_AIN 模拟输入 (2)GPIO_Mode_IN_FLOATING 浮空输入 (3)GPIO_Mode_IPD 下拉输入 (4)GPIO_Mode_IPU 上拉输入 这三种输入电路是用那一种,要根据外围电路来决定。 所谓高阻,可以简单理解为输出端处于浮空状态(没有电流流 动),其电平随外部电平高低而定,即门电路放弃对输出端电路的控 制。而上拉就是将不确定的信号通过一个电阻嵌位在高电平,电阻同 时起限流作用。下拉同理,只不过上拉是对器件注入电流,下拉是输 出电流。至于弱上拉和强上拉,只是上拉电阻的阻值不同,没有什么 严格区分。简言之,上拉就是在端口没有输入的情况下,将端口的电 平稳定在高电平。 (5)GPIO_Mode_Out_OD 开漏输出 (6)GPIO_Mode_Out_PP 推挽输出 (7)GPIO_Mode_AF_OD 复用开漏输出 (8)GPIO_Mode_AF_PP 复用推挽输出 GPIO_Speed_10MHz 最高输出速率 10MHz GPIO_Speed_2MHz 最高输出速率 2MHz GPIO_Speed_50MHz 最高输出速率 50MHz 1.1I/O 口的输出模式下,有 3 种输出速度可选(2MHz、10MHz 和 50MHz), 这个速度是指 I/O 口驱动电路的响应速度而不是输出信

号的速度,输出信号的速度与程序有关(芯片内部在 I/O 口 的输 出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自 己的需要选择合适的驱动电路)。通过选择速度来选择不同的输出 驱动模块,达到最佳的噪声 控制和降低功耗的目的。高频的驱动 电路,噪声也高,当不需要高的输出频率时,请选用低频驱动电路, 这样非常有利于提高系统的 EMI 性能。当然如果要输出较高频率的 信号,但却选用了较低频率的驱动模块,很可能会得到失真的输出 信号。 关键是 GPIO 的引脚速度跟应用匹配(推荐 10 倍以上?)。比 如: 对于串口, 假如最大波特率只需 115.2k, 那么用 2M 的 GPIO 的引脚速度就够了,既省电也噪声小。 对于 I2C 接口,假如使用 400k 波特率,若想把余量留大 些,那么用 2M 的 GPIO 的引脚速度或许不够,这时可以选 用 10M 的 GPIO 引脚速度。 对于 SPI 接口, 假如使用 18M 或 9M 波特率, 10M 的 GPIO 用 的引脚速度显然不够了,需要选用 50M 的 GPIO 的引脚速 度。 1.2 GPIO 口设为输入时,输出驱动电路与端口是断开,所以输 出速度配置无意义。 1.3 在复位期间和刚复位后,复用功能未开启,I/O 端口被配置成 浮空输入模式。

1.4 所有端口都有外部中断能力。为了使用外部中断线,端口必 须配置成输入模式。 1.5GPIO 口的配置具有上锁功能,当配置好 GPIO 口后,可以通过 程序锁住配置组合,直到下次芯片复位才能解锁。

2、推挽输出与开漏输出的区别

推挽输出:可以输出高,低电平,连接数字器件;开 漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要 上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对 强(一般 20ma 以内). 推挽结构一般是指两个三极管分别受两互补信号的控制,总 是在一个三极管导通的时候另一个截止. 要实现 线与 需要用 OC(open collector)门电路.是两个参 数相同的三极管或 MOSFET,以推挽方式存在于电路中,各负责正 负半周的波形放大任务,电路工作时, 两只对称的功率开关管每次 只有一个导通, 所以导通损耗小,效率高。 输出既可以向负载灌电 流,也可以从负载抽取电流

当端口配置为输出时: 开漏模式:输出 0 时,N-MOS 导通,P-MOS 不被激活,输出 0。 输出 1 时,N-MOS 高阻, P-MOS 不被激活,输出 1(需要外部上拉电路);此模式可以把端口作为双向 IO 使用。 推挽模式:输出 0 时,N-MOS 导通,P-MOS 高阻 ,输出 0。 输出 1 时,N-MOS 高阻,P-MOS 导通,输出 1(不 需要外部上拉电路)。 简单来说开漏是 0 的时候接 GND 1 的时候浮空 推挽是 0 的时候接 GND 1 的时候接 VCC 3、在 STM32 中选用 IO 模式 (1) 浮空输入_IN_FLOATING —浮空输入,可以做 KEY 识别,RX1

(2)带上拉输入_IPU—IO 内部上拉电阻输入 (3)带下拉输入_IPD—IO 内部下拉电阻输入 (4) 模拟输入_AIN —应用 ADC 模拟输入,或者低功耗下省电。 (5)开漏输出_OUT_OD —IO 输出 0 接 GND,IO 输出 1,悬空,需 要外接上拉电阻,才能实现输出高电平。当输出为 1 时,IO 口的状 态由上拉电阻拉高电平,但由于是开漏输出模式,这样 IO 口也就 可以由外部电路改变为低电平或不变 。可以读 IO 输入电平变化, 实现 C51 的 IO 双向功能。 (6)推挽输出_OUT_PP ——IO 输出 0-接 GND, IO 输出 1 接 VCC,读输入值是未知的。 (7)复用功能的推挽输出_AF_PP ——片内外设功能(I2C 的 SCL,SDA) (8)复用功能的开漏输出_AF_OD——片内外设功能 (TX1,MOSI,MISO.SCK.SS) 实例总结: (1)模拟 I2C 使用开漏输出_OUT_OD,接上拉电阻,能够正确输出 0 和 1;读值时先 GPIO_SetBits(GPIOB, GPIO_Pin_0);拉高,然后可以读 IO 的值; 使用 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0); (2)如果是无上拉电阻,IO 默认是高电平;需要读取 IO 的值,可 以使用

带上拉输入_IPU 和浮空输入_IN_FLOATING 和 开漏输出_OUT_OD; 4、IO 低功耗: 关于模拟输入&低功耗,根据 STM32 的低功耗 AN(AN2629)及其 源文件,在 STOP 模式下,为了得到尽量低的功耗,确实把所有的 IO (包括非 A/D 输入的 GPIO)都设置为模拟输入


相关文章:
STM32_Flash_writeRead_programming
STM32_Flash_writeRead_programming_计算机软件及应用_IT/计算机_专业资料。对stm32 的flash编程的读写操作。#include "led.h" #include "delay.h" #include "...
stm32+IAR配置与固件使用
STM32F10x $PROJ_DIR$\..\Libraries\STM32F10x_StdPeriph_Driver\inc 如图: Compile:您有可能会出现以下问题: 这是需要修改 stm32f10x.h 文件中的相关,因为...
stm32初学例程
程序开始 1.2.1 头文件: #include "stm32f10x.h" #include "main.h" //#include "k_gpio.h" #define VECT_TAB_RAM //main()函数: 函数: 函数 //...
LWIP + STM32 连接检测
LWIP + STM32 连接检测_IT/计算机_专业资料。使用LwIP协议的检测网络连接状态的一个方法。STM32 + Lwip 通讯检测的一种实现方法 用神州 IV STM32F107 开发板,...
STM32 开发入门教程
("\r\n http://www.mystm32.com \r\n"); printf("\r\n Please Input Character From Keyboard \r\n"); while(1 { if(USART_GetFlagStatus(USART1...
STM32的CAN程序
STM32的CAN程序_电子/电路_工程科技_专业资料。#include "sysdef.h" #define MAX_MAIL_NUM 3 //CAN 总线调试:0=运行 1=自环调试 #define CAN_DEBUG 0 /...
STM32的LCD19264-12864经典程序
STM32的LCD19264-12864经典程序_工学_高等教育_教育专区。本程序是有LCD12864该进的,液晶驱动为ST7920。。可以稍微改动即可用于12864。现在...
STM32F4 IIC的一些使用经验
? 上一篇 STM32F407 的 UDP 发送数据 下一篇 STM32 F207 的 PWM 输入捕获频率和占空比 主题推荐 stm32bmptypedef 源码工作 猜你在找 STM32 学习笔记(串口、...
STM32F407_DP83848_Lwip移植方法
本文作者:武汉普创科技--易宇--转载请注明出处 本人的项目配置:STM32F407VET6 + DP83848C 1、从官方网站 http://www.stmcu.org/document/list/index/...
STM32定时时间的计算
STM32 定时器定时时间的计算假设系统时钟是 72Mhz TIM1 是由 PCLK2 (72MHz) ,, 得到 TIM2-7 是由 PCLK1 得到关键是设定 时钟预分频数,自动重装载寄存器...
更多相关标签:
stm | stm32论坛 | stm32官网 | stm32f103 | stm32开发板 | stm32选型手册 | stm32教程 | 郭天祥 |