按键检测使用到GPIO外设的基本输入功能。
1.硬件设计
作者使用的硬件没有按键模块。故使用了一个引脚模拟按键,将PWM1引脚拉低表示按键按下。思路如下:PWM1配置为输入,默认拉高,PWM1手动接地来模拟按下按键,此时PWM1拉低。当PWM1拉高时,LED亮,当PWM1拉低时,LED灭。
2.软件设计
#ifndef __BSP_KEY_H
#define __BSP_KEY_H
#ifdef __cplusplus
extern "C"{
#endif
#include "stm32f4xx.h"
#define KEY_PIN GPIO_Pin_0
#define KEY_GPIO_Port GPIOA
#define KEY_GPIO_CLK RCC_AHB1Periph_GPIOA
void Init_KEY(void);
uint8_t GET_KEY_STATUS(void);
#ifdef __cplusplus
}
#endif
#endif
#include "bsp_key.h"
void Init_KEY(void)
{
//使能GPIO时钟
RCC_AHB1PeriphClockCmd(KEY_GPIO_CLK,ENABLE);
//初始化GPIO
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin=KEY_PIN;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN;
//GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;//输入模式时不需要配置输出模式
GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;//默认拉高
//GPIO_InitStruct.GPIO_Speed=GPIO_Fast_Speed;//输入模式时不需要配置速度
GPIO_Init(KEY_GPIO_Port,&GPIO_InitStruct);
}
uint8_t GET_KEY_STATUS(void)
{
return GPIO_ReadInputDataBit(KEY_GPIO_Port,KEY_PIN);
}
#include "bsp_led.h"
#include "bsp_key.h"
void delay(uint32_t cnt)
{
while(cnt--);
}
int main(void)
{
Init_LED();
Init_KEY();
/* Infinite loop */
while (1)
{
if(Bit_SET==GET_KEY_STATUS())
{
//输入高电平
LED_ON();
}else if(Bit_RESET==GET_KEY_STATUS())
{
//输入低电平
LED_OFF();
}
else
{
//输入不确定
}
}
}