STM32F4开发板----GPIO(001)

STM32F4开发板快速入门—-GPIO篇
GPIO
设置输入/出总共8种模式

* 输入浮空,输入上拉,输入下拉,模拟输入。

* 开漏输出,推挽输出,推挽复用共功能,开漏复用功能

模式选择的话,一般得看具体电路了,具体看输入的信号,比如接低电平信号,上拉成高电平,接高电平信号下拉成低电平。

初始化参数

/**
  * @brief   GPIO Init structure definition  
  */
typedef struct
{
  uint32_t GPIO_Pin;              /*!< Specifies the GPIO pins to be configured.
                                       This parameter can be any value of @ref GPIO_pins_define */

  GPIOMode_TypeDef GPIO_Mode;     /*!< Specifies the operating mode for the selected pins.
                                       This parameter can be a value of @ref GPIOMode_TypeDef */

  GPIOSpeed_TypeDef GPIO_Speed;   /*!< Specifies the speed for the selected pins.
                                       This parameter can be a value of @ref GPIOSpeed_TypeDef */

  GPIOOType_TypeDef GPIO_OType;   /*!< Specifies the operating output type for the selected pins.
                                       This parameter can be a value of @ref GPIOOType_TypeDef */

  GPIOPuPd_TypeDef GPIO_PuPd;     /*!< Specifies the operating Pull-up/Pull down for the selected pins.
                                       This parameter can be a value of @ref GPIOPuPd_TypeDef */
}GPIO_InitTypeDef;

初始化实例,设置GPIOF.9|10普通输出模式
推挽输出,速度为100MHz,上拉,同时引脚置高

 GPIO_InitTypeDef  GPIO_InitStructure;

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//Ê使能GPIOF时钟

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式1
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化

  GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10引脚置高

相关所有的库函数

/*  Function used to set the GPIO configuration to the default reset state ****/
void GPIO_DeInit(GPIO_TypeDef* GPIOx);

/* Initialization and Configuration functions *********************************/
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

/* GPIO Read and Write functions **********************************************/
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
void GPIO_ToggleBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

/* GPIO Alternate functions configuration function ****************************/
void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF);

设置高低电平语句

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

GPIO_SetBits(GPIOA, GPIO_Pin_5);    //GPIOA.5=1,置位高电平·;
void GPIO_ResetBits(GPIOA, GPIO_Pin_5);    //GPIOA.5=0,置位低电平;

或者按照这种模式

//IO操作,只对单一IO口
//确保n的值小于16
#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //输出
#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //输入

#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出
#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //输出

设置实例对比

/*下面方式是直接操作库函数方式读取IO*/
#define KEY0         GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) //PE4
#define KEY1         GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)    //PE3
#define KEY2         GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) //PE2
#define WK_UP     GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)    //PA0

下面是直接同为位带操作读取IO

/*
#define KEY0         PEin(4)       //PE4
#define KEY1         PEin(3)        //PE3
#define KEY2         PEin(2)        //P32
#define WK_UP     PAin(0)        //PA0
*/

按键处理,矩阵键盘

对于按键,使用读函数
逻辑分析

//支持连续按下
void key_scan(){
    if(key按下){
    return 按键按下
   }else
    return 按键没有按下
}

//不支持连续按下
void key_scan(){
    static u8 key_up=1;//记录上次状态,初始化松开
    if(key按下){
        if(key_up=1)//松开了,按键有效
            return 按键按下
        else
            return 按键松开
        key_up=0
    }else
    key_up=1;//松开
}

实例对比

u8 KEY_Scan(u8 mode)
{    
    static u8 key_up=1;//按键松开标志
    if(mode)key_up=1;  //支持连按         
    if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
    {
        delay_ms(10);//去抖动
        key_up=0;
        if(KEY0==0)return 1;
        else if(KEY1==0)return 2;
        else if(KEY2==0)return 3;
        else if(WK_UP==1)return 4;
    }else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1;      
    return 0;// 无按键按下
}

矩阵键盘的话

u8 KEY_Scan(u8 mode)  //mode=0  ?????  mode=1  
{    

  if(mode)key_up=1;  

    GPIO_SetBits(GPIOD,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11);    

  if(key_up && GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15)==1)
  {
    delay_ms(10);//去抖动
    key_up=0;

    GPIO_SetBits(GPIOD,GPIO_Pin_8);     
    GPIO_ResetBits(GPIOD,GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11);   
    if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_12)==1) return 1;
    else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13)==1) return 2;
    else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_14)==1) return 3;
    else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_15)==1) return 4;

    GPIO_SetBits(GPIOD,GPIO_Pin_9);
    GPIO_ResetBits(GPIOD,GPIO_Pin_8|GPIO_Pin_10|GPIO_Pin_11);
    if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_12)==1) return 5;
    else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13)==1) return 6;
    else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_14)==1) return 7;
    else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_15)==1) return 8;

    GPIO_SetBits(GPIOD,GPIO_Pin_10);
    GPIO_ResetBits(GPIOD,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_11);
    if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_12)==1) return 9;
    else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13)==1) return 10;
    else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_14)==1) return 11;
    else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_15)==1) return 12;

    GPIO_SetBits(GPIOD,GPIO_Pin_11);
    GPIO_ResetBits(GPIOD,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10);
    if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_12)==1) return 13;
    else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13)==1) return 14;
    else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_14)==1) return 15;
    else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_15)==1) return 16;
  }
  else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_12)==0&&GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13)==0&&GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_14)==0&&GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_15)==0) 

key_up=1;   
return 0;
}

猜你喜欢

转载自blog.csdn.net/klaus_x/article/details/80171130