STM32F103_GPIO输入输出快速初始化

main.c文件 

#include "sys.h"
#include "delay.h"
#include "gpio.h"

 
uint8_t GetCNState;
int main(void)                    

     delay_init();            //延时函数初始化
     GPIO_Quick_Init(GPIOA_Pin0,GPIO_Mode_Out_PP,1);       //初始化A0为推挽输出模式,开始电平为1
     GPIO_Quick_Init(GPIOB_Pin1,GPIO_Mode_Out_PP,0);      //初始化B1为推挽输出模式, 开始电平为0
     GPIO_Quick_Init(GPIOC_Pin2,GPIO_Mode_IPU,1);             //初始化C2为上拉输入模式
 
     Write_GPIOx_Pinx(GPIOA_Pin0,0);                                       //A0输出0 
     GetCNState = Read_GPIOx_Pinx(GPIOB_Pin1);                  //读端口B1的电平
     while(1)       
     {
  
     }
}

 

 gpio.c文件

#include "gpio.h"
#include "delay.h"
 
 
/**************************************
功能 :GPIO快速初始化
参数1:选择GPIO
参数2:选择模式
    GPIO_Mode_AIN
    GPIO_Mode_Out_PP
    GPIO_Mode_IPD
    GPIO_Mode_IPU
    GPIO_Mode_Out_OD
    GPIO_Mode_Out_PP
    GPIO_Mode_AF_OD
    GPIO_Mode_AF_PP
参数3:IO口初始状态
**************************************/
 
void GPIO_Quick_Init(GPIOx_Pinx_enum GPIOx_Pinx, GPIOMode_TypeDef GPIO_Mode,u8 val) 
{
 static int Remap_SWJ_Disable = 0;
 GPIO_InitTypeDef  GPIO_InitStructure;
 GPIO_TypeDef* GPIOx;
 uint16_t GPIO_Pin;
 
  Check_GPIOx_Pinx(GPIOx_Pinx,&GPIOx,&GPIO_Pin);

 

 if     (GPIOx == GPIOA)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能端口时钟
 else if(GPIOx == GPIOB)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  //使能端口时钟
 else if(GPIOx == GPIOC)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);  //使能端口时钟
 else if(GPIOx == GPIOD)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);  //使能端口时钟
 else if(GPIOx == GPIOE)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);  //使能端口时钟
 else if(GPIOx == GPIOF)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);  //使能端口时钟
 else if(GPIOx == GPIOG)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);  //使能端口时钟
 
 if( ((GPIOx == GPIOB && GPIO_Pin == GPIO_Pin_3)  || (GPIOx == GPIOB && GPIO_Pin == GPIO_Pin_4)  ||
     (GPIOx == GPIOA && GPIO_Pin == GPIO_Pin_13) || (GPIOx == GPIOA && GPIO_Pin == GPIO_Pin_14) ||
      (GPIOx == GPIOA && GPIO_Pin == GPIO_Pin_15)) && Remap_SWJ_Disable == 0)
 {
  Remap_SWJ_Disable = 1;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);  //使能端口时钟
  GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
 }
 
 GPIO_InitStructure.GPIO_Pin   = GPIO_Pin;     
 GPIO_InitStructure.GPIO_Mode  = GPIO_Mode;         
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
 GPIO_Init(GPIOx, &GPIO_InitStructure);       //根据设定参数初始化
 
 GPIO_WriteBit(GPIOx,GPIO_Pin,(BitAction)val);
}

 


/**************************************
功能 :写GPIO
参数1:选择GPIO
参数2:写入的值
**************************************/
void Write_GPIOx_Pinx(GPIOx_Pinx_enum GPIOx_Pinx,u8 val)
{
 GPIO_TypeDef* GPIOx;
 uint16_t GPIO_Pin;
 
  Check_GPIOx_Pinx(GPIOx_Pinx,&GPIOx,&GPIO_Pin);
 
 GPIO_WriteBit(GPIOx,GPIO_Pin,(BitAction)val);
}

 

/**************************************
功能 :读GPIO
参数1:选择GPIO
返回 :GPIO值
**************************************/
uint8_t Read_GPIOx_Pinx(GPIOx_Pinx_enum GPIOx_Pinx)
{
 GPIO_TypeDef* GPIOx;
 uint16_t GPIO_Pin;
 
 Check_GPIOx_Pinx(GPIOx_Pinx,&GPIOx,&GPIO_Pin);
 
 return (GPIO_ReadInputDataBit(GPIOx,GPIO_Pin));
}

 

