STM32L1X系列GPIO运用

STM32L15x 系列中基本步骤是和STM32F10x相同的

一 配置GPIO

  初始化GPIO时我们需要催一下内容进行配置(以下步骤没有必然顺序)

  1 创建GPIO结构

GPIO_InitTypeDef GPIO_InitStructure;

   2 使能需要端口时钟

RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOC| RCC_AHBPeriph_GPIOD| RCC_AHBPeriph_GPIOE| RCC_AHBPeriph_GPIOH, ENABLE );

  3 配置 GPIO_InitStructure  结构体成员(不同之处在这里)

  例:

GPIO_InitStructure.GPIO_Pin = LD_GREEN_GPIO_PIN | LD_BLUE_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init( LD_GPIO_PORT, &GPIO_InitStructure );  

4

GPIO_Reset( LD_GPIO_PORT, LD_GREEN_GPIO_PIN );
GPIO_Reset( LD_GPIO_PORT, LD_BLUE_GPIO_PIN );


二 分析

首先看一下STM32L15x  的 GPIO_InitTypeDef  这个结构体

  typedef struct

     {

uint32_t GPIO_Pin; //对应管脚  GPIOx_Pinx0~15

GPIOMode_TypeDef GPIO_Mode; //所选管脚的模式:输入、输出、悬空、模拟

       GPIOSpeed_TypeDef GPIO_Speed; //所选管脚的响应速率 400K/ 10M /20M/ 40M

GPIOOType_TypeDef GPIO_OType; //所选管脚的开漏、上/下拉

       GPIOPuPd_TypeDef GPIO_PuPd; //所选管脚是否上/下拉

     }GPIO_InitTypeDef;

每个结构体成员又是以枚举形式结构体出现。

     typedef enum

     {

      GPIO_Mode_IN   = 0x00, /*!< GPIO Input Mode */

      GPIO_Mode_OUT  = 0x01, /*!< GPIO Output Mode */

      GPIO_Mode_AF   = 0x02, /*!< GPIO Alternate function Mode */

      GPIO_Mode_AN   = 0x03  /*!< GPIO Analog Mode */

    }GPIOMode_TypeDef;


    #define IS_GPIO_MODE(MODE) (((MODE) == GPIO_Mode_IN)  || ((MODE) == GPIO_Mode_OUT)  ((MODE) == GPIO_Mode_AF)|| ((MODE) == GPIO_Mode_AN))

    typedef enum

    {

      GPIO_Speed_400KHz = 0x00, /*!< Very Low Speed */

      GPIO_Speed_2MHz   = 0x01, /*!< Low Speed */

      GPIO_Speed_10MHz  = 0x02, /*!< Medium Speed */

      GPIO_Speed_40MHz  = 0x03  /*!< High Speed */

    }GPIOSpeed_TypeDef;


    #define IS_GPIO_SPEED(SPEED) (((SPEED) == GPIO_Speed_400KHz) || ((SPEED) == GPIO_Speed_2MHz)  ((SPEED) == GPIO_Speed_10MHz)||  ((SPEED) == GPIO_Speed_40MHz))

    typedef enum

    { GPIO_OType_PP = 0x00,

      GPIO_OType_OD = 0x01

    }GPIOOType_TypeDef;

   //推挽输出和开漏输出在这儿配置

    #define IS_GPIO_OTYPE(OTYPE) (((OTYPE) == GPIO_OType_PP) || ((OTYPE) == GPIO_OType_OD))

    typedef enum

    { GPIO_PuPd_NOPULL = 0x00,

      GPIO_PuPd_UP     = 0x01,

      GPIO_PuPd_DOWN   = 0x02

    }GPIOPuPd_TypeDef;

    #define IS_GPIO_PUPD(PUPD) (((PUPD) == GPIO_PuPd_NOPULL) || ((PUPD) == GPIO_PuPd_UP) ((PUPD) == GPIO_PuPd_DOWN))

而 stm32f10x  就没有分那么多层次直接定义每种输入输出模式对应的值

typedef enum
{ GPIO_Mode_AIN = 0x0,
  GPIO_Mode_IN_FLOATING = 0x04,
  GPIO_Mode_IPD = 0x28,
  GPIO_Mode_IPU = 0x48,
  GPIO_Mode_Out_OD = 0x14,
  GPIO_Mode_Out_PP = 0x10,
  GPIO_Mode_AF_OD = 0x1C,
  GPIO_Mode_AF_PP = 0x18
}GPIOMode_TypeDef;

这是因为 STM32L15x 在硬件的输出上也加上了上拉下拉的可选配置。这样做是为了使用更灵活。使用者可在需要上拉输出的时候直接配置GPIO而不必在外围电路增加元器件。

posted @ 2019-03-15 18:06  朽木生  阅读(911)  评论(0编辑  收藏  举报