1.2 STM32的GPIO

发布时间 2023-08-22 21:00:21作者: 杨昊天

一、GPIO的8种输入输出模式:

1. 输入:

  GPIO_Mode_AIN     // 模拟输入:用于ADC   
  GPIO_Mode_IN_FLOATING    //浮空输入
  GPIO_Mode_IPD     //下拉输入
  GPIO_Mode_IPU    //上拉输入

2. 输出:

  GPIO_Mode_Out_OD   //开漏输出

  GPIO_Mode_Out_PP    //推挽输出

  GPIO_Mode_AF_OD    //复用开漏输出

  GPIO_Mode_AF_PP    //复用推挽输出

 

 RCC时钟使能:

  void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);   //AHB

  void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);   //APB2

  void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);    //APB1

GPIO:

  void GPIO_DeInit(GPIO_TypeDef* GPIOx);      //GPIO复位
  void GPIO_AFIODeInit(void);        //AFIO复位
  void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);     //GPIO初始化
  void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);      //结构体变量给初始值
  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);

LED点灯:

  GPIO_InitTypeDef GPIO_InitTypeDefStructure;
  GPIO_InitTypeDefStructure.GPIO_Mode=GPIO_Mode_Out_PP;  //推挽输出
  GPIO_InitTypeDefStructure.GPIO_Pin=GPIO_Pin_1;      //PA1
  GPIO_InitTypeDefStructure.GPIO_Speed=GPIO_Speed_50MHz;  //速度
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);  //使能APB2时钟
  GPIO_Init(GPIOA,&GPIO_InitTypeDefStructure);  //GPIOA初始化

  GPIO_SetBits(GPIOA,GPIO_Pin_1);

按键控制LED点亮:

按键Key.c:

void Key_Init(void){
  GPIO_InitTypeDef GPIO_InitTypeDefStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  GPIO_InitTypeDefStructure.GPIO_Mode=GPIO_Mode_IPD;
  GPIO_InitTypeDefStructure.GPIO_Pin=GPIO_Pin_11;
  GPIO_InitTypeDefStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOB,&GPIO_InitTypeDefStructure);
}

uint8_t Key_Out(void){

  uint8_t KeyNum = 0;

  if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0){         //防抖动

    Delay_us(10);
    while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0);
    Delay_us(10);
    KeyNum = 1;
  }
  return KeyNum;
}

main.c:

  KeyNum=Key_Out();

  if(KeyNum==1){

    GPIO_SetBits(GPIOA,GPIO_Pin_1);

}