通过检测GPIO输入,让LED灯实现亮灭翻转的效果
跟(三)中类似,首先创建一个bsp_key.c和bsp_key.h文件,将与案件有关的宏定义和相应的函数都放在里面
1.首先在User文件夹下添加bsp_key.c文件,并通过bsp_key.c来包含bsp_key.h,并在魔术棒选项卡中包含头文件的路径
2.对按键进行宏定义
查阅指南者开发板可知,按键KEY1是接在GPIOA口的Pin0,故
#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异或不变