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

【经验分享】STM32G4之按键实验

[复制链接]
STMCU小助手 发布时间:2022-7-6 14:41
一、按键原理
按键电路原理图(CT117E-M4产品手册)
IY3%$NND62HF$%W1}CG6`WF.png

这四个按键一端都接了VDD,所以默认高电平,当我们按下按键时,电路闭合,IO口电平从高电平到低电平,检测IO口电平的变化就是判断按键是否按下的依据。

由于按键默认上电为高电平,所以可以选择浮空输入模式,该模式只是默认输入值不能确定,但是这里是接的VDD,也就是默认输入值高电平。而上下拉输入模式,默认输入值是确定的。读取输入结果时,只有0或1两种,只是默认值不能确定

在单纯作为输入的时,浮空模式是有用的,在外部有上拉/下拉的条件下,可以设置为浮空输入。或者IO有冲突的时候,也可以设置为浮空输入,从而完全不干扰其他IO

对比一下正点原子F4按键实验模式选择:KEY0,1,2选择的是输入上拉,KEY_UP选择的输入下拉

Y4Z2P8(AUI1F8X)1C_5BK.png

KEY0、 KEY1 和 KEY2 是低电平有效的,而 KEY_UP 是高电平有效
的, 并且外部都没有上下拉电阻,所以,需要在 STM32F4 内部设置上下拉,STM32G4是可以看到外部接了上拉电阻的,所以程序里面没有设置上下拉模式

输入上拉:无论输入管脚悬空或者被高电平驱动时,读取的都是1. 只有在输入端为0的时,读取到的值才是0。

要判断KEY0,1,2的IO口电平,只有按键按下了,输入端为0 ,才能检测读取到低电平,所以这三个引脚选择输入上拉模式

输入下拉:无论输入管脚悬空或者被低电平驱动时,读取的都是0. 只有在输入端为1的时,读取到的值才是1。

要判断KEY_UP的IO口电平,只有按键按下了,输入端为1,才能检测读取到高电平,所以这这个引脚选择输入下拉模式

GPIO模式详细介绍:GPIO模式

二、程序编写
按键GPIO设置为浮空输入,使用STM32CubeMX配置

D(N1_@FJ1KPTBMPZG7(1_7R.png

将里面按键IO的初始化移植到LED的工程下。

1.按键扫描函数
  1. unsigned char Key_Scan(void)
  2. {
  3.         unsigned char unKey_Val = 0;
  4.         
  5.         if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_RESET)
  6.                 unKey_Val = 1;

  7.         if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == GPIO_PIN_RESET)
  8.                 unKey_Val = 2;

  9.         if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == GPIO_PIN_RESET)
  10.                 unKey_Val = 3;
  11.         
  12.         if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)
  13.                 unKey_Val = 4;        
  14.         
  15.         return unKey_Val;
  16. }
复制代码

2.按键处理函数

  1. __IO uint32_t uwTick_Set_Point = 0;

  2. unsigned char ucKey_Val,ucKey_Down,ucKey_Up,ucKey_Old;
  3. void Key_Proc(void)
  4. {
  5.         // uwTick每隔1ms加1  刚开始肯定差值大于100ms
  6.         if((uwTick -uwTick_Set_Point) < 100) return; // 每隔100ms扫描一次        
  7.         uwTick_Set_Point = uwTick;  // 记录每次扫描时的uwTick值
  8.         
  9.         ucKey_Val = Key_Scan();
  10.         ucKey_Down = ucKey_Val & (ucKey_Old ^ ucKey_Val);
  11.         ucKey_Up = ~ucKey_Val & (ucKey_Old ^ ucKey_Val);
  12.         ucKey_Old = ucKey_Val;
  13.         
  14.         if(ucKey_Down == 4)
  15.         {
  16.                 LED_Display(0x88);
  17.         }
  18.         if(ucKey_Down == 1)
  19.         {
  20.                 LED_Display(0x00);
  21.         }
  22. }
复制代码
  1. &(按位与): 两个操作数都为1 ,才为1  1&0 = 0 0&1 = 0 1&1 = 1
  2. |(按位或):两个操作数只要有一个为1 ,结果为1  1|0 = 1 1|1= 1  0|0 = 0
  3. ^(按位异或):两个操作数相同为0 ,不同才为1 0^0 = 1 1^0 = 0
  4. ~(取反):0变为1 ,1变为 0 ~0=1
复制代码

位运算参考:位运算

按键扫描可以分为三种情况:

  1. 情况1 : 100ms扫描了两次,按键返回的结果从0 变为4(按键4被按下了),产生了下降沿
  2. ucKey_Val = 4 (0000 0100)
  3. ucKey_Down = 0000 0100 & (0000 0000 ^ 0000 0100) = 0000 0100 & 0000 0100 = 0000 0100 =4
  4. ucKey_Up = ~0000 0100 & (0000 0000 ^ 0000 0100) = 1111 1011 & 0000 0100 = 0
  5. ucKey_Old = 4

  6. 情况2 : B4产生了下降沿后,按键一直按着
  7. ucKey_Val = 4
  8. ucKey_Down = 0000 0100 & (0000 0100 ^ 0000 0100) = 0000 0100 & 0000 = 0
  9. ucKey_Up = 1111 1011 & 0000 0000 =0
  10. ucKey_Old = 0000 0100 = 4

  11. 情况3 : B4按键一直按下后在松手时产生上升沿这个时候
  12. ucKey_Val = 0
  13. ucKey_Down = 0000 0000 & (0000 0100 ^ 0000 0000) = 0000 0000 & 0000 01000 = 0
  14. ucKey_Up = 1111 1111 & 0000 01000 = 0000 01000 = 4
  15. ucKey_Old = 0
复制代码




收藏 评论0 发布时间:2022-7-6 14:41

举报

0个回答

所属标签

相似分享

官网相关资源

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