STM32基础3--GPIO控制(LED&KEY)

目录

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)  /* 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();

    }

}


 main.c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

颖川初尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值