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

查看: 2733|回复: 6

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

[复制链接]

122

主题

129

回帖

0

蝴蝶豆

论坛元老

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

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

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

【1】例程简介
  中断:本来处于正常状态(比如我现在处于写程序状态),突然有个外部因素干扰(比如快递员
打电话叫我去拿快递),然后马上处理干扰事项(跑下楼去签收快递),解决好后又回到原来正常状
态(拿好快递后又开始写程序)。在中断产生后一般会去执行中断服务函数,实现特定任务(这里跑
下来去签收快递就是中断服务函数内容)。
  STM32每个GPIO都可以做为中断输入引脚,另外还有一些内部资源中断,比如定时器中断,ADC
中断、DMA中断等等。外部引脚中断可设置为多种模式,比如上升沿触发、下降沿触发、电平触发
等等模式。
  KEY1和KEY2按键被按下时会产生电平变化,可以做为中断触发源,对应的把KEY1和KEY2对应引
脚设置为中断输入触发功能,当中断产生时,可以认为是按键按按下或者弹开。
  相比上个例程的扫描式按键检测,使用中断按键检测,可以达到更高的反应速度。
  
【2】跳线帽情况
******* 为保证例程正常运行,必须插入以下跳线帽 **********
丝印编号     IO端口      目标功能引脚        出厂默认设置
  JP3        PB0           LED1               已接入
  JP4        PG6           LED2               已接入
  JP5        PG7           LED3               已接入
  
【3】操作及现象
    使用开发板配套的MINI USB线连接到开发板标示“调试串口”字样的MIMI USB接口为开发板供电。
下载完程序之后,板上三个LED灯全灭状态,板上三个LED灯全灭状态,按下KEY1或KEY2对应LED和蜂鸣
器状态发生改变。

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


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 KEY1_EXTI_IRQn                EXTI0_IRQn
  17. #define KEY1_EXTI_IRQHandler          EXTI0_IRQHandler

  18. #define KEY2_RCC_CLK_ENABLE           __HAL_RCC_GPIOC_CLK_ENABLE
  19. #define KEY2_GPIO_PIN                 GPIO_PIN_13
  20. #define KEY2_GPIO                     GPIOC
  21. #define KEY2_DOWN_LEVEL               0  /* 根据原理图设计,KEY1按下时引脚为低电平,所以这里设置为0 */
  22. #define KEY2_EXTI_IRQHandler          EXTI15_10_IRQHandler
  23. #define KEY2_EXTI_IRQn                EXTI15_10_IRQn

  24. /* 扩展变量 ------------------------------------------------------------------*/
  25. /* 函数声明 ------------------------------------------------------------------*/
  26. void KEY_GPIO_Init(void);
  27. KEYState_TypeDef KEY1_StateRead(void);
  28. KEYState_TypeDef KEY2_StateRead(void);

  29. #endif  // __BSP_KEY_H__

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

bsp_key.c文件内容:
  1. /**
  2.   ******************************************************************************
  3.   * 文件名程: bsp_key.c
  4.   * 作    者: 硬石嵌入式开发团队
  5.   * 版    本: V1.0
  6.   * 编写日期: 2015-10-04
  7.   * 功    能: 板载独立按键底层驱动函数
  8.   ******************************************************************************
  9.   * 说明:
  10.   * 本例程配套硬石stm32开发板YS-F1Pro使用。
  11.   *
  12.   * 淘宝:
  13.   * 论坛:http://www.ing10bbs.com
  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_IT_RISING;
  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_IT_FALLING;
  50.   GPIO_InitStruct.Pull = GPIO_PULLUP;
  51.   HAL_GPIO_Init(KEY2_GPIO, &GPIO_InitStruct);
  52.   
  53.     /* EXTI interrupt init*/
  54.   HAL_NVIC_SetPriority(KEY1_EXTI_IRQn, 1, 0);
  55.   HAL_NVIC_EnableIRQ(KEY1_EXTI_IRQn);

  56.   HAL_NVIC_SetPriority(KEY2_EXTI_IRQn, 1, 1);
  57.   HAL_NVIC_EnableIRQ(KEY2_EXTI_IRQn);

  58. }

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

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

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




<
回复

使用道具 举报

10

主题

1371

回帖

26

蝴蝶豆

论坛元老

最后登录
2020-12-1
发表于 2016-5-11 23:23:23 | 显示全部楼层
必须顶,啥时候上个定时器消抖扫描
回复 支持 反对

使用道具 举报

0

主题

3

回帖

0

蝴蝶豆

新手上路

最后登录
2016-5-12
发表于 2016-5-11 23:53:09 来自手机 | 显示全部楼层
新手!帮顶!
回复 支持 反对

使用道具 举报

122

主题

129

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-5-28
 楼主| 发表于 2016-5-12 08:55:37 | 显示全部楼层
黑夜之狼 发表于 2016-5-11 23:23
必须顶,啥时候上个定时器消抖扫描

做开发板综合例程时就会用状态机按键扫描
回复 支持 反对

使用道具 举报

10

主题

1371

回帖

26

蝴蝶豆

论坛元老

最后登录
2020-12-1
发表于 2016-5-12 09:12:29 | 显示全部楼层
haohao663 发表于 2016-5-12 08:55
做开发板综合例程时就会用状态机按键扫描

期待ing                          
回复 支持 反对

使用道具 举报

0

主题

153

回帖

0

蝴蝶豆

中级会员

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

使用道具 举报

122

主题

129

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-5-28
 楼主| 发表于 2017-6-30 08:55:35 | 显示全部楼层
更新资料下载:链接:https://pan.baidu.com/s/1nvtZhVV 密码:416v
回复 支持 反对

使用道具 举报

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