关于STM32 GPIO配置模式

发布者:书卷气息最新更新时间:2017-10-25 来源: eefocus关键字:STM32  GPIO  配置模式 手机看文章 扫描二维码
随时随地手机看文章

其实关于GPIO模式,手册有非常详细的说明,可见好好查看Datasheet有多么重要!!

首先关于stm32的GPIO口有输入输出之分,这点与51单片机使用的双向IO口有区别,这就需要根据我们具体是输入还是输出配置为相应的输入输出模式。输入就是输入模式,输出就是输出模式,两者不能混用。

下面这段话是手册这么描述GPIO口的: 

通用I/O(GPIO)
复位期间和刚复位后,复用功能未开启, I/O端口被配置成浮空输入模式(CNFx[1:0]=01b,
MODEx[1:0]=00b)。
复位后, JTAG引脚被置于输入上拉或下拉模式:
─ PA15: JTDI置于上拉模式
─ PA14: JTCK置于下拉模式
─ PA13: JTMS置于上拉模式
─ PB4: JNTRST置于上拉模式
当作为输出配置时,写到输出数据寄存器上的值(GPIOx_ODR)输出到相应的I/O引脚。可以以推
挽模式或开漏模式(当输出0时,只有N-MOS被打开)使用输出驱动器。
输入数据寄存器(GPIOx_IDR)在每个APB2时钟周期捕捉I/O引脚上的数据。
所有GPIO引脚有一个内部弱上拉和弱下拉,当配置为输入时,它们可以被激活也可以被断开
从上面的描述我们知道,单片机复位后默认是浮空输入模式,但是JTAG的引脚会被设置为输入上拉或者下拉模式。输出模式下是输出寄存器ODR的输出到对应IO口实现高低电平。
关于STM32 <wbr>GPIO配置模式
输入配置
当I/O端口配置为输入时:
● 输出缓冲器被禁止
● 施密特触发输入被激活
● 根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接
● 出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器
● 对输入数据寄存器的读访问可得到I/O状态
参见手册关于输入配置这几点很重要。

1)当作为输入时,输出数据寄存器与IO口之间是断开的,这也就意味着我们在输入状态下即使操作输出数据寄存器对IO口也没有影响。比如我们用库函数各种直接或间接改变输出数据寄存器的操作都是无效的。比如我们设置在初始化某IO为上拉输入后,又将该IO口输出为0,将这输出为0的操作是完全无效不起作用的!比如你设置为输入去用万用表测IO口就很可笑的操作!!

2)IO口的数据在每个APB2时钟被采样到输入数据寄存器,这就意味着我们比如当前模式为输入模式,那么在72M系统时钟下,约每13ns会更新一次输入数据。比如我们在写某些通信接口时序,在设置为输入模式下就要留个心看看是否数据能否在读命令下是否13ns该通信方式是否有效数据已经到达保证读取 的是准确值,是否需加延时(针对通信数据更新慢的情况)。
3)注意我们设置为浮空、上拉还是下拉输入,在没有接外设的情况下,这些状态才是确定的。比如我们说浮空模式下,输入值不确定可能为0可能为1,上拉输入时输入数据寄存器为1,下拉输入时输入数据寄存器值为0均是针对前提是在未接任何外设情况下来说的!我们测开发板一定要先确定引脚是否有外设影响!

4)STM32为弱上拉和弱下拉,也就是上拉电阻阻值很大,未接外设时输入数据寄存器为1,这样有利于检测低电平输入;同理,下拉输入未接外设输入数据寄存器为0,有利于我们检测高电平输入。而对于外设电平可高可低的输入,我们设置为浮空输入即可。

5)输入数据寄存器为只读,在硬件仿真时值是屏蔽表示不可修改,但是值是准确的!需要注意的是,硬件仿真输入模式下去查看输入寄存器IDR没意义,输出模式下去查看输出数据寄存器ODR也没意义。

关于STM32 <wbr>GPIO配置模式

输出配置
当I/O端口被配置为输出时:
● 输出缓冲器被激活
─ 开漏模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将端口置于高阻状态(PMOS从不被激活)。
─ 推挽模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将激活P-MOS。
● 施密特触发输入被激活
● 弱上拉和下拉电阻被禁止
● 出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器
● 在开漏模式时,对输入数据寄存器的读访问可得到I/O状态
● 在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的值。
参见手册关于输出配置这段话我们需要注意这几点:

