野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 81|回复: 3

GPIO按键检测,LED灯不熄灭

[复制链接]
发表于 7 天前 | 显示全部楼层 |阅读模式
main.c
#include "led/bsp_led.h"
#include "led/bsp_key.h"
#include "main.h"
void LED_GPIO_Config();
void Key_GPIO_Config(void);
int main(void)
{
  LED_GPIO_Config();
  Key_GPIO_Config();
while (1)
  {
LED_RED;
    if(Key_Scan(KEY1_GPIO_PORT,KEY1_PIN) == KEY_ON)
    {
        LED1_TOGGLE;
    }
    if(Key_Scan(KEY2_GPIO_PORT,KEY2_PIN) == KEY_ON)
    {
        LED2_TOGGLE;
    }
}
}

bsp_led.c
#include "led/bsp_led.h"
#include <stm32f1xx_hal_gpio.h>

void LED_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    //RCC_APB2PeriphClockCmd(LED1_GPIO_CLK | LED2_GPIO_CLK | LED3_GPIO_CLK, ENABLE);
    __HAL_RCC_GPIOB_CLK_ENABLE();

    GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
    GPIO_InitStructure.Pull = GPIO_PULLUP;

    GPIO_InitStructure.Pin = LED1_GPIO_PIN;
    HAL_GPIO_Init(LED1_GPIO_PORT,&GPIO_InitStructure);  //GPIO端口初始化

    GPIO_InitStructure.Pin = LED2_GPIO_PIN;
    HAL_GPIO_Init(LED2_GPIO_PORT,&GPIO_InitStructure);

    GPIO_InitStructure.Pin = LED3_GPIO_PIN;
    HAL_GPIO_Init(LED3_GPIO_PORT,&GPIO_InitStructure);

    LED_RGBOFF;

}

void Delay(unsigned int i)
{
    for(;i>0;i--){}
}
bsp_led.h
#ifndef STM32_5_BSP_LED_H
#define STM32_5_BSP_LED_H

#include <stm32f1xx_hal.h>
#include <stm32f1xx_hal_gpio.h>

#define LED1_GPIO_PORT GPIOB
#define LED1_GPIO_PIN GPIO_PIN_5

#define LED2_GPIO_PORT GPIOB
#define LED2_GPIO_PIN GPIO_PIN_0

#define LED3_GPIO_PORT GPIOB
#define LED3_GPIO_PIN GPIO_PIN_1

#define ON GPIO_PIN_RESET
//#define ON 0
#define OFF GPIO_PIN_SET
//#define OFF 1

#define LED1(a) HAL_GPIO_WritePin(LED1_GPIO_PORT,LED1_GPIO_PIN,a)
#define LED2(a) HAL_GPIO_WritePin(LED2_GPIO_PORT,LED2_GPIO_PIN,a)
#define LED3(a) HAL_GPIO_WritePin(LED3_GPIO_PORT,LED3_GPIO_PIN,a)

//#define digitalHi(p,i) {p->BSRR=i;}
#define digitalHi(p,i) {p->BSRR=i;}
#define digitalLo(p,i) {p->BRR=i;}
//#define digitalLo(p,i) {p->BSRR=(uint32_t)i << 16;}
#define digitalToggle(p,i) {p->ODR ^= i;}


#define LED1_TOGGLE digitalToggle(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED1_OFF digitalHi(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED1_ON digitalLo(LED1_GPIO_PORT,LED1_GPIO_PIN)

#define LED2_TOGGLE digitalToggle(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define LED2_OFF digitalHi(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define LED2_ON digitalLo(LED2_GPIO_PORT,LED2_GPIO_PIN)

#define LED3_TOGGLE digitalToggle(LED3_GPIO_PORT,LED3_GPIO_PIN)
#define LED3_OFF digitalHi(LED3_GPIO_PORT,LED3_GPIO_PIN)
#define LED3_ON digitalLo(LED3_GPIO_PORT,LED3_GPIO_PIN)

#define LED_RED {LED1_ON; LED2_OFF; LED3_OFF;}
#define LED_GREEN {LED1_OFF; LED2_ON; LED3_OFF;}
#define LED_BLUE {LED1_OFF; LED2_OFF; LED3_ON;}
#define LED_YELLOW {LED1_ON; LED2_ON; LED3_OFF;}
#define LED_PURPLE {LED1_ON; LED2_OFF; LED3_ON;}
#define LED_CYAN {LED1_OFF; LED2_ON; LED3_ON;}
#define LED_WHITE {LED1_ON; LED2_ON; LED3_ON;}
#define LED_RGBOFF {LED1_OFF;LED2_OFF; LED3_OFF;}

void LED_GPIO_Config(void);
void Delay(unsigned int);

#endif //STM32_5_BSP_LED_H
bsp_key.c
#include "led/bsp_key.h"

void Key_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    KEY1_GPIO_CLK_ENABLE();
    KEY2_GPIO_CLK_ENABLE();

    GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
    GPIO_InitStructure.Pull = GPIO_NOPULL;

    GPIO_InitStructure.Pin = KEY1_PIN;
    HAL_GPIO_Init(KEY1_GPIO_PORT,&GPIO_InitStructure);
    GPIO_InitStructure.Pin = KEY2_PIN;
    HAL_GPIO_Init(KEY2_GPIO_PORT,&GPIO_InitStructure);
}

uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
{
    if (HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == KEY_ON)
    {
        while(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == KEY_ON)
        {
            return KEY_ON;
        }
    } else{
        return KEY_OFF;
    }
}
bsp_key.h
#ifndef STM32_5_BSP_KEY_H
#define STM32_5_BSP_KEY_H

#include <stdint-gcc.h>
#include "stm32f1xx_hal.h"

#define KEY1_PIN GPIO_PIN_0
#define KEY1_GPIO_PORT GPIOA
//#define KEY1_GPIO_CLK_ENABLE() __GPIOA_CLK_ENABLE()
#define KEY1_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE();

#define KEY2_PIN GPIO_PIN_13
#define KEY2_GPIO_PORT GPIOC
#define KEY2_GPIO_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE();

#define KEY_ON 1
#define KEY_OFF 0

uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);
void Key_GPIO_Config(void);

#endif //STM32_5_BSP_KEY_H
使用的是HAL库,板子是指南者,按下reset灯会熄灭,按下Key1灯变暗,按下key2灯变量略带黄绿光


回复

使用道具 举报

 楼主| 发表于 7 天前 | 显示全部楼层
再补充一下,在debug过程中,在main函数 if(Key_Scan(KEY1_GPIO_PORT,KEY1_PIN) == KEY_ON) 处设置断点,是可以看到按下key1后LED灯熄灭的。。。
回复 支持 反对

使用道具 举报

发表于 6 天前 | 显示全部楼层
加一个初始的时候,灯是亮还是灭试试看。
回复 支持 反对

使用道具 举报

 楼主| 发表于 6 天前 | 显示全部楼层
ZZZ周y 发表于 2020-10-14 11:16
加一个初始的时候,灯是亮还是灭试试看。

进入 void LED_GPIO_Config(); 函数进行初始化,红 绿 蓝会依次亮;函数 void LED_GPIO_Config(); 结束后灯全灭
回复 支持 反对

使用道具 举报

 楼主| 发表于 5 天前 | 显示全部楼层
问题解决,犯了个很蠢的错误,把LED_RED放到while循环外面或者直接删掉就行了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|站点地图|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号-2 ) 大学生ARM嵌入式2群

GMT+8, 2020-10-20 16:59 , Processed in 0.346459 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表