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;
}