目录
HAL_GPIO_ReadPin
HAL_GPIO_WritePin
HAL_GPIO_TogglePin
appKey.h
appKey.c
appLed.h
appLed.c
main.c
在SMT2基础1,生成文件后。其实就可以调用HAL库中的"stm32f4xx_hal_gpio.h"的GPIO控制函数,对GPIO进行操控了。
HAL_GPIO_ReadPin
该函数,对引脚的电平的读取,也就是输入电平,返回值是电平的状态。GPIO_PIN_RESET 为低电平,GPIO_PIN_SET为高电平。
typedef enum
{
GPIO_PIN_RESET = 0,
GPIO_PIN_SET
}GPIO_PinState;
函数第1个形参是GPIO的分组,填入GPIO组的基地址即可
#define GPIOA ((GPIO_TypeDef *) GPIOA_base) #define GPIOB ((GPIO_TypeDef *) GPIOB_base) #define GPIOC ((GPIO_TypeDef *) GPIOC_base) #define GPIOD ((GPIO_TypeDef *) GPIOD_base) #define GPIOE ((GPIO_TypeDef *) GPIOE_base) #define GPIOF ((GPIO_TypeDef *) GPIOF_base) #define GPIOG ((GPIO_TypeDef *) GPIOG_base) #define GPIOH ((GPIO_TypeDef *) GPIOH_base) #define GPIOI ((GPIO_TypeDef *) GPIOI_base)
函数第2个形参是GPIO组的引脚号
#define GPIO_PIN_0 ((uint16_t)0x0001) #define GPIO_PIN_1 ((uint16_t)0x0002) #define GPIO_PIN_2 ((uint16_t)0x0004) #define GPIO_PIN_3 ((uint16_t)0x0008) #define GPIO_PIN_4 ((uint16_t)0x0010) #define GPIO_PIN_5 ((uint16_t)0x0020) #define GPIO_PIN_6 ((uint16_t)0x0040) #define GPIO_PIN_7 ((uint16_t)0x0080) #define GPIO_PIN_8 ((uint16_t)0x0100) #define GPIO_PIN_9 ((uint16_t)0x0200) #define GPIO_PIN_10 ((uint16_t)0x0400) #define GPIO_PIN_11 ((uint16_t)0x0800) #define GPIO_PIN_12 ((uint16_t)0x1000) #define GPIO_PIN_13 ((uint16_t)0x2000) #define GPIO_PIN_14 ((uint16_t)0x4000) #define GPIO_PIN_15 ((uint16_t)0x8000) #define GPIO_PIN_All ((uint16_t)0xFFFF)
HAL_GPIO_WritePin
该函数,对引脚的写电平,也就是输出电平,参考函数HAL_GPIO_ReadPin
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
HAL_GPIO_TogglePin
该函数,对引脚输出电平翻转,也就是输出高低电平。参考函数HAL_GPIO_ReadPin
void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
如果是简单的GPIO读取就可以,可以直接使用上面3个Hal库函数实现GPIO电平的读取。
为了方便led与key的控制,我写了相关的几个文件。
appKey.h
#ifndef __APP_KEY_H
#define __APP_KEY_H
#ifdef __cplusplus
extern "C" {
#endif
#include "main.h"
#include "gpio.h"
#define KEY_DOWN HAL_GPIO_ReadPin(KEY_DOWN_GPIO_Port, KEY_DOWN_Pin) //读引脚电平
#define KEY_RIGHT HAL_GPIO_ReadPin(KEY_RIGHT_GPIO_Port, KEY_RIGHT_Pin)
#define KEY_LEFT HAL_GPIO_ReadPin(KEY_LEFT_GPIO_Port, KEY_LEFT_Pin)
typedef enum
{
KEY_ON = 0,
KEY_OFF,
}KEY_STATE; //判断按键是否被按下
typedef enum
{
KEY_DOWN_Value = 0,
KEY_RIGHT_Value,
KEY_LEFT_Value,
}KEY_VALUE; //按键值
KEY_VALUE key_scan(uint32_t delay);
#ifdef __cplusplus
}
#endif
#endif
appKey.c
#include "appKey.h"
uint32_t key_delay =100;
KEY_VALUE key_scan(uint32_t delay)
{
if((KEY_ON == KEY_DOWN))
{
HAL_Delay(delay); // 去抖动
if((KEY_ON == KEY_DOWN))
{
return KEY_DOWN_Value; //返回按下的按键值
}
}
if((KEY_ON == KEY_RIGHT))
{
HAL_Delay(delay);
if((KEY_ON == KEY_RIGHT))
{
return KEY_RIGHT_Value;
}
}
if((KEY_ON == KEY_LEFT))
{
HAL_Delay(delay);
if((KEY_ON == KEY_LEFT))
{
return KEY_LEFT_Value;
}
}
}
appLed.h
#ifndef __APP_LED_H
#define __APP_LED_H
#ifdef __cplusplus
extern "C" {
#endif
#include "main.h"
#include "gpio.h"
#define LED0_ON() HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET)
#define LED0_OFF() HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_SET)
#define LED0_Toggle() HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin)
#define LED1_ON() HAL_GPIO_WritePin(LED0_GPIO_Port, LED1_Pin, GPIO_PIN_RESET)
#define LED1_OFF() HAL_GPIO_WritePin(LED0_GPIO_Port, LED1_Pin, GPIO_PIN_SET)
#define LED1_Toggle() HAL_GPIO_TogglePin(LED0_GPIO_Port, LED1_Pin)
typedef enum
{
LED0 = 0,
LED1,
LEDALL,
}LED_USED;
void led_twinkle(uint8_t select ,uint32_t delay);
void led_key_ctl();
#ifdef __cplusplus
}
#endif
#endif
#include "appKey.h"
uint32_t key_delay =100;
KEY_VALUE key_scan(uint32_t delay)
{
if((KEY_ON == KEY_DOWN))
{
HAL_Delay(delay); // 去抖动
if((KEY_ON == KEY_DOWN))
{
return KEY_DOWN_Value; //返回按下的按键值
}
}
if((KEY_ON == KEY_RIGHT))
{
HAL_Delay(delay);
if((KEY_ON == KEY_RIGHT))
{
return KEY_RIGHT_Value;
}
}
if((KEY_ON == KEY_LEFT))
{
HAL_Delay(delay);
if((KEY_ON == KEY_LEFT))
{
return KEY_LEFT_Value;
}
}
}



