你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 3341|回复: 15

【HAL库每天一例】第004例:GPIO-按键状态判断之扫描式

[复制链接]

122

主题

129

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-5-28
发表于 2016-5-9 09:45:48 | 显示全部楼层 |阅读模式
【HAL库每天一例】系列例程从今天开始持续更新。。。。。
我们将坚持每天至少发布一个基于YS-F1Pro开发板的HAL库例程,
该系列例程将带领大家从零开始使用HAL库,后面会持续添加模块应用例程。
同样的,我们还程序发布基于HAL库的指导文档和视频教程,欢迎持续关注,并提出改进意见。
例程下载:
资料包括程序、相关说明资料以及软件使用截图
链接:https://pan.baidu.com/s/1i574oPv
密码:r3s3

(硬石YS-F1Pro开发板HAL库例程持续更新\1. 软件设计之基本裸机例程(HAL库版本)\
YSF1_HAL-004. GPIO-按键状态判断之扫描式)

/**
  ******************************************************************************
  *                           硬石YS-F1Pro开发板例程功能说明
  *
  *  例程名称: YSF1_HAL-004. GPIO-按键状态判断之扫描式
  *   
  ******************************************************************************
  * 说明:
  * 本例程配套硬石stm32开发板YS-F1Pro使用。
  * 版权归硬石嵌入式开发团队所有,请勿商用。
  ******************************************************************************
  */

【1】例程简介
  GPIO输入功能操作实现,之前控制GPIO输出高低电平实现LED灯亮灭,现在是时钟GPIO为输
入模式,按键按下时会改变GPIO的电平,对应的STM32检测到KEY对应IO电平发生变化,得出
按键状态,从而实现LED灯状态改变。  本例程在while(1)无限循环中不断检测按键状态,一
旦发现有状态改变就相应改变LED灯状态。
  在下个例程我们将讲解另外一种按键检测模式--中断式。
  
【2】跳线帽情况
******* 为保证例程正常运行,必须插入以下跳线帽 **********
丝印编号     IO端口      目标功能引脚        出厂默认设置
  JP3        PB0           LED1               已接入
  JP4        PG6           LED2               已接入
  JP5        PG7           LED3               已接入
  
【3】操作及现象
  使用开发板配套的MINI USB线连接到开发板标示“调试串口”字样的MIMI USB接口为开发板供电。
    下载完程序之后,板上三个LED灯全灭状态,按下KEY1或KEY2对应LED和蜂鸣器状态发生改变。

/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/

bsp_key.h文件内容:
  1. #ifndef __BSP_KEY_H__
  2. #define __BSP_KEY_H__

  3. /* 包含头文件 ----------------------------------------------------------------*/
  4. #include "stm32f1xx_hal.h"

  5. /* 类型定义 --------------------------------------------------------------*/
  6. typedef enum
  7. {
  8.   KEY_UP   = 0,
  9.   KEY_DOWN = 1,
  10. }KEYState_TypeDef;

  11. /* 宏定义 --------------------------------------------------------------------*/
  12. #define KEY1_RCC_CLK_ENABLE           __HAL_RCC_GPIOA_CLK_ENABLE
  13. #define KEY1_GPIO_PIN                 GPIO_PIN_0
  14. #define KEY1_GPIO                     GPIOA
  15. #define KEY1_DOWN_LEVEL               1  /* 根据原理图设计,KEY1按下时引脚为高电平,所以这里设置为1 */

  16. #define KEY2_RCC_CLK_ENABLE           __HAL_RCC_GPIOC_CLK_ENABLE
  17. #define KEY2_GPIO_PIN                 GPIO_PIN_13
  18. #define KEY2_GPIO                     GPIOC
  19. #define KEY2_DOWN_LEVEL               0  /* 根据原理图设计,KEY1按下时引脚为低电平,所以这里设置为0 */

  20. /* 扩展变量 ------------------------------------------------------------------*/
  21. /* 函数声明 ------------------------------------------------------------------*/
  22. void KEY_GPIO_Init(void);
  23. KEYState_TypeDef KEY1_StateRead(void);
  24. KEYState_TypeDef KEY2_StateRead(void);

  25. #endif  // __BSP_KEY_H__

  26. /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
复制代码


