stm32的引脚有两种用途

发布者:笑脸猫最新更新时间:2018-05-13 来源: eefocus关键字:stm32  引脚 手机看文章 扫描二维码
随时随地手机看文章

stm32的引脚有两种用途:GPIO(general purpose io)和AFIO(alternate function io)

对于一些引脚(视芯片而定),这两种用途都没有,如在64脚产品中,OSC_IN/OSC_OUT与作为GPIO端口的PD0/PD1共用一样的引脚,而在100、144引脚产品中,这四个功能各有引脚与之对应,不互相冲突,所以OSC_IN/OSC_OUT既不作GPIO也不作AFIO,当然,这样的引脚不是讨论重点。

1、引脚的配置

不论是作GPIO还是做AFIO,都要对引脚进行配置。在固件库函数中,用GPIO_Init()函数对引脚进行配置,并不是说这个函数带了“GPIO”字样就是要当做GPIO来用,而是把它纳入GPIO的范畴来讨论。

所谓配置,就是引脚上的片上资源连接方式,如上拉电阻、密特触发等等。关于配置的问题,请见http://www.cnblogs.com/king-77024128/articles/1999395.html?1?3。理解了配置,也就能明白配置与模式的区别。

特别得,在下文中将会专门讨论一下输出配置中的推挽与开漏。

2、复用功能

复用功能有两种:没有重映像、重映像(包括部分重映像、完全重映像),使用引脚用作AFIO功能,同样需要对其进行配置。

 

这三句话来自参考手册,但我对第一句和注意有疑问,第三节讲。如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。输入配置则与GPIO没有区别。

为什么输出模式有专门的复用模式而输入则没有呢。因为输出是由芯片内部电路驱动的,必须选择这个驱动来自哪一个外设,是GPIO还是复用此管脚的其他外设,也就是选择该管脚在内部是与哪个外设相连的,不说明这个就会发生信号的错乱。而输入则不同了,输入信号是由芯片外的信号驱动的,虽然该信号进入芯片内部后可能有不同的去向,但不需要对此进行配置,因为不会发生信号的冲突,最坏的情况就是多驱动了个寄存器而已。事实上,当将引脚作为GPIO输入时,相应的AFIO外设是处在关闭的状态,并不会耗电;当引脚作为AFIO的输入时,可能GPIO是读不进来的,这是我猜的,没有验证,能不能读进来无所谓的,不必纠结于此。

若选择了复用,则默认是没有重映像的,可以直接使用外设,不需要再软件做设置。

但若要重映射,则需要简单设置一下,

先要配置重映射后对应的管脚,可参看参考手册或数据手册引脚定义章节,开AFIO时钟,使能重映射。例如重映射USART1,全部代码如下:

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); 

  /*对寄存器AFIO_EVCR,AFIO_MAPR和AFIO_EXTICRX进行读写操作前,即重映射和选择外部中断线前,应当首先打开AFIO的时钟*/

 

  /* Configure USART1 Tx (PA.09) as alternate function push-pull */

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOB, &GPIO_InitStructure);

    

  /* Configure USART1 Rx (PA.10) as input floating */

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

  GPIO_Init(GPIOB, &GPIO_InitStructure);

  GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);

这就完成了IO口的配置和重映射,下边再配置相关的外设(USART1)就可以使用了。

外部中断线也是可以映射的,并且需要开AFIO时钟,不用GPIO_PinRemap函数,用GPIO_EXTILineConfig重映射引脚到中断线。其实与其说是映射,不如说是选择,选择引脚连接到外部中断线。

重映射不是任意的,只能重映射到指定的管脚。

3、关于第二节讲到那个疑问,为甚么不能配置成模拟输入?模拟输入与浮空什么区别?

答案是可以配置成模拟输入,官方3.5版固件库例子和alientek例程都是将ADC输入引脚配置成GPIO_Mode_AIN

那么配置成浮空行么,还能ADC么?

     //例程

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

     //修改

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

实验证明,这两种配置都能实现ADC。那么USART的Tx应配置成GPIO_Mode_IN_FLOATING,如果配置成GPIO_Mode_AIN,还能接受数据么?金牛板实验结果是不能,ST不我欺也。总之:

可以将引脚配置成模拟输入,使用相应的复用功能;

浮空与模拟这两种配置是不同的。

关于第二节里那个“注意“,我也不知道是什么意思。我猜测是这样的:打开某外设,这个外设将某引脚当做输入,我们偏偏把这个引脚配置为GPIO输出,这样可以操作GPIO来”欺骗“这个外设,这种用法应该是很微妙的。

4、推挽与开漏

不仅仅stm32有这种配置,实际上,这两种已经广泛应用在很多场合。

推挽,又叫做推拉,是个很形象的名字,一般是指两个三极管(MOS管)分别受两互补信号(或者一个信号,但是用互补对管)的控制,总是在一个三极管导通的时候另一个截止,这样的电路被称为推挽式(互补式):

这种电路在放大中通常被用作输出级,在STM32中,推挽配置就是这种,如图:

在相应位置1时,P-MOS导,通N-MOS截止,输出电压为VDD;在相应位置0时,N-MOS导通,P-MOS截止,输出电压为VSS,这就是所谓的推挽。是比较简单的。

而所谓的开漏(对三极管而言是开集,一样的原理),则要巧妙一些。所谓开漏电路概念中提到的“漏”就是指MOS FET的漏极。同理,开集电路中的“集”就是指三极管的集电极。开漏电路就是指以MOS FET的漏极为输出的电路。一般的用法是会在漏极外部的电路添加上拉电阻。完整的开漏电路应该由开漏器件和开漏上拉电阻组成。

对于stm32,开漏就是失能了P-MOS,这样,当相应位置1时,引脚实际上是处在了浮空的状态,而通过外接的上拉电阻,将其拉高。

这么做有如下的好处:

1、可以将多个开漏输出的引脚,连接到一条线上。形成“与逻辑”关系。当多个引脚任意一个变低后,开漏线上的逻辑就为0了。这也是I2C,SMBus等总线判断总线占用状态的原理。在我的文章“stm32模拟iic——引脚配置、代码”中,还会提到这个问题。
2、 可以利用改变上拉电源的电压,改变传输电平。这样我们就可以用低电平逻辑控制输出高电平逻辑了。想想当初认为stm32输出3.3v电压带不动IRF540,就直接断定要重新选型,是错误的想法,只要将推挽输出变为开漏,再加上上拉到5v的电阻,就能解决这个问题。

顺便一提,上拉电阻的阻值决定了逻辑电平转换的沿的速度。阻值越大,速度越低功耗越小。反之亦然。


关键字:stm32  引脚 引用地址:stm32的引脚有两种用途

上一篇:STM32问题集之BOOT0和BOOT1的作用
下一篇:STM32单片机电源端并联电容的重要性

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

基于GMS87C1404的干洗机自动控制系统设计
1 概述 GMS87C1404是韩国HYNIX半导体公司(前身是韩国现代半导体公司)采用CMOS技术生产的8位单片机,它具有功耗低、速度高等特点,并具有丰富的片内资源。GMS87C1404采用28脚封装,有23个I/O口。由于该单片机的性价比高,因此,近两年来在国内家电行业中获得了越来越多的应用。 笔者依据GMS87C1404的特点和干洗机中自动控制系统的要求设计了一个基于GMS87C1404的干洗机自动控制系统。该系统在使用了一段时间后获得了满意的效果。 2 GMS87C1404 的特点    图1是GMS87C1404的引脚图。它的主要特点如下: ●内带4kROM和192字节在片RAM(包括堆栈)
[工业控制]
stm32常用数据类型 U8、U16、U32到底代表什么?
在Keil MDK 开发环境里,比如一个 无符号32位整形数据会有很多种表示方法: 1.unsigned int 32 (C语言标准表达方法) 2.uint32_t ; 3.u32; 这三种方式都是在表达同一个意思。可为什么ST的开发人员要搞的这么乱呢? 其实ST 搞这么多花样,无非是想开发人员在写代码时定义数据类型能少写几个符号,然后又因为前后版本升级,为了兼容旧版本(主要是V2.0)才会出现这么多表示方法。不管他怎么换,都是基于标准C来的,看清楚以下几个文件你就OK了:core_cm3.h ;stm32f10x.h ; stdint.h; 其中每个文件大概作用如下: stdint.h 这
[单片机]
STM32 独立看门狗简介
STM32的独立看门狗由内部专门的40Khz低速时钟驱动,即使主时钟发生故障,它也仍然有效。 看门狗的原理:单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路就是为了避免这种情况的发生。看门狗的作用就是在一定时间内(通过定时计数器实现)没有接收喂狗信号(表示MCU已经挂了),便实现处理器的自动复位重启(发送复位信号)。 在键值寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗;此时计数器开始从其复位值0xFFF递减计数。当计数器计数到末尾0x000时,会产生一个复位信号(IWDG_RESET)。无论何时,只要键寄存器IWDG_KR中被写入0xAAAA,IWDG_RLR中的值就会被重新加载到计
[单片机]
STM32串口中断实验总结函数的初始化
STM32串口中断实验总结函数的初始化必须在变量的初始化之后在进行! 在进行串口的实验的时候,自己没有看教程,写了一段代码,但是进行编译之后发现一直有错误,就算我把代码更改之后还是一直有错误。对比了官方给的教程之后发现唯一的不同之处就是我的有一个函数的初始化是在变量的初始化之前,进行的初始化,在进行相应的知识查询之后,还有请教了师兄之后,发现了自己以前一直没有注意到的问题就是,函数的初始化必须放到变量的初始化之后,否则在使用keil也就是MDK进行建立工程的时候就会报错。 注意细节
[单片机]
<font color='red'>STM32</font>串口中断实验总结函数的初始化
ARM开发(8)基于STM32的窗口看门狗
一 窗口看门狗原理: 1.1 本实验实现STM32的窗口看门狗 1.2 实验思路:理解STM32窗口看门狗原理,根据其原理写驱动。 1.3 开发环境 : MDK5 库函数版本开发 JLINK仿真 二 实验步骤: 2.1 wwdg.h代码: #ifndef __WWDG_H #define __WWDG_H #include sys.h void WWDG_Init(u8 tr,u8 wr,u32 fprer);//初始化WWDG void WWDG_Set_Counter(u8 cnt); //设置WWDG的计数器 void WWDG_NVIC_Init(void); //中断 #endif 2.2 ww
[单片机]
STM32库函数详解----(通用输入/输出GPIO)
初始化和配置相关函数 1.void GPIO_DeInit (GPIO_TypeDef* GPIOx) 函数解释:gpio的反初始化函数,该函数的作用是把GPIO相关的寄存器配置成上电复位后的默认状态,在第一次初始化前或者不在使用某一接口后,可以调用该函数。 参数:GPIOx,GPIO的分组,如 GPIOA,GPIOB,GPIOC等的宏定义。 2.void GPIO_Init (GPIO_TypeDef* GPIOx,GPIO_InitTypeDef* GPIO_InitStruct) 函数解释:GPIO的初始化函数,该函数的作用是对io进行初始化。 参数:(1)GPIOx,GPIO的分组,如 GPI
[单片机]
意法半导体推出STM32扩展软件,简化物联网终端安全功能部署
通过在一个简便的STM32Cube扩展软件包内整合安全启动、安全固件更新和安全引擎服务,意法半导体的X-CUBE-SBSFU v.2.0能帮助产品开发人员充分利用STM32 *微控制器的安全功能保护物联网终端等联网设备的数据安全、管理生命周期。 通过在微控制器上建立可信根,X-CUBE-SBSFU安全启动可使知识产权得到保护,将启动安全检查并激活STM32的内置安全机制,而且每次执行用户应用程序前均会检查代码的真实性和完整性,以防止无效或恶意代码运行。当远程连接网络时,可信设备将按照公认的最佳安全实践参与身份互验。 固件安全更新功能解决了固件的安全加载和编程问题,有助于设备终身管理,并利用修补程序、功能升级和安全更新应
[物联网]
通过两个PIC引脚驱动六只LED灯
  本设计实例展示了仅使用两条MCU的I/O口线驱动六只LED灯的新方法,这种方法尤其适用于任何引脚有限的芯片。这种方法使用了两条I/O口线以及一对互补双极型晶体管。通过多路复用的方法可点亮一只以上的LED灯。      图1:测试选择PIC10F200,固件以两个独立、简单的汇编程序源代码的方式提供。   注意:VDD必须在2V和3V之间。例如,如果LED2点亮(表1),那么在VDD过高的情况下,LED4和LED6也将被点亮。可以选择使用任何通用低功率晶体管,但如想使所有LED保持同样的亮度,则需选择低VCE(sat)的晶体管。   表1:LED驱动逻辑表。避免(0,0)和(1,1)。      测试选择了PIC10
[电源管理]
通过两个PIC<font color='red'>引脚</font>驱动六只LED灯
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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