3139|0

3

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

【零基础学习STM32】第二讲:GPIO输入实验——读取按键状态 [复制链接]

本帖最后由 heart蓝色CD 于 2018-1-29 16:37 编辑

一、概述
1、按键简介
      按键是一种机械器件,按键两端分别对应某电路的两个断点,我们可以通过按键接通和断开控制该电路的电压等参数,我们利用按键做的应用通常有控制继电器、键盘、复位等。随着应用的扩展,按键已成为电路板上不可或缺的一部分。
如下图是常开按键:
2、按键类别简介
      按键主要有四种类型:常开带复位、常开不带复位、常闭带复位、常闭不带复位。(本次实验使用的是常开带复位按键)
按键主要有以下4种工作模式:
  • 常开带复位:初始默认状态是开路,当受力按下时按键使电路连通,受力结束后其自动返回开路状态。
  • 常开带不复位:初始默认状态是开路,每按下一次按键改变一次开闭状态。
  • 常闭带复位:初始默认状态是连通,当受力按下时按键使电路开路,受力结束后其自动返回连通状态。
  • 常闭不带复位:初始默认状态是连通,每按下一次按键改变一次开闭状态。
3、按键消抖
      使用手动按键的时候, 由于机械抖动可能造成按键的错误识别。一般手动按下按键然后释放, 按键两片金属膜接触的时间大约为50ms,按键松开到稳定的时间为5-10ms。因此,如果在首次检测到按键被按下后延时20ms 左右再次检测,即可确认是否真的有按键被按下,从而消除按键抖动造成的错误识别。本实验通过给于一定延时后再进行检测,从而有效的避免了按键抖动带来的误判。

二、硬件电路
在iCore3双核心开发板中,采用一个独立的按键与STM32F407的PH15相连,限流电阻为1K。

三、实验原理

按键的一端与STM32GPIOPH15)相连,另外一端接地,且PH15外接一个1K电流大小的上拉电阻。初始化时把PH15设置成输入模式,当按键弹起时,PH15由于上拉电阻的作用呈高电平(3.3V);当按键按下时,PH15直接被按键短接到GND,呈低电平。因此判断PH15的电平变化,可得到按键状态。

四、源代码
1、主函数
  1. /*
  2. * Name                : main
  3. * Description         : ---
  4. * Author              : ysloveivy.
  5. *
  6. * History
  7. * --------------------
  8. * Rev                 : 0.00
  9. * Date                : 11/21/2015
  10. *
  11. * create.
  12. * --------------------
  13. */
  14. int main(void)
  15. {
  16.         int i;
  17.         static int work_status = 0;                         //三色LED灯工作状态
  18.         static int key_status = 1;                          //按键松开标置
  19.         led.initialize();                                   //三色LED灯端口初始化
  20.         key.initialize();     
  21.         while(1){
  22.                 if(KEY_INPUT)key_status = 1;
  23.                 if(key_status == 1){
  24.                         if(!KEY_INPUT){
  25.                                 for(i = 0;i < 10000;i++);     //按键防抖动
  26.                                 if(!KEY_INPUT){
  27.                                         key_status = 0;
  28.                                         work_status += 1;
  29.                                         if(work_status > 2)work_status = 0;
  30.                                         //操作 LED
  31.                                         switch(work_status){
  32.                                                 case 0:
  33.                                                         LED_RED_ON;
  34.                                                         LED_GREEN_OFF;
  35.                                                         LED_BLUE_OFF;
  36.                                                         break;
  37.                                                 case 1:
  38.                                                         LED_RED_OFF;
  39.                                                         LED_GREEN_ON;
  40.                                                         LED_BLUE_OFF;
  41.                                                         break;
  42.                                                 case 2:
  43.                                                         LED_RED_OFF;
  44.                                                         LED_GREEN_OFF;
  45.                                                         LED_BLUE_ON;
  46.                                                         break;
  47.                                                 default:

  48.                                                         break;
  49.                                         }

  50.                                 }
  51.                         }
  52.                 }
  53.         }
  54. }
复制代码
2、GPIO初始化
LED的GPIO初始化配置方式与上一讲一致,以下是按键的GPIO初始化程序
  1. /*
  2. * Name                : initialize
  3. * Description         : ---
  4. * Author              : ysloveivy.
  5. *
  6. * History
  7. * --------------------
  8. * Rev                 : 0.00
  9. * Date                : 11/21/2015
  10. *
  11. * create.
  12. * --------------------
  13. */
  14. static int initialize(void)
  15. {
  16.         GPIO_InitTypeDef   GPIO_uInitStructure;

  17.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH,ENABLE);
  18.         //设置连接按键的IO端口
  19.         GPIO_uInitStructure.GPIO_Pin = GPIO_Pin_15;                           
  20.         //设置端口为输入模式
  21.         GPIO_uInitStructure.GPIO_Mode = GPIO_Mode_IN;                          
  22.         //设置速度为第三级
  23.         GPIO_uInitStructure.GPIO_Speed = GPIO_Speed_100MHz;                    
  24.         //设置输入端口不变化
  25.         GPIO_uInitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;                     
  26.         //把设置的参数用到结构体
  27.         GPIO_Init(GPIOH, &GPIO_uInitStructure);                                

  28.         return 0;
  29. }
复制代码
3、小知识
void RCC_AHB1PeriphClockCmd
(uint32_t RCC_AHB1Periph,FunctionalState NewState)
此函数为外设使能函数,第一个参数为需要被使能的外设,第二个参数为使能与否。可能很多读者看到这函数不知道如何入手,不知道参数填啥子好,别急,咱先查看一下他的定义:
查看定义方法:双击函数名选中,右击再点GO TODefinition of ...就可以查看咯。
RCC_AHB1PeriphClockCmd函数定义如下:
  1. void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState)
  2. {
  3.   /* Check the parameters */
  4.   assert_param(IS_RCC_AHB1_CLOCK_PERIPH(RCC_AHB1Periph));
  5.   assert_param(IS_FUNCTIONAL_STATE(NewState));
  6.   if (NewState != DISABLE)
  7.   {
  8.     RCC->AHB1ENR |= RCC_AHB1Periph;
  9.   }
  10.   else
  11.   {
  12.     RCC->AHB1ENR &= ~RCC_AHB1Periph;
  13.   }
  14. }
复制代码
注意被我标红的字符串,按照刚刚查定义的方法,它会告诉我们函数的参数可以填啥。如查看IS_FUNCTIONAL_STATE:
  1. #define IS_FUNCTIONAL_STATE(STATE)
  2. (((STATE) == DISABLE) || ((STATE) == ENABLE))
复制代码
我们可以看出第二个参数可填写DISABLE(使能)和ENABLE(不使能)。

小结:上面用外设的使能函数为大家介绍了查看函数的方法,此方法在实际应用经常可以用到,当我们在阅读、修改程序的时候,遇到哪些不太清楚的函数,就可以用这种方法查看。

五、实验现象
按键每按下一次,ARM·LED颜色变换(红色、绿色、蓝色轮流交换)一次。

六、代码包下载
复制网址到浏览器可下载pan.baidu.com/s/1sjrHnM9
此内容由EEWORLD论坛网友heart蓝色CD原创,如需转载或用于商业用途需征得作者同意并注明出处

此帖出自stm32/stm8论坛
点赞 关注
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表