bsp_key.h文件内容:
  1. /**
  2.   ******************************************************************************
  3.   * 文件名程: bsp_key.c
  4.   * 作    者: 硬石嵌入式开发团队
  5.   * 版    本: V1.0
  6.   * 编写日期: 2015-10-04
  7.   * 功    能: 板载独立按键底层驱动函数
  8.   ******************************************************************************
  9.   * 说明:
  10.   * 本例程配套硬石stm32开发板YS-F1Pro使用。
  11.   *
  12.   * 淘宝:
  13.   * 论坛:ing10bbs
  14.   * 版权归硬石嵌入式开发团队所有,请勿商用。
  15.   ******************************************************************************
  16.   */

  17. /* 包含头文件 ----------------------------------------------------------------*/
  18. #include "key/bsp_key.h"

  19. /* 私有类型定义 --------------------------------------------------------------*/
  20. /* 私有宏定义 ----------------------------------------------------------------*/
  21. /* 私有变量 ------------------------------------------------------------------*/
  22. /* 扩展变量 ------------------------------------------------------------------*/
  23. /* 私有函数原形 --------------------------------------------------------------*/
  24. /* 函数体 --------------------------------------------------------------------*/

  25. /**
  26.   * 函数功能: 板载按键IO引脚初始化.
  27.   * 输入参数: 无
  28.   * 返 回 值: 无
  29.   * 说    明:使用宏定义方法代替具体引脚号,方便程序移植,只要简单修改bsp_key.h
  30.   *           文件相关宏定义就可以方便修改引脚。
  31.   */
  32. void KEY_GPIO_Init(void)
  33. {
  34.    /* 定义IO硬件初始化结构体变量 */
  35.   GPIO_InitTypeDef GPIO_InitStruct;
  36.         
  37.         /* 使能(开启)KEY引脚对应IO端口时钟 */  
  38.   KEY1_RCC_CLK_ENABLE();
  39.   KEY2_RCC_CLK_ENABLE();
  40.   
  41.   /* 配置KEY1 GPIO:输入下拉模式 */
  42.   GPIO_InitStruct.Pin = KEY1_GPIO_PIN;
  43.   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  44.   GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  45.   HAL_GPIO_Init(KEY1_GPIO, &GPIO_InitStruct);  
  46.   
  47.   /* 配置KEY2 GPIO:输入上拉模式 */
  48.   GPIO_InitStruct.Pin = KEY2_GPIO_PIN;
  49.   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  50.   GPIO_InitStruct.Pull = GPIO_PULLUP;
  51.   HAL_GPIO_Init(KEY2_GPIO, &GPIO_InitStruct);

  52. }

  53. /**
  54.   * 函数功能: 读取按键KEY1的状态
  55.   * 输入参数:无
  56.   * 返 回 值: KEY_DOWN:按键被按下;
  57.   *           KEY_UP  :按键没被按下
  58.   * 说    明:无。
  59.   */
  60. KEYState_TypeDef KEY1_StateRead(void)
  61. {
  62.   /* 读取此时按键值并判断是否是被按下状态,如果是被按下状态进入函数内 */
  63.   if(HAL_GPIO_ReadPin(KEY1_GPIO,KEY1_GPIO_PIN)==KEY1_DOWN_LEVEL)
  64.   {
  65.     /* 延时一小段时间,消除抖动 */
  66.     HAL_Delay(10);
  67.     /* 延时时间后再来判断按键状态,如果还是按下状态说明按键确实被按下 */
  68.     if(HAL_GPIO_ReadPin(KEY1_GPIO,KEY1_GPIO_PIN)==KEY1_DOWN_LEVEL)
  69.     {
  70.       /* 等待按键弹开才退出按键扫描函数 */
  71.       while(HAL_GPIO_ReadPin(KEY1_GPIO,KEY1_GPIO_PIN)==KEY1_DOWN_LEVEL);
  72.        /* 按键扫描完毕,确定按键被按下,返回按键被按下状态 */
  73.       return KEY_DOWN;
  74.     }
  75.   }
  76.   /* 按键没被按下,返回没被按下状态 */
  77.   return KEY_UP;
  78. }

  79. /**
  80.   * 函数功能: 读取按键KEY2的状态
  81.   * 输入参数:无
  82.   * 返 回 值: KEY_DOWN:按键被按下;
  83.   *           KEY_UP  :按键没被按下
  84.   * 说    明:无。
  85.   */
  86. KEYState_TypeDef KEY2_StateRead(void)
  87. {
  88.   /* 读取此时按键值并判断是否是被按下状态,如果是被按下状态进入函数内 */
  89.   if(HAL_GPIO_ReadPin(KEY2_GPIO,KEY2_GPIO_PIN)==KEY2_DOWN_LEVEL)
  90.   {
  91.     /* 延时一小段时间,消除抖动 */
  92.     HAL_Delay(10);
  93.     /* 延时时间后再来判断按键状态,如果还是按下状态说明按键确实被按下 */
  94.     if(HAL_GPIO_ReadPin(KEY2_GPIO,KEY2_GPIO_PIN)==KEY2_DOWN_LEVEL)
  95.     {
  96.       /* 等待按键弹开才退出按键扫描函数 */
  97.       while(HAL_GPIO_ReadPin(KEY2_GPIO,KEY2_GPIO_PIN)==KEY2_DOWN_LEVEL);
  98.        /* 按键扫描完毕,确定按键被按下,返回按键被按下状态 */
  99.       return KEY_DOWN;
  100.     }
  101.   }
  102.   /* 按键没被按下,返回没被按下状态 */
  103.   return KEY_UP;
  104. }

  105. /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
