STM32-GPIO分析

GPIO工作原理

STM32的GPIO口可以配置为8种模式

输入模式

浮空输入

        浮空(floating)就是逻辑器件的输入引脚即不接高电平也不接低电平。但是由于逻辑器件的特殊内部结构,输入引脚悬空也相当于该引脚接入了高电平,但是这种情况下易受干扰,不建议使用。

        信号进入芯片内部后,既没有接上拉电阻也没有接下拉电阻,经由触发器输入。配置成这个模式后,用电压变量引脚电压为1点几伏,这是个不确定值。由于其输入阻抗比较大,一般把这种模式用于标准的通讯协议,比如IIC、USART的等。该模式是STM32复位之后的默认模式。

上拉输入

        上拉就是把电位拉高,把一个不确定的信号通过电阻嵌位在高电平,电路同时起到限流的作用。

        上拉输入就是信号进入芯片之后,加了一个上拉电阻,在经过给施密特触发器转换成0/1信号,读取此时的引脚电平为高电平。

下拉输入

        下拉就是把电位拉低,拉到GND。

        下拉输入就是信号进入芯片之后,加了一个下拉电阻,在经过给施密特触发器转换成0/1信号,读取此时的引脚电平为低电平。

模拟输入

        信号进入后,不经过上拉或者下拉电阻,关闭施密特触发器,经由另一条线路把电压信号传送到片上外设模块。

        模拟输入是指传统方式的输入,数字输入是输入PCM数字信号,即0、1的二进制数字信号,通过数模转换,转换成模拟信号,经前级放大进入功率放大器,功率放大器还是模拟的。比如传送给ADC模块,由ADC采集电压信号。

        所有可以理解为模拟输入的信号是未经处理的信号。

输出模式

开漏输出

        一般用在电平不匹配的场合,如输出5V的电平。输出端相对于三极管的集电极,要得到高电平需要上拉电阻。适合于做电流型的驱动,其吸收电流的能力相对强(一般20mA以内)。

        输出开关信号,由于输出寄存器的信号驱动能力比较弱,输出的信号只有电压没有电流,然后就有了MOS管这个器件,输出寄存器的信号通过控制MOS管的开断来控制这个回路是否形成。这个单个的MOS管来控制的形式就叫做开漏模式(OD)

复用开漏输出

        可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用)。端口必须配置成复用开漏功能输出模式。

推挽输出

        可以输出高低电平,连接数字器件;推挽结构一般是指两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止。高低电平由IC的电源决定。推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。

        如果想要输出端口有一定的驱动能力,就要在开漏模式下进行一些改进。结果就是通过一个输出控制门电路(两路信号)来使用两个MOS管进行控制,这两路信号是互斥的。如果想有开漏的功能,只需要控制底下的通路。想要有一定的驱动能力,就控制上面的通路。这种有驱动能力的控制形式叫做推挽输出。量化的来说,P-MOS承受的电流代表了驱动能力。N-MOS承受的能力叫做灌电流。

推挽复用输出

I/O复用和重映射

I/O复用

        STM32 有很多的内置外设,这些外设的外部引脚都是与 GPIO 复用的。也就是说,一个 GPIO如果可以复用为内置外设的功能引脚,那么当这个 GPIO 作为内置外设使用的时候,就叫做复用。当I/O端口被配置为复用功能时:

● 在开漏或推挽式配置中,输出缓冲器被打开
● 内置外设的信号驱动输出缓冲器(复用功能输出)
● 施密特触发输入被激活
● 弱上拉和下拉电阻被禁止
● 在每个APB2时钟周期,出现在I/O脚上的数据被采样到输入数据寄存器
● 开漏模式时,读输入数据寄存器时可得到I/O口状态
● 在推挽模式时,读输出数据寄存器时可得到最后一次写的值

I/O重映射

        为了使不同器件封装的外设 IO 功能数量达到最优,可以把一些复用功能重新映射到其他一些引脚上。 STM32 中有很多内置外设的输入输出引脚都具有重映射(remap)的功能。 我们知道每个内置外设都有若干个输入输出引脚,一般这些引脚的输出端口都是固定不变的,为了让设计工程师可以更好地安排引脚的走向和功能,在 STM32 中引入了外设引脚重映射的概念,即一个外设的引脚除了具有默认的端口外,还可以通过设置重映射寄存器的方式,把这个外设的引脚映射到其它的端口。

         从表中可以看出,默认情况下,串口 1 复用的时候的引脚位 PA9、PA10,同时我们可以将 TX 和 RX 重新映射到管脚 PB6 和 PB7 上面去。所以重映射我们同样要使能复用功能的时候讲解的 2 个时钟外,还要使能 AFIO 功能时钟,然后要调用重映射函数。

 GPIO的标准库

