目录
在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) /* Pin 0 selected */
#define GPIO_PIN_1 ((uint16_t)0x0002) /* Pin 1 selected */
#define GPIO_PIN_2 ((uint16_t)0x0004) /* Pin 2 selected */
#define GPIO_PIN_3 ((uint16_t)0x0008) /* Pin 3 selected */
#define GPIO_PIN_4 ((uint16_t)0x0010) /* Pin 4 selected */
#define GPIO_PIN_5 ((uint16_t)0x0020) /* Pin 5 selected */
#define GPIO_PIN_6 ((uint16_t)0x0040) /* Pin 6 selected */
#define GPIO_PIN_7 ((uint16_t)0x0080) /* Pin 7 selected */
#define GPIO_PIN_8 ((uint16_t)0x0100) /* Pin 8 selected */
#define GPIO_PIN_9 ((uint16_t)0x0200) /* Pin 9 selected */
#define GPIO_PIN_10 ((uint16_t)0x0400) /* Pin 10 selected */
#define GPIO_PIN_11 ((uint16_t)0x0800) /* Pin 11 selected */
#define GPIO_PIN_12 ((uint16_t)0x1000) /* Pin 12 selected */
#define GPIO_PIN_13 ((uint16_t)0x2000) /* Pin 13 selected */
#define GPIO_PIN_14 ((uint16_t)0x4000) /* Pin 14 selected */
#define GPIO_PIN_15 ((uint16_t)0x8000) /* Pin 15 selected */
#define GPIO_PIN_All ((uint16_t)0xFFFF) /* All pins selected */
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
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __APP_KEY_H
#define __APP_KEY_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#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 /* GPIO */
appKey.c
/**
******************************************************************************
* @file : appLed.c
* @brief : Led function
* @author : adam
******************************************************************************
* @attention
*
* Copyright (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
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __APP_LED_H
#define __APP_LED_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#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 /* GPIO */
appLed.c
/**
******************************************************************************
* @file : appLed.c
* @brief : Led function
* @author : adam
******************************************************************************
* @attention
*
* Copyright (c)
*
******************************************************************************
*/
#include "appLed.h"
#include "appKey.h"
extern uint32_t key_delay;
static void led_twinkle_all(uint32_t delay)
{
LED0_ON();
HAL_Delay(delay);
LED0_OFF();
HAL_Delay(delay);
LED1_ON();
HAL_Delay (delay);
LED1_OFF();
HAL_Delay(delay);
LED0_ON();
LED1_ON();
HAL_Delay(delay);
LED0_OFF();
LED1_OFF();
HAL_Delay(delay);
}
void led_twinkle(LED_USED select,uint32_t delay)
{
if(LED0 == select )
{
LED0_ON();
HAL_Delay(delay);
LED0_OFF();
HAL_Delay(delay);
}
if(LED1 == select )
{
LED1_ON();
HAL_Delay(delay);
LED1_OFF();
HAL_Delay(delay);
}
if(LEDALL == select )
{
led_twinkle_all(delay);
}
}
void led_key_ctl()
{
KEY_VALUE key_value;
key_value = key_scan(key_delay); //调用key_scan(),检测是什么按键被按下
if(KEY_DOWN_Value == key_value )
{
LED0_Toggle();
LED1_Toggle();
}
if(KEY_RIGHT_Value == key_value )
{
//LED0_Toggle(); //由于开发板已经左侧按键已经坏了,因此取消该功能
}
if(KEY_LEFT_Value == key_value )
{
LED1_Toggle();
}
}