复制代码
CubeMX_1.jpg
CubeMX_2.jpg


<
回复

使用道具 举报

69

主题

1691

回帖

124

蝴蝶豆

版主

最后登录
2020-12-8
发表于 2016-5-9 11:14:35 | 显示全部楼层
HAL库和stm32cubeMX是什么区别?
回复 支持 反对

使用道具 举报

122

主题

129

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-5-28
 楼主| 发表于 2016-5-9 11:58:52 | 显示全部楼层
HAL库是一个软件库比如:
HAL_GPIO_ReadPin函数就是其中的一个函数,是标准库的更新换代产品
STM32CubeMX是个代码生成器软件,生成的代码是基于HAL库写的
回复 支持 反对

使用道具 举报

22

主题

1005

回帖

12

蝴蝶豆

金牌会员

最后登录
2020-11-17
发表于 2016-5-9 12:40:16 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

307

主题

3125

回帖

0

蝴蝶豆

论坛元老

最后登录
2020-7-17
发表于 2016-5-9 14:07:59 | 显示全部楼层
谢谢楼主
回复 支持 反对

使用道具 举报

18

主题

819

回帖

2

蝴蝶豆

论坛元老

最后登录
2020-12-4
发表于 2016-5-10 00:00:44 | 显示全部楼层
楼主有没有使用HAL库进行过us级延时呢?
回复 支持 反对

使用道具 举报

122

主题

129

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-5-28
 楼主| 发表于 2016-5-10 08:53:00 | 显示全部楼层
  1. /**
  2.   * 函数功能: 系统时钟配置
  3.   * 输入参数: 无
  4.   * 返 回 值: 无
  5.   * 说    明: 无
  6.   */
  7. void SystemClock_Config(void)
  8. {
  9.   RCC_OscInitTypeDef RCC_OscInitStruct;
  10.   RCC_ClkInitTypeDef RCC_ClkInitStruct;

  11.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;  // 外部晶振,8MHz
  12.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  13.   RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  14.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  15.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  16.   RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;  // 9倍频,得到72MHz主时钟
  17.   HAL_RCC_OscConfig(&RCC_OscInitStruct);

  18.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  19.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  20.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;       // 系统时钟:72MHz
  21.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;              // AHB时钟:72MHz
  22.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;               // APB1时钟:36MHz
  23.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;               // APB2时钟:72MHz
  24.   HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);

  25.         // HAL_RCC_GetHCLKFreq()/1000    1ms中断一次,即HAL_Delay函数延时基准为1ms
  26.         // HAL_RCC_GetHCLKFreq()/100000         10us中断一次,即HAL_Delay函数延时基准为10us
  27.         // HAL_RCC_GetHCLKFreq()/1000000 1us中断一次,即HAL_Delay函数延时基准为1us
  28.   HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000000);  // 配置并启动系统滴答定时器
  29.   /* 系统滴答定时器时钟源 */
  30.   HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
  31.   /* 系统滴答定时器中断优先级配置 */
  32.   HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
  33. }
复制代码

要是需要us延时,我一般是直接设置系统滴答定时器为1us中断
回复 支持 反对

使用道具 举报

3

主题

48

回帖

0

蝴蝶豆

高级会员

最后登录
2017-6-24
发表于 2016-5-11 09:37:14 | 显示全部楼层
feichangganxie
回复 支持 反对

使用道具 举报

0

主题

1

回帖

0

蝴蝶豆

新手上路

最后登录
2016-7-15
发表于 2016-6-7 22:16:53 | 显示全部楼层
谢谢大神分享 顶礼膜拜  刚好是想要学习的东西
回复 支持 反对

使用道具 举报

0

主题

153

回帖

0

蝴蝶豆

中级会员

最后登录
2020-1-5
发表于 2016-7-2 12:14:19 | 显示全部楼层
多谢楼主分享
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版