野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 19931|回复: 3

GPIO按键检测,LED灯不熄灭

[复制链接]
发表于 2020-10-13 19:20:06 | 显示全部楼层 |阅读模式
  1. main.c
  2. #include "led/bsp_led.h"
  3. #include "led/bsp_key.h"
  4. #include "main.h"
  5. void LED_GPIO_Config();
  6. void Key_GPIO_Config(void);
  7. int main(void)
  8. {
  9.   LED_GPIO_Config();
  10.   Key_GPIO_Config();
  11. while (1)
  12.   {
  13. LED_RED;
  14.     if(Key_Scan(KEY1_GPIO_PORT,KEY1_PIN) == KEY_ON)
  15.     {
  16.         LED1_TOGGLE;
  17.     }
  18.     if(Key_Scan(KEY2_GPIO_PORT,KEY2_PIN) == KEY_ON)
  19.     {
  20.         LED2_TOGGLE;
  21.     }
  22. }
  23. }
复制代码

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

  4. void LED_GPIO_Config(void)
  5. {
  6.     GPIO_InitTypeDef GPIO_InitStructure;
  7.     //RCC_APB2PeriphClockCmd(LED1_GPIO_CLK | LED2_GPIO_CLK | LED3_GPIO_CLK, ENABLE);
  8.     __HAL_RCC_GPIOB_CLK_ENABLE();

  9.     GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
  10.     GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
  11.     GPIO_InitStructure.Pull = GPIO_PULLUP;

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

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

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

  18.     LED_RGBOFF;

  19. }

  20. void Delay(unsigned int i)
  21. {
  22.     for(;i>0;i--){}
  23. }
复制代码
  1. bsp_led.h
  2. #ifndef STM32_5_BSP_LED_H
  3. #define STM32_5_BSP_LED_H

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

  6. #define LED1_GPIO_PORT GPIOB
  7. #define LED1_GPIO_PIN GPIO_PIN_5

  8. #define LED2_GPIO_PORT GPIOB
  9. #define LED2_GPIO_PIN GPIO_PIN_0

  10. #define LED3_GPIO_PORT GPIOB
  11. #define LED3_GPIO_PIN GPIO_PIN_1

  12. #define ON GPIO_PIN_RESET
  13. //#define ON 0
  14. #define OFF GPIO_PIN_SET
  15. //#define OFF 1

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

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


  24. #define LED1_TOGGLE digitalToggle(LED1_GPIO_PORT,LED1_GPIO_PIN)
  25. #define LED1_OFF digitalHi(LED1_GPIO_PORT,LED1_GPIO_PIN)
  26. #define LED1_ON digitalLo(LED1_GPIO_PORT,LED1_GPIO_PIN)

  27. #define LED2_TOGGLE digitalToggle(LED2_GPIO_PORT,LED2_GPIO_PIN)
  28. #define LED2_OFF digitalHi(LED2_GPIO_PORT,LED2_GPIO_PIN)
  29. #define LED2_ON digitalLo(LED2_GPIO_PORT,LED2_GPIO_PIN)

  30. #define LED3_TOGGLE digitalToggle(LED3_GPIO_PORT,LED3_GPIO_PIN)
  31. #define LED3_OFF digitalHi(LED3_GPIO_PORT,LED3_GPIO_PIN)
  32. #define LED3_ON digitalLo(LED3_GPIO_PORT,LED3_GPIO_PIN)

  33. #define LED_RED {LED1_ON; LED2_OFF; LED3_OFF;}
  34. #define LED_GREEN {LED1_OFF; LED2_ON; LED3_OFF;}
  35. #define LED_BLUE {LED1_OFF; LED2_OFF; LED3_ON;}
  36. #define LED_YELLOW {LED1_ON; LED2_ON; LED3_OFF;}
  37. #define LED_PURPLE {LED1_ON; LED2_OFF; LED3_ON;}
  38. #define LED_CYAN {LED1_OFF; LED2_ON; LED3_ON;}
  39. #define LED_WHITE {LED1_ON; LED2_ON; LED3_ON;}
  40. #define LED_RGBOFF {LED1_OFF;LED2_OFF; LED3_OFF;}

  41. void LED_GPIO_Config(void);
  42. void Delay(unsigned int);

  43. #endif //STM32_5_BSP_LED_H
复制代码
  1. bsp_key.c
  2. #include "led/bsp_key.h"

  3. void Key_GPIO_Config(void)
  4. {
  5.     GPIO_InitTypeDef GPIO_InitStructure;
  6.     KEY1_GPIO_CLK_ENABLE();
  7.     KEY2_GPIO_CLK_ENABLE();

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

  10.     GPIO_InitStructure.Pin = KEY1_PIN;
  11.     HAL_GPIO_Init(KEY1_GPIO_PORT,&GPIO_InitStructure);
  12.     GPIO_InitStructure.Pin = KEY2_PIN;
  13.     HAL_GPIO_Init(KEY2_GPIO_PORT,&GPIO_InitStructure);
  14. }

  15. uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
  16. {
  17.     if (HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == KEY_ON)
  18.     {
  19.         while(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == KEY_ON)
  20.         {
  21.             return KEY_ON;
  22.         }
  23.     } else{
  24.         return KEY_OFF;
  25.     }
  26. }
复制代码
  1. bsp_key.h
  2. #ifndef STM32_5_BSP_KEY_H
  3. #define STM32_5_BSP_KEY_H

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

  6. #define KEY1_PIN GPIO_PIN_0
  7. #define KEY1_GPIO_PORT GPIOA
  8. //#define KEY1_GPIO_CLK_ENABLE() __GPIOA_CLK_ENABLE()
  9. #define KEY1_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE();

  10. #define KEY2_PIN GPIO_PIN_13
  11. #define KEY2_GPIO_PORT GPIOC
  12. #define KEY2_GPIO_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE();

  13. #define KEY_ON 1
  14. #define KEY_OFF 0

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

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


回复

使用道具 举报

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

使用道具 举报

发表于 2020-10-14 11:16:00 | 显示全部楼层
加一个初始的时候,灯是亮还是灭试试看。
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-10 18:43 , Processed in 0.031997 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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