1)在输出模式下,输入寄存器与IO口之间并未屏蔽,并且在开漏输出模式下,我们读输入数据寄存器的操作可以真实的读取我们输入口的状态(尽管不建议输出模式和输入混用,但是具有这样的性质是要注意的)

2)开漏输出的特点如果要控制外设,则必须外接上拉电阻,因为其自身不具备输出高电平的能力,只能输出低电平,当然这种需外接上拉电阻的模式也实现我们可输出我们想要的任意“高电平”,比如5V外接5V上拉即可;而推挽输出则可输出可高可低电平。(欲了解见下文)

 

 

单片机I/O口推挽与开漏输出详解:

推挽输出:可以输出高,低电平,连接数字器件;推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止.

开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内).

我们先来说说集电极开路输出的结构。集电极开路输出的结构如图1所示,右边的那个三极管集电极什么都不接,所以叫做集电极开路(左边的三极管为反相之用,使输入为“0”时,输出也为“0”)。对于图1,当左端的输入为“0”时,前面的三极管截止(即集电极C跟发射极E之间相当于断开),所以5V电源通过1K电阻加到右边的三极管上,右边的三极管导通(即相当于一个开关闭合);当左端的输入为“1”时,前面的三极管导通,而后面的三极管截止(相当于开关断开)。

 关于STM32 <wbr>GPIO配置模式

我们将图1简化成图2的样子。图2中的开关受软件控制,“1”时断开,“0”时闭合。很明显可以看出,当开关闭合时,输出直接接地,所以输出电平为0。而当开关断开时,则输出端悬空了,即高阻态。这时电平状态未知,如果后面一个电阻负载(即使很轻的负载)到地,那么输出端的电平就被这个负载拉到低电平了,所以这个电路是不能输出高电平的。

再看图三。图三中那个1K的电阻即是上拉电阻。如果开关闭合,则有电流从1K电阻及开关上流过,但由于开关闭其它三个口带内部上拉),当我们要使用输入功能时,只要将输出口设置为1即可,这样就相当于那个开关断开,而对于P0口来说,就是高阻态了。

对于漏极开路(OD)输出,跟集电极开路输出是十分类似的。将上面的三极管换成场效应管即可。这样集电极就变成了漏极,OC就变成了OD,原理分析是一样的。

另一种输出结构是推挽输出。推挽输出的结构就是把上面的上拉电阻也换成一个开关,当要输出高电平时,上面的开关通,下面的开关断;而要输出低电平时,则刚好相反。比起OC或者OD来说,这样的推挽结构高、低电平驱动能力都很强。如果两个输出不同电平的输出口接在一起的话,就会产生很大的电流,有可能将输出口烧坏。而上面说的OC或OD输出则不会有这样的情况,因为上拉电阻提供的电流比较小。如果是推挽输出的要设置为高阻态时,则两个开关必须同时断开(或者在输出口上使用一个传输门),这样可作为输入状态,AVR单片机的一些IO口就是这种结构。

开漏电路特点及应用

在电路设计时我们常常遇到开漏(open drain)和开集(open collector)的概念。
所谓开漏电路概念中提到的“漏”就是指MOSFET的漏极。同理,开集电路中的“集”就是指三极管的集电极。开漏电路就是指以MOSFET的漏极为输出的电路。一般的用法是会在漏极外部的电路添加上拉电阻。完整的开漏电路应该由开漏器件和开漏上拉电阻组成。如图1所示:

 

组成开漏形式的电路有以下几个特点:
    1. 利用外部电路的驱动能力,减少IC内部的驱动(或驱动比芯片电源电压高的负载)。当IC内部MOSFET导通时,驱动电流是从外部的VCC流经R pull-up ,MOSFET到GND。IC内部仅需很下的栅极驱动电流。如图1。

关于STM32 <wbr>GPIO配置模式
    2. 可以将多个开漏输出的Pin,连接到一条线上。形成 “与逻辑” 关系。如图1,当PIN_A、PIN_B、PIN_C任意一个变低后,开漏线上的逻辑就为0了。这也是I2C,SMBus等总线判断总线占用状态的原理。如果作为输出必须接上拉电阻。接容性负载时,下降延是芯片内的晶体管,是有源驱动,速度较快;上升延是无源的外接电阻,速度慢。如果要求速度高电阻选择要小,功耗会大。所以负载电阻的选择要兼顾功耗和速度。
    3. 可以利用改变上拉电源的电压,改变传输电平。如图2, IC的逻辑电平由电源Vcc1决定,而输出高电平则由Vcc2(上拉电阻的电源电压)决定。这样我们就可以用低电平逻辑控制输出高电平逻辑了(这样你就可以进行任意电平的转换)。(例如加上上拉电阻就可以提供TTL/CMOS电平输出等。)

 关于STM32 <wbr>GPIO配置模式

