STM32F1入门2-GPIO




  • Hunto STM32培训系列
    文档及源码Github地址:hunto/learning_STM32


    STM32培训2 —— GPIO


    一、 STM32 GPIO输出模式

    1. 推挽输出

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

    推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。

    2. 开漏输出

    输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行。适合于做电流型的驱动,其吸收电流的能力相对强(一般20mA以内)。开漏形式的电路有以下几个特点:

    1. 利用外部电路的驱动能力,减少IC内部的驱动。当IC内部MOSFET导通时,驱动电流是从外部的VCC流经上拉电阻、MOSFET到GND。IC内部仅需很小的栅极驱动电流。

    2. 一般来说,开漏是用来连接不同电平的器件,匹配电平用的,因为开漏引脚不连接外部的上拉电阻时,只能输出低电平,如果需要同时具备输出高电平的功能,则需要接上拉电阻,很好的一个优点是通过改变上拉电源的电压,便可以改变传输电平。

    3. 开漏输出提供了灵活的输出方式,但是也有其弱点,就是带来上升沿的延时。

    关于推挽输出和开漏输出,最后用一幅最简单的图形来概括:该图中左边的便是推挽输出模式,其中比较器输出高电平时下面的PNP三极管截止,而上面NPN三极管导通,输出电平VS+;当比较器输出低电平时则恰恰相反,PNP三极管导通,输出和地相连,为低电平。右边的则可以理解为开漏输出形式,需要接上拉。

    0_1526398856492_20131222224529593.jpg

    3. 复用开漏输出、复用推挽输出

    可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用)

    这么多输出模式,怎么选?

    • 绝大多数情况下,使用推挽输出,高电平输出电压3.3V
    • 当需要调节输出电压时,使用开漏输出并外接上拉电阻

    二、 GPIO初始化

    1. 使能外部时钟

    所有外设都需要时钟驱动。STM32相较于51,有多个外设时钟,可以在需要使用它们时独立使能达到省电目的,因此,在使用对应外设的GPIO时,需要对相应时钟进行使能。

    • 对应库函数头文件:stm32f10x_rcc.h
    • 使能方法:
      /* 使能GPB时钟 */
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
      

    2. 配置GPIO初始化结构体GPIO_InitTypeDef

    GPIO初始化结构体用于配置GPIO的初始化参数。位于头文件stm32f10x_gpio.h中。

    typedef struct
    {
    
      uint16_t GPIO_Pin; // 需要初始化的GPIO口 ex: GPIO_Pin_0
      
      GPIOSpeed_TypeDef GPIO_Speed; // IO频率 ex: GPIO_Speed_50MHz
      
      GPIOMode_TypeDef GPIO_Mode; // IO模式   ex: GPIO_Mode_Out_PP
      
    } GPIO_InitTypeDef;
    

    3. 初始化GPIO函数GPIO_init

    • 函数声明
      void GPIO_Init(GPIO_TypeDef* GPIOx, 
      	       GPIO_InitTypeDef* GPIO_InitStruct)
      
    • Example
      /* GPIO初始化结构体 */
      GPIO_InitTypeDef  GPIO_InitStructure;
      
      /* 要初始化的IO口 */
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;	
      /* GPIO模式为推挽输出(Push-Pull) */
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
      /* GPIO频率 */
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      
      /* 初始化 */
      GPIO_Init(GPIOA, &GPIO_InitStructure);
      

    三、 GPIO输出高电平/低电平

    • GPIO_WriteBit

      GPIO_WriteBit(GPIO_TypeDef* GPIOx,  // GPIO_Port
                    u16 GPIO_Pin,   // GPIO_Pin
                    BitAction BitVal)  // 设置的值,声明见下方
      

      BitAction声明

      typedef enum
      { 
          Bit_RESET = 0,
          Bit_SET
      } BitAction;
      

      Example

      GPIO_WriteBit(GPIOA, GPIO_Pin_15, Bit_SET); // 输出高电平
      GPIO_WriteBit(GPIOA, GPIO_Pin_15, Bit_SET); // 输出低电平
      /* 设置多个(使用或运算) */
      GPIO_WriteBit(GPIOA, GPIO_Pin_15|GPIO_Pin_14, Bit_SET);
      
    • GPIO_SetBits
      设置IO端口为高电平

      void GPIO_SetBits(GPIO_TypeDef* GPIOx, u16 GPIO_Pin);
      

      Example

      GPIO_SetBits(GPIOC, GPIO_Pin_0);
      GPIO_SetBits(GPIOC, GPIO_Pin_0|GPIO_Pin_1);
      
    • GPIO_ResetBits
      设置IO端口为高电平

      void GPIO_SetBits(GPIO_TypeDef* GPIOx, u16 GPIO_Pin);
      

      Example

      GPIO_SetBits(GPIOC, GPIO_Pin_0);
      GPIO_SetBits(GPIOC, GPIO_Pin_0|GPIO_Pin_1);
      

    四、 STM32 GPIO输入模式

    1. 上拉输入/下拉输入

    • 上拉输入:电压拉高至3.3,断开状态为高电平,连通状态为低电平
    • 下拉输入:与上拉输入原理类似,效果相反

    2. 浮空输入

    浮空(floating)就是逻辑器件的输入引脚即不接高电平,也不接低电平。由于逻辑器件的内部结构,当它输入引脚悬空时,相当于该引脚接了高电平。一般实际运用时,引脚不建议悬空,易受干扰。 通俗讲就是让管脚什么都不接,浮空着。

    五、 GPIO读取输入电平

    1. GPIO_ReadInputDataBit

    u8 GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin)
    

    返回值:0/1

    例:对于按键
    0_1526399043383_QQ20180515-211413@2x.png

    • 当输入方式为上拉输入时,接通为0,断开为1
    • 下拉输入无效 (或按键的另一端为VCC则有效,接通为1)

 

Copyright © 2018 bbs.dian.org.cn All rights reserved.

Looks like your connection to Dian was lost, please wait while we try to reconnect.