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

【经验分享】STM32F103 按键实验(上)

[复制链接]
STMCU小助手 发布时间:2022-4-5 10:52
之前的点亮小灯实验用到了GPIO的输出模式,但是对于输入模式没有用到,这次小R给小伙伴们介绍GPIO的其中一种输入模式——上拉输入。按键出现在很多的应用场景,按键处理更是一门学问。因此,小R给小伙伴们介绍GPIO的上拉输入模式并简单应用于按键实验中,通过判断按键的状态来控制LED灯的亮灭情况。

首先,需要了解的是:当IO做输入使用时,通过调用函数GPIO_ReadInputDataBit()来读取IO口的电平状态。其次,按键是需要消抖滴。最后,既然是按键实验,就会有按键电路。按键电路如下:

X9YY56K)OD8C%LWK%(8BAT2.png

电路很简单,将按键接在I/O和GND两端,

I/O配置时设置成内部的上拉输入,

这样按下按键接通GND,输入低电平;

也可以将按键接在I/O和VCC两端,

I/O配置时设置成内部的下拉输入,

按下按键I/O接通VCC,输入高电平。

#设计时一般接GND#

设计思路:采用轮询方式扫描I/O口电平状态,若按键被按下,I/O口为低电平,则LED亮,否则LED不亮。

1. 新建两个文件,key.c 和 key.h



2. 在头文件 key.h 添加下面代码:

  1. #ifndef _KEY_H
  2. #define _KEY_H
  3. #include "stm32f10x.h"

  4. #define KEY0    GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12)

  5. void key_init(void);

  6. #endif;
复制代码

)DNZW7[}W5W4Z1O9`1DPOM0.png


3. 把 key.c 添加到工程中

$@HP@HSGJ0H`W3_N2DXH53M.png

4. 在 key.c 中添加以下代码:

  1. #include "key.h"

  2. void key_init(void)
  3. {
  4.     GPIO_InitTypeDef GPIO_InitStructure;                    //定义GPIO结构体

  5.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   //使能GPIOA时钟

  6.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;              //配置引脚
  7.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;           //上拉输入
  8.     GPIO_Init(GPIOA, &GPIO_InitStructure);                  //初始化GPIOA
  9. }
复制代码

F6LIJ[_E3N[UV%K${XWH{LC.png


5. 实现按键轮询控制LED灯亮灭

  1. #include "stm32f10x.h"
  2. #include "delay.h"
  3. #include "led.h"
  4. #include "tim.h"
  5. #include "key.h"

  6. int mian(void)
  7. {
  8.     delay_init();
  9.     led_init();
  10.     key_init();

  11.     while(1)
  12.     {
  13.         if(KEY0 == 0) {
  14.             delay_ms(20);    //按键消抖,时间一般为10-20ms
  15.             if(KEY0 == 0) LED_ON;
  16.         }
  17.         else LED_OFF;
  18.     }
  19. }

复制代码

%%7S52E@%4{FK~V8FBAO{_8.png


库函数相关代码:

  1. /**
  2.    * @brief  Reads the specified input port pin.
  3.    * @param  GPIOx: where x can be (A..G) to select the GPIO peripheral.
  4.    * @param  GPIO_Pin:  specifies the port bit to read.
  5.    *   This parameter can be GPIO_Pin_x where x can be (0..15).
  6.    * @retval The input port pin value.
  7.    */
  8. uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
  9. {
  10.     uint8_t bitstatus = 0x00;
  11.     /* Check the parameters */
  12.     assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  13.     assert_param(IS_GET_GPIO_PIN(GPIO_Pin));

  14.     if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)Bit_RESET)
  15.     {
  16.         bitstatus = (uint8_t)Bit_SET;
  17.     }
  18.     else
  19.     {
  20.         bitstatus = (uint8_t)Bit_RESET;
  21.     }
  22.     return bitstatus;
  23. }
复制代码


手机可以左右滑查看代码

stm32f10x_gpio.c中可以找到上述代码,实际上就是读取GPIOx_IDR寄存器。

小提示:如果身边没有按键面包板搭电路,可以使用一条杜邦线完成实验,杜邦线的一端接PA12,当另一端接GND时代表“按键”被按下。




收藏 评论0 发布时间:2022-4-5 10:52

举报

0个回答

所属标签

相似分享

官网相关资源

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