4. 开漏Pin不连接外部的上拉电阻,则只能输出低电平(因此对于经典的51单片机的P0口而言,要想做输入输出功能必须加外部上拉电阻,否则无法输出高电平逻辑)。一般来说,开漏是用来连接不同电平的器件,匹配电平用的。
5. 标准的开漏脚一般只有输出的能力。添加其它的判断电路,才能具备双向输入、输出的能力。

6.正常的CMOS输出级是上、下两个管子,把上面的管子去掉就是OPEN-DRAIN了。这种输出的主要目的有两个:电平转换、线与。

7.线与功能主要用于有多个电路对同一信号进行拉低操作的场合,如果本电路不想拉低,就输出高电平,因为OPEN-DRAIN上面的管子被拿掉,高电平是靠外接的上拉电阻实现的。(而正常的CMOS输出级,如果出现一个输出为高另外一个为低时,等于电源短路。)

8.OPEN-DRAIN提供了灵活的输出方式,但是也有其弱点,就是带来上升沿的延时。因为上升沿是通过外接上拉无源电阻对负载充电,所以当电阻选择小时延时就小,但功耗大;反之延时大功耗小。所以如果对延时有要求,则建议用下降沿输出。

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

 关于STM32 <wbr>GPIO配置模式

2. 上拉电阻R pull-up的阻值决定了逻辑电平转换的沿的速度。阻值越大,速度越低功耗越小。反之亦然。
     Push-Pull输出就是一般所说的推挽输出,在CMOS电路里面应该较CMOS输出更合适,因为在CMOS里面的push-pull输出能力不可能做得双极那么大。输出能力看IC内部输出极N管P管的面积。和开漏输出相比,push-pull的高低电平由IC的电源低定,不能简单的做逻辑操作等。push-pull是现在CMOS电路里面用得最多的输出级设计方式。
    当然open drain也不是没有代价,这就是输出的驱动能力很差。输出的驱动能力很差的说法不准确,驱动能力取决于IC中的末级晶体管功率。OD只是带来上升沿的延时,因为上升沿是通过外接上拉无源电阻对负载充电的,当电阻选择小时延时就小、但功耗大,反之延时大功耗小。OPEN DRAIN提供了灵活的输出方式,但也是有代价的,如果对延时有要求,建议用下降沿输出。
    电阻小延时小的前提条件是电阻选择的原则应在末级晶体管功耗允许范围内,有经验的设计者在使用逻辑芯片时,不会选择1欧姆的电阻作为上拉电阻。在脉冲的上升沿电源通过上拉无源电阻对负载充电,显然电阻越小上升时间越短,在脉冲的下降沿,除了负载通过有源晶体管放电外,电源也通过上拉电阻和导通的晶体管对地形成通路,带来的问题是芯片的功耗和耗电问题。电阻影响上升沿,不影响下降沿。如果使用中不关心上升沿,上拉电阻就可选择尽可能的大点,以减少对地通路的电流。如果对上升沿时间要求较高,电阻大小的选择应以芯片功耗为参考。


关键字:STM32  GPIO  配置模式 引用地址:关于STM32 GPIO配置模式

上一篇:STM32闪存选择字段和看门狗的关系
下一篇:关于STM32利用硬件仿真串口中断处理函数应注意的问题

推荐阅读最新更新时间:2024-03-16 15:41