库函数

 GPIO_DeInit 将外设 GPIOx 寄存器重设为缺省值;
 GPIO_AFIODeInit 将复用功能(重映射事件控制和 EXTI 设置)重设为缺省值;
 GPIO_Init 根据 GPIO_InitStruct 中指定的参数初始化外设 GPIOx 寄存器;
 GPIO_StructInit 把 GPIO_InitStruct 中的每一个参数按缺省值填入;
 GPIO_ReadInputDataBit 读取指定端口管脚的输入;
 GPIO_ReadInputData 读取指定的 GPIO 端口输入;
 GPIO_ReadOutputDataBit 读取指定端口管脚的输出;
 GPIO_ReadOutputData 读取指定的 GPIO 端口输出;
 GPIO_SetBits 设置指定的数据端口位;
 GPIO_ResetBits 清除指定的数据端口位;
 GPIO_WriteBit 设置或者清除指定的数据端口位;
 GPIO_Write 向指定 GPIO 数据端口写入数据;
 GPIO_PinLockConfig 锁定 GPIO 管脚设置寄存器;
 GPIO_EventOutputConfig 选择 GPIO 管脚用作事件输出;
 GPIO_EventOutputCmd 使能或者失能事件输出;
 GPIO_PinRemapConfig 改变指定管脚的映射;
 GPIO_EXTILineConfig 选择 GPIO 管脚用作外部中断线路;

GPIO的HAL库

        1、使能GPIO端口时钟

        2、初始化GPIO引脚,即为GPIO初始化结构体赋值,并调用相应的初始化函数完成初始化配置。

        3、业务代码编写

        HAL_Init()函数为复位所有的硬件。

        SystemClock_Config();用于时钟初始化,CubeMX配置实现。

        MX_GPIO_Init()函数用于外设的GPIO初始化。

        在MX_GPIO_Init()函数中有一个结构体GPIO_InitTypeDef,先看一下结构体的成员变量

typedef struct
{
  uint32_t Pin;       /*!< Specifies the GPIO pins to be configured.
                           This parameter can be any value of @ref GPIO_pins_define */
  uint32_t Mode;      /*!< Specifies the operating mode for the selected pins.
                           This parameter can be a value of @ref GPIO_mode_define */
  uint32_t Pull;      /*!< Specifies the Pull-up or Pull-Down activation for the selected pins.
                           This parameter can be a value of @ref GPIO_pull_define */
  uint32_t Speed;     /*!< Specifies the speed for the selected pins.
                           This parameter can be a value of @ref GPIO_speed_define */
} GPIO_InitTypeDef;

        -Pin:引脚号选择,一个GPIO有16个引脚可以选择。可以在选择的时候进行或运算:GPIO_PIN_0| GPIO_PIN_4。

        -Mode:模式选择

        -Pull:上下拉,用于输入模式,可选:GPIO_NOPULL不上下拉;GPIO_PULLUP:使能下拉;GPIO_PULLDOWN使能下拉;

        -Speed:引脚速度,可选:GPIO_SPEED_FREQ_LOW:低速(2MHz);中速(10MHz);高速(50MHz)。

小tips

        1、当TTL电路驱动CMOS电路时,如果TTL电路输出的高电平低于CMOS电路的最低高电平(一般是3.5V),这时候就需要在TTL输出端接上拉电阻,来提高输出高电平的值。

        2、OC(集电极开路)门电路必须加上拉电阻,才能使用。

        3、为了加大输出引脚的驱动能力,单片机的管脚也会使用上拉电阻。

        4、在 CMOS 芯片上,为了防止静电造成损坏,不用的管脚不能悬空,一般接上拉电阻产生降低输入阻抗,提供泄荷通路。

        5、芯片的管脚加上拉电阻来提高输出电平,从而提高芯片输入信号的噪声容限增强抗干扰能力。

        6、提高总线的抗电磁干扰能力。管脚悬空就比较容易接受外界的电磁干扰。

        7、长线传输中电阻不匹配容易引起反射波干扰,加上下拉电阻是电阻匹配,有效的抑制反射波干扰。

上拉电阻阻值的选择原则:

        · 从节约功耗及芯片的灌电流能力考虑应当足够大;电阻大,电流小。
        · 从确保足够的驱动电流考虑应当足够小;电阻小,电流大。
        · 对于高速电路,过大的上拉电阻可能边沿变平缓。综合考虑。

        以上三点,通常在 1k 到 10k 之间选取。对下拉电阻也有类似道理对上拉电阻和下拉电阻的选择应结合开关管特性和下级电路的输入特性进行设定,主要需要考虑以下几个因素:

        ·驱动能力与功耗的平衡。以上拉电阻为例,一般地说,上拉电阻越小,驱动能力越强,但功耗越大,设计是应注意两者之间的均衡。

       ·下级电路的驱动需求。同样以上拉电阻为例, 当输出高电平时,开关管断开,上拉电阻应适当选择以能够向下级电路提供足够的电流。

        ·高低电平的设定。不同电路的高低电平的门槛电平会有不同,电阻应适当设定以确保能输出正确的电平。以上拉电阻为例,当输出低电平时,开关管导通,上拉电阻和开关管导通电阻分压值应确保在零电平门槛之下。

        ·频率特性。以上拉电阻为例,上拉电阻和开关管漏源级之间的电容和下级电路之间的输入电容会形成 RC 延迟,电阻越大,延迟越大。上拉电阻的设定应考虑电路在这方面的需求。

        

        

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值