void Check_GPIOx_Pinx(GPIOx_Pinx_enum GPIOx_Pinx,GPIO_TypeDef** GPIOx,uint16_t* GPIO_Pin)   
{
 if(GPIOx_Pinx < 16*1)        *GPIOx = GPIOA;
 else if(GPIOx_Pinx < 16*2)   *GPIOx = GPIOB;
 else if(GPIOx_Pinx < 16*3)   *GPIOx = GPIOC;
 else if(GPIOx_Pinx < 16*4)   *GPIOx = GPIOD;
 else if(GPIOx_Pinx < 16*5)   *GPIOx = GPIOE;
 else if(GPIOx_Pinx < 16*6)   *GPIOx = GPIOF;
 else if(GPIOx_Pinx < 16*7)   *GPIOx = GPIOG;
 
 if(GPIOx_Pinx % 16 == 0)        *GPIO_Pin = GPIO_Pin_0;
 else if(GPIOx_Pinx % 16 == 1)   *GPIO_Pin = GPIO_Pin_1;
 else if(GPIOx_Pinx % 16 == 2)   *GPIO_Pin = GPIO_Pin_2;
 else if(GPIOx_Pinx % 16 == 3)   *GPIO_Pin = GPIO_Pin_3;
 else if(GPIOx_Pinx % 16 == 4)   *GPIO_Pin = GPIO_Pin_4;
 else if(GPIOx_Pinx % 16 == 5)   *GPIO_Pin = GPIO_Pin_5;
 else if(GPIOx_Pinx % 16 == 6)   *GPIO_Pin = GPIO_Pin_6;
 else if(GPIOx_Pinx % 16 == 7)   *GPIO_Pin = GPIO_Pin_7;
 else if(GPIOx_Pinx % 16 == 8)   *GPIO_Pin = GPIO_Pin_8;
 else if(GPIOx_Pinx % 16 == 9)   *GPIO_Pin = GPIO_Pin_9;
 else if(GPIOx_Pinx % 16 == 10)  *GPIO_Pin = GPIO_Pin_10;
 else if(GPIOx_Pinx % 16 == 11)  *GPIO_Pin = GPIO_Pin_11;
 else if(GPIOx_Pinx % 16 == 12)  *GPIO_Pin = GPIO_Pin_12;
 else if(GPIOx_Pinx % 16 == 13)  *GPIO_Pin = GPIO_Pin_13;
 else if(GPIOx_Pinx % 16 == 14)  *GPIO_Pin = GPIO_Pin_14;
 else if(GPIOx_Pinx % 16 == 15)  *GPIO_Pin = GPIO_Pin_15;
}

 

gpio.h文件

 

#ifndef __GPIO_H_
#define __GPIO_H_     
#include "sys.h"

typedef enum 
{
    GPIOA_Pin0 = 0,GPIOA_Pin1,GPIOA_Pin2,GPIOA_Pin3,GPIOA_Pin4,GPIOA_Pin5,GPIOA_Pin6,GPIOA_Pin7,GPIOA_Pin8,GPIOA_Pin9,GPIOA_Pin10,GPIOA_Pin11,GPIOA_Pin12,GPIOA_Pin13,GPIOA_Pin14,GPIOA_Pin15,
    GPIOB_Pin0,GPIOB_Pin1,GPIOB_Pin2,GPIOB_Pin3,GPIOB_Pin4,GPIOB_Pin5,GPIOB_Pin6,GPIOB_Pin7,GPIOB_Pin8,GPIOB_Pin9,GPIOB_Pin10,GPIOB_Pin11,GPIOB_Pin12,GPIOB_Pin13,GPIOB_Pin14,GPIOB_Pin15,
    GPIOC_Pin0,GPIOC_Pin1,GPIOC_Pin2,GPIOC_Pin3,GPIOC_Pin4,GPIOC_Pin5,GPIOC_Pin6,GPIOC_Pin7,GPIOC_Pin8,GPIOC_Pin9,GPIOC_Pin10,GPIOC_Pin11,GPIOC_Pin12,GPIOC_Pin13,GPIOC_Pin14,GPIOC_Pin15,
    GPIOD_Pin0,GPIOD_Pin1,GPIOD_Pin2,GPIOD_Pin3,GPIOD_Pin4,GPIOD_Pin5,GPIOD_Pin6,GPIOD_Pin7,GPIOD_Pin8,GPIOD_Pin9,GPIOD_Pin10,GPIOD_Pin11,GPIOD_Pin12,GPIOD_Pin13,GPIOD_Pin14,GPIOD_Pin15,
    GPIOE_Pin0,GPIOE_Pin1,GPIOE_Pin2,GPIOE_Pin3,GPIOE_Pin4,GPIOE_Pin5,GPIOE_Pin6,GPIOE_Pin7,GPIOE_Pin8,GPIOE_Pin9,GPIOE_Pin10,GPIOE_Pin11,GPIOE_Pin12,GPIOE_Pin13,GPIOE_Pin14,GPIOE_Pin15,
    GPIOF_Pin0,GPIOF_Pin1,GPIOF_Pin2,GPIOF_Pin3,GPIOF_Pin4,GPIOF_Pin5,GPIOF_Pin6,GPIOF_Pin7,GPIOF_Pin8,GPIOF_Pin9,GPIOF_Pin10,GPIOF_Pin11,GPIOF_Pin12,GPIOF_Pin13,GPIOF_Pin14,GPIOF_Pin15,
    GPIOG_Pin0,GPIOG_Pin1,GPIOG_Pin2,GPIOG_Pin3,GPIOG_Pin4,GPIOG_Pin5,GPIOG_Pin6,GPIOG_Pin7,GPIOG_Pin8,GPIOG_Pin9,GPIOG_Pin10,GPIOG_Pin11,GPIOG_Pin12,GPIOG_Pin13,GPIOG_Pin14,GPIOG_Pin15,
}GPIOx_Pinx_enum;

void Check_GPIOx_Pinx(GPIOx_Pinx_enum GPIOx_Pinx,GPIO_TypeDef** GPIOx,uint16_t* GPIO_Pin);
void GPIO_Quick_Init(GPIOx_Pinx_enum GPIOx_Pinx, GPIOMode_TypeDef GPIO_Mode,u8 val) ;
void Write_GPIOx_Pinx(GPIOx_Pinx_enum GPIOx_Pinx,u8 val) ;
uint8_t Read_GPIOx_Pinx(GPIOx_Pinx_enum GPIOx_Pinx);         
void Get_Key_Time(GPIOx_Pinx_enum GPIOx_Pinx,long* PressLastTimes,u8 PressCN,u8 IsWait);
#endif
 

你可能感兴趣的:(STM32F103_GPIO输入输出快速初始化)