STM32学习(四)GPIO输入检测

通过检测GPIO输入,让LED灯实现亮灭翻转的效果

跟(三)中类似,首先创建一个bsp_key.c和bsp_key.h文件,将与案件有关的宏定义和相应的函数都放在里面

1.首先在User文件夹下添加bsp_key.c文件,并通过bsp_key.c来包含bsp_key.h,并在魔术棒选项卡中包含头文件的路径

STM32学习(四)GPIO输入检测_第1张图片STM32学习(四)GPIO输入检测_第2张图片

 2.对按键进行宏定义

查阅指南者开发板可知,按键KEY1是接在GPIOA口的Pin0,故

STM32学习(四)GPIO输入检测_第3张图片

#define  KEY1_GPIO_PIN       GPIO_Pin_0
#define  KEY1_GPIO_PORT      GPIOA 
#define  KEY1_GPIO_CLK       RCC_APB2Periph_GPIOA

3.接着在bsp_key.c中编写初始化函数,其过程类似于(三)中LED灯的初始化



void KEY_GPIO_Config(void)
{
	
    //初始化一个结构体变量
	GPIO_InitTypeDef GPIO_InitStruct;
	
    //初始化时钟
	RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK, ENABLE);
	
    //配置结构体中Pin和Mode参数
    //因为是检测输入,那么速度就没有配置的必要了
	GPIO_InitStruct.GPIO_Pin = KEY1_GPIO_PIN;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
	//调用初始化函数
	GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStruct);
	
}

 4.编写一个按键检测函数

uint8_t Key_Scan(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
	//使用GPIO_ReadInputDataBit()来读取一位gpio输入的数据
	//函数原型GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
	
	if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON)
	{
		//松手检测
		while(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON);
		
		return KEY_ON;
	}
	else
		return KEY_OFF;
}

其中用到的函数GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

其作用是:检测一位输入,并返回值(0/1)

与之类似的还有uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

这个是一次读取16位输入

5.在main函数中调用并实现通过按键使灯亮灭翻转

int main(void)
{	
	//KEY_GPIO_Config();
	/*
	*一个莫名其妙的bug
	*配置LED的初始化函数要配置两次,否则不能生效
	*目前未找到解决方法,并且暂时不影响使用
	*/
	LED_R_GPIO_Config();
	KEY_GPIO_Config();
	LED_R_GPIO_Config();
	
	while(1)
	{
		
		if(Key_Scan(KEY1_GPIO_PORT, KEY1_GPIO_PIN) == KEY_ON)
		{
			LED_R_TOGGLE;
		}
	}

}

LED_R_TOGGLE;是在bsp_led中定义的宏,其具体实现为

#define  LED_R_TOGGLE        {LED_R_GPIO_PORT -> ODR ^= LED_R_GPIO_PIN;}

通过查询GPIO中的ODR寄存器来判断当前GPIO的状态,并且通过异或操作来实现翻转

6.补充 

异或运算   ----->  "^"

“^” 与1异或取反,与0异或不变

你可能感兴趣的:(STM32学习,嵌入式,stm32)