STM32 DMA->内存到内存
基于STM32 F401 Discovery板: DMA2在AHB1总线上 步骤一:使能DMA #define DMA_STREAM_CLOCK RCC_AHB1Periph_DMA2 RCC_AHB1PeriphClockCmd(DMA_STREAM_CLOCK, ENABLE); 步骤二:reset DMA Stream register: /* Reset DMA Stream registers (for debug purpose) */ DMA_DeInit(DMA_STREAM); 步骤三: /* Check if the DMA Stream is disab
[单片机]
<font color='red'>STM32</font> DMA->内存到内存
STM32的IAP方案
简介:本文将讲述一个STM32的综合性应用示例,该示例将涉及到STM32微控制器的时钟系统、GPIO、定时器、中断系统、异步串口以及内置可编程flash等设备的应用,作为一个综合性实验的同时还具有很强的“实用”意义。这个示例就是STM32的IAP方案。 几乎所有的同类书籍都介绍综合性的应用示例如“万年历 +温度显示+闹钟响铃+计时表”这样的一个实时时钟范例或“STM32 +音频解码+大容量存储方案”这样的MP3播放器范例。这些综合性实例的目的在于引领读者进行综合性实验,达到把单片机的基础模块整合运用的目的。这些实例普遍存在一种共同点,即“练手”意义要大于“实用”的意义。本文将讲述一个STM32的综合性应用示例,该示例将涉及到S
[单片机]
STM32F0xx_ GPIO配置详细过程
前言 对于初学STM32的人来说,很多基础的知识没有掌握,这些基础知识就成为阻挡他们入门的门槛。因此,今天也把基础的知识分享出来,带领那些还没有迈过这个门槛的人入门。 今天总结“GPIO配置详细”,以F0标准外设库初始化结构体来重点讲解。接着昨天“新建软件工程详细过程”来进行讲解,今天分两大部分内容总结。工程描述、IO配置源代码详细讲解。 ST标准外设库和参考手册、数据手册等都可以在ST官网下载的到(请自行下载)。关于F0系列芯片的参考手册有多个版本(针对F0不同芯片),但有一个通用版本,就是“STM32F0x128参考手册V8(英文)2015-07”建议使用这个,以后如果你换用一种型号芯片也方便了解。 今天提供下载的软件
[单片机]
STM32F0xx_ <font color='red'>GPIO</font><font color='red'>配置</font>详细过程
STM32学习:ADC/DMA/USART
  学习STM32的ADC转换,在开发板上写程序调试。   四个任务:   1.AD以中断方式(单次)采集一路   2.AD以中断方式连续采集四路   3.AD以DMA方式采集一路,DMA深度为一级   4.AD以DMA方式采集四路,每路DMA深度为28级,并滤波,说明滤波原理。   总结:   第一个任务:ADC以中断方式采集一路ADC,通过配置ADC_InitStructure结构体中的ADC_ScanConvMode,它规定模数转换工作在扫描模式(多通道)还是单次模式(单通道),   ADC_InitStructure.ADC_ScanConvMode=DISABLE,为单通道单次模式。   ADC_ContinuousCo
[单片机]
全网最全STM32 HAL的知识总结
ST 为开发者提供了非常方便的开发库:有标准外设库(SPL库)、HAL 库(Hardware Abstraction Layer,硬件抽象层库)、LL 库(Low-Layer,底层库)三种。前者是ST的老库已经停更了,后两者是ST现在主推的开发库。 相比标准外设库,STM32Cube HAL库表现出更高的抽象整合水平,HAL API集中关注各外设的公共函数功能,这样便于定义一套通用的用户友好的API函数接口,从而可以轻松实现从一个STM32产品移植到另一个不同的STM32系列产品。HAL库是ST未来主推的库,ST新出的芯片已经没有STD库了,比如F7系列。目前,HAL库已经支持STM32全线产品。 通过文字描述可以知道HA
[单片机]
STM32的MDK工程建立
折腾了两天,终于了解了整个固件库工程里的结构,把整个流程记录下来以备以后查看 1、在MDK中建立一个新工程,指派芯片 2、添加启动文件,位于..\STM32F10x_StdPeriph_Lib_V3.2.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm中。 注:这里使用的是MDK,如果使用其他编译工具GNU或IAR可在对应文件夹下找到 3、添加STM32F10x_StdPeriph_Lib_V3.2.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\system_stm32f10x.c及\STM32
[单片机]
意法半导体新型STM32系列获ARM RealView微控制器开发工具包支持
中国上海,2007年6月27日 —— ARM公司(伦敦证交所:ARM;纳斯达克:ARMHY)宣布即日起,RealView微控制器开发工具包将支持意法半导体基于ARM Cortex-M3处理器的全新 STM32F1xx系列器件。    STM32F101 (接入行)和STM32F103 (性能行)将是意法半导体首个基于ARM Cortex-M3处理器的器件系列,兼具卓越的高性能和低功耗,待机功耗仅为2?A。该系列器件拥有高达72MHz的CPU时钟速度、128Kbyte片上闪存ROM及20Kbyte片上RAM,还包括A/D、CAN、USB、SPI、I2C等众多外设及多达80个GPIO。    RealView微控制器开发工具包3.1可
[新品]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved