详细了解stm32---按键

提示:永远支持知识文档免费开源,喜欢的朋友们,点个关注吧!蟹蟹!

目录

一、了解按键

二、stm32f103按键分析

三、按键应用


一、了解按键

         同学们,又见面了o(* ̄▽ ̄*)ブ,最近降温了,注意保暖哦!这次我们来了解stm32中的按键操作 ,首先我们需要了解什么是按键,以及按键的基本结构,如下图就是我们按键的基本结构:

按键是什么呢?说专业一点,按键就是一种电子开关使用时轻轻按开关按钮就可以使开关接通,当松开手的时候,开关断开。说白了按键就是用来实现一个电路的通路以及断开操作的开关。

看完上图之后我们该如何给按键接线呢?假设我们一定要接1引脚,但是接1,2呢?、还是接1,3呢?假设我们接的是1,3,此时电路是不是一直是通路,当我们按下按键和不按下按键是不是都是同一个结果,因为1,3相连引脚初始是导通的,那我们还能实现按键操作吗?不能吧,所以我们应该接1,2引脚吧,同样的我们也可以接1,4引脚对吧,等等。

通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,电压信号如图:

在图中我们可以看出,理想的按键电压信号波形图是空闲状态维持一种电平(低电平或者是高电平,具体需要我们自己根据电路图配置),当我们 按下按键的时候,电压信号波形产生一个跳变吧,当我们松开按键的时候电压又跳变回原来的状态,有了这种跳变,我们是不是就可以根据电压的这一特性来实现控制某一个灯的开关啦,或者某一外设的开关?

但实际情况却有些差强人意,因为当我们按下按键的时候,按键会产生一个机械抖动,这个抖动会影响我们对电压信号波形的判断,就比如我们不小心碰了一下按键,灯就开了,这样过于灵敏是不是不太好呀?那我们该如何去解决这个问题呢?可以用延时吧?就是那个systick,延时10ms或者20ms,当经过10ms之后如果电平还是维持在一个低电平或者高电平我们是不是就可以判断按键按下了,这样就可以解决误触这个问题了,当然这不是最优解决方法,更优解决方法我们可以通过外部中断去实现。

 ok,知道这些之后我们接下来可以通过按键来实现stm32上的一个灯的控制了,我们先来分析按键的原理图

二、stm32f103按键分析

我们怎么去看这个图呢?看网络标号吧,看网络标号对应哪个引脚吧,比如这个WK_UP这个网络标号就连接在如下图:

WK_UP对应的引脚是PA0吧,这个按键我们可以用来当作一个普通的按键来用,当然也可以用来当作唤醒,外部中断的一个唤醒按键,那什么时候需要唤醒呢?就是当我们的这个芯片进入到一个睡眠模式,或者是待机模式,或者什么什么模式,反正就是低功耗的模式里面其中一种,我们可以通过这个按键来唤醒我们这个系统。

我们先来分析一下,我们这个按键按下之后识别到什么电平:

我们拿WK_UP(PA0)引脚来举例,当我们按下按键之后,我们在引脚可以识别到一个高电平吧?为什么?因为我们这个按键外部接了一个3.3V的上拉电阻,当我们按下按键之后我们就可以读到一个高电平。再问大家一个问题,我们WK_UP(PA0)引脚该配置成输入还是输出模式呢?我们站在芯片的角度考虑,我们是需要去读取WK_UP(PA0)引脚的输出电平对吧,所以我们是需要将WK_UP(PA0)配置成输入模式。我们通过读取它的电平变化来判断按键是否按下。那么就需要WK_UP(PA0)引脚有一个电平的变化,这样我们才能通过这个电平的变化来判断按键是否按下。好,那么,当我们按键有按下的时候WK_UP(PA0)引脚处于高电平,而我们又需要这个引脚有一个电平跳变,故我们应该给这个引脚配置成下拉输入模式吧,这样,当WK_UP(PA0)引脚处于空闲状态时就处于低电平,当我们按下按键的时候电平跳变成高电平,所以我们就可以通过这个电平变化来判断按键是否按下。

三、按键应用

ok,我们现在可以来尝试着写一下代码,我们板子上有三个按键,我们尝试着用WK_UP(PA0)来点亮灯,用PC8来熄灭灯,用PC9来使灯闪烁。

代码如下:

首先我们要知道一个函数(以下的函数在固件库中可以查询到):

其中有两个 函数我们需要注意:

GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin);

GPIO_ReadInputData(GPIO_TypeDef* GPIOx)

其中:

第一个函数有两个参数,第一个是选择要读取的GPIO,第二个参数是选择要读取的GPIO对应的引脚

第二个函数就只有一个参数,也就是说第二个函数使用来读取一组GPIO引脚的

我们用按键点灯需要的是一个引脚吧,不需要读取一组GPIO吧,所以我们选择第一个函数进行GPIO的输入读取。

好,知道这些之后我们就可以正式开始写代码了:

代码如下:

key.c文件:

#include "key.h"
u8 key_flag;
void Key_Init(void)
{
	GPIO_InitTypeDef  GPIO_InitStruct;
	/*打开时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);
	/*配置GPIO*/
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;/*下拉输入*/
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
	GPIO_Init(GPIOA, &GPIO_InitStruct);

	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;/*上拉输入*/
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
	GPIO_Init(GPIOC, &GPIO_InitStruct);
}


void Read_Key(void)
{
	/***以下的代码还有很多可以修改的地方,比如说可以用位带操作简化GPIO读取操作,还可以用外部中断来处理延时产生的问题等等***/
	if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == SET)
	{
		/*消除抖动*/
		delay_ms(20);
		if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == SET)
		{
			key_flag = 1; 
		}
		if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_8) == RESET)
		{
			key_flag =  2;
		}
		if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_9) == RESET)
		{
			key_flag = 3;
		}
	}
}

main.c文件:

#include "systick.h"
#include "usart_drv.h"
#include "key.h"
#include "led.h"
extern u8 key_flag;
void HardWare_Init(void)
{
	SysTick_Init(72);
	Usart_MyConfig(115200);//这个串口可以用来调试代码用
	Key_Init();
}

int main(void)
{

	HardWare_Init();
	while(1)
	{
		Read_Key();
		switch (key_flag)
			{
				case 1:
					LED_Ctrl(LED_0, LED_ON);
					break;
				case 2:
					LED_Ctrl(LED_0, LED_OFF);
					break;
				case 3:
					delay_ms(200);
					LED_Ctrl(LED_0, LED_ON);
					delay_ms(200);
					LED_Ctrl(LED_0, LED_OFF);
					break;
			}
	}
}

  • 35
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: STM32-F103指南者是一款功能强大的STM32系列微控制器开发板,具有丰富的外设接口和强大的计算能力,可以广泛应用于物联网、工业控制、智能家居等领域。下面是使用STM32-F103指南者的几个关键步骤和技巧: 1. 硬件连接:首先,将STM32-F103指南者与计算机通过USB线连接,并将开发板上的BOOT0脚连接到3.3V电源,用于进入固件烧录模式。此外,根据具体需求连接外设,如按键、LED灯、串口设备等。 2. 环境搭建:在开始开发之前,需要安装所需的开发环境。可以选择使用Keil MDK作为集成开发环境,或者使用CubeMX结合Keil或者IAR等进行开发。此外,还需要安装对应的驱动程序和STM32的开发工具包。 3. 编写代码:使用C语言或汇编语言编写嵌入式程序,可使用Keil或者其他编辑器进行编写。对于初学者,推荐先从简单的LED闪烁等例程开始,逐步学习掌握STM32-F103的各种外设的使用方法和相关驱动库。 4. 烧录程序:编写好的程序需要通过烧录工具将其烧录到STM32-F103指南者中。可以使用ST-Link、J-Link等烧录工具,将生成的二进制文件烧录到开发板的Flash中。 5. 调试和测试:在程序烧录完成后,可以通过串口调试助手等工具进行调试和测试。通过输出调试信息或读取外设状态,检验程序运行是否符合预期。 总之,零死角玩转STM32-F103指南者需要熟练掌握STM32-F103系列微控制器的技术特性和外设接口的使用方法,以及具备相应的嵌入式开发能力。通过不断学习、实践和探索,能够更加灵活和高效地开发基于STM32-F103开发板的应用程序。 ### 回答2: 零死角玩转stm32-f103指南者 stm32-f103指南者是一款非常强大的微控制器开发板,可以实现多种功能和项目。要想充分发挥stm32-f103指南者的能力,需要掌握一些基本的知识和技巧。 首先,我们需要了解stm32-f103指南者的基本硬件和软件结构。它采用了stm32f103芯片,拥有许多的GPIO引脚、模拟输入输出、串口、定时器等功能。了解这些硬件资源的分布和功能,可以帮助我们更好地设计和编程。 其次,我们需要学习并掌握相应的开发工具和语言。stm32-f103指南者支持多种开发环境,比如Keil、IAR等。我们可以选择适合自己的开发工具,并熟悉其使用方法。同时,C语言是stm32-f103指南者的主要开发语言,我们需要学习C语言的基本语法和stm32-f103指南者的相关函数库。 接下来,我们可以尝试一些简单的实践项目,比如LED闪烁、按键检测、PWM控制等。通过这些实践项目,我们可以进一步理解stm32-f103指南者的工作原理和编程方法。 在实际项目中,我们可以结合其他模块和传感器进行更复杂的应用。比如可以连接LCD屏幕显示数据、连接WiFi模块实现远程控制、连接传感器实现环境监测等。这些应用可以帮助我们更好地了解stm32-f103指南者的多功能性。 最后,要想玩转stm32-f103指南者,我们还需要不断学习和尝试。可以参考相关的教程和文档,参与技术交流社区,与其他开发者分享经验。只有持续学习和实践,我们才能在stm32-f103指南者的世界中修炼出一双炉火纯青的技能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钜锋王老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值