2-STM32GPIO输入之按键

本章讲述GPIO输入的应用,使用独立按键来进举例验证。GPIO请查看5 - STM32GPIO详解(看这篇就够了)

本章所用到的库函数:

GPIO_Init、GPIO_WriteBit、
GPIO_ReadOutputDataBit,
GPIO_ReadInputDataBit。

1-硬件设计

1.1 按键消斗

对于普通的按键来说,因为是机械是的原因,在按下弹出时会有一定的波动(触点接触导通需要一点时间),因此在这方面需要进行消除抖动,消除的方式有两种:一种是硬件消斗(主要是RS触发器、电容滤波这两种),一种是软件消斗(加延时最长不要超过10ms,最佳在5-10ms,当然这种延时和按键有关系,主要看机械特性。有的按键需要100ms才可以消除抖动,但对于大部分来说5-10ms就可以)
如下图按键抖动原理:

这里介绍一下这几种方式:

1.1.1 RS触发器

利用RS触发器来吸收按键的抖动。一旦有键按下,触发器立即翻转,触电的抖动便不会再对输出产生影响,按键释放时也一样。RS触发电路消抖电路图如下。
RS触发器(图片来源于网络)

1.1.2 电容滤波

将电容并联在按键的两端,利用电容的放电的延时特性。将产生抖动的电平通过电容吸收掉。从而达到消抖的作用,电容消抖电路图如下图所示。
电容滤波(图片来源于网络)
上面两种方式没有MCU时时做常用的,如果有MCU的话就可以使用延时进行消斗,但是,如果电路设计中有按键消斗了,就不在需要使用软件延时了。

2 按键电路设计

2.1 软件消斗

2.2 硬件消斗

2.3 检测原理

根据电路设计,当按键未按下时,GPIO端口输入状态为低电平,按键两端没有导通;当按键按下时,按键导通,GPIO引脚端口输入高电平(把按键当做一根导线,当按键按下的时候,单片机引脚端口与正极连接,这时候GPIO端口就是连接的正极,同样,没有按键也是一样的道理)。所以检测按键是否按下只需要判断高低电平(以此设计为例**,高电平就是接通,低电平就是断开,如果你的按键是接地的和这相反**)。

2-软件设计

2.1 软件消斗

2.1.1原理

独立按键软件扫描方法,需要在程序运行过程中循环或定时检测按键连接的引脚,①在首次检测到按键有效电平时,②延时10ms(不同按键延时不同)后,③再检测一次引脚电平,如能再次检测到有效电平,则是一次有效按键动作,反之则认为是误操作。

软件消斗一般流程如下:
软件消斗一般流程

2.1.2 编程要点

(1)使能GPIO时钟。调用函数RCC_AHB1PeriphClockCmd()。
(2)初始化GPIO模式。调用函数GPIO_Init()。
(3)操作GPIO,读取引脚状态。调用函数GPIO_ReadInputDataBit();

2.1.3 步骤

1、使能相应片上外设的时钟(非常重要),设计到的文件有
头文件:stm32f4xx_rcc.h
源文件:stm32f4xx_rcc.c
使用的主要函数:
RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState)
RCC_AHB2PeriphClockCmd(uint32_t RCC_AHB2Periph, FunctionalState NewState)
RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)
RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)

2、设置对应于片上外设使用的GPIO工作模式。

3、如果使用复用功能,需要单独设置每一个GPIO引脚的复用功能。

4、在应用程序中读取引脚状态、控制引脚输出状态或使用复用功能完成特定功能

2.2 代码编写

2.2.1 主程序

int main(void)
{
	delay_init(); 	//初始化SysTick,用于延时	
	LED_Config();	//初始化LED灯的GPIO引脚
	Key_Config();	//初始化按键的GPIO引脚
	/*按键控制LED灯*/
	while (1)
	{	/*按键S扫描判别,高电平有效*/
		if(Key_Scan(GPIOC,GPIO_Pin_13,1) == KEY_ON)
		{
			LED_ON;		//点亮LED	
		}
		/*按键扫描判别,低电平有效*/
		if(Key_Scan(GPIOA,GPIO_Pin_13,0) == KEY_ON)
		{
			LED_OFF;		//熄灭LED	
		}
	}
}

2.2.2 按键初始化

void Key_GPIO_Config(void)
{
   GPIO_InitTypeDef GPIO_InitStructure;	
  /*开启按键GPIO口的时钟*/
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE)	
  /*选择按键的引脚*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  /*设置引脚为输入模式*/
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;   
  /*设置引脚不上拉也不下拉*/
  //引脚电平受到外部电压影响在这里浮空/上拉/下拉都可以的
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;	
  /*使用上面的结构体初始化按键*/
  GPIO_Init(GPIOC, &GPIO_InitStructure);  

2.2.2 按键扫描

初始化按键后,就可以通过检测对应引脚的电平来判断按键状态

#define KEY_OFF	    0
#define KEY_ON		1

uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin,uint8_t Key_Lvl)
{			
  /*检测是否有按键按下*/
  if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == Key_Lvl )//第一次检测电平
  {	 		
     delay_ms(10);  	//去抖动
     if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == Key_Lvl)//第二次检测电平
	return 	KEY_ON; 	//确认有效按键动作返回
     else
	return KEY_OFF;	//无有效按键动作返回
  }
  else
	return KEY_OFF; //无有效按键动作返回
}
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: STM32是一款广泛使用的微控制器,具有丰富的GPIO(通用输入输出)口,可用于检测高低电平的状态。 GPIO口有两种状态:输入和输出。 在输入模式下,GPIO口可以读取外部电平。 在输出模式下,GPIO口可以通过设置高或低电平来控制外部电路。要检测输入的高、低电平,需要先配置GPIO口为输入模式,然后读取该引脚的状态即可。 首先,需要在引脚模式设置寄存器(GPIOx_MODER)中将引脚模式设置为输入模式(00)。然后在GPIO输入数据寄存器(GPIOx_IDR)中读取引脚的状态。该寄存器的值将反映引脚的实际电平状态。 当读取该寄存器时,如果它返回的位(bit)是1,则表示高电平。如果它返回的位是0,则表示低电平。 例如,检测GPIOB的引脚2是低电平还是高电平的示例: 首先需要确保GPIOB口已启用,引脚2设置为输入模式 ``` RCC->AHBENR |= RCC_AHBENR_GPIOBEN; //启用GPIOB的时钟 GPIOB->MODER &= ~(0x3 << (2*2)); //将GPIOB2的模式设置为输入模式 ``` 接着,就可以读取GPIOB_IDR寄存器,以获取该引脚的状态: ``` if(GPIOB->IDR & GPIO_IDR_2) { //GPIOB2是高电平 } else { //GPIOB2是低电平 } ``` 这里使用位掩码(bitmask)GPIO_IDR_2来检测GPIOB2的状态。 在STM32中,要检测其他GPIO口的高低电平也可以按照上述步骤进行。但请注意,如果引脚被配置为输出模式,GPIO_IDR寄存器中读取的状态将不准确。只有在引脚设置为输入模式时,GPIO_IDR寄存器才会返回正确的值。 ### 回答2: STM32是一系列基于ARM架构微控制器的处理器。其中的GPIO(General Purpose Input Output)引脚是用于与外部电路进行连接或者控制操作的通用输入输出引脚。通过对GPIO进行高低电平检测,我们可以实现数字输入操作,同时也可以检测并处理外部设备信号。 在STM32GPIO模块中,我们可以通过几种不同的方式来检测高低电平,包括轮询,中断和DMA(Direct Memory Access)等。以下是对每种方式的详细讲解: 1. 轮询 轮询是最基本的方式,也是最为常用的方式。在轮询模式下,处理器通过检测某个GPIO引脚所在的寄存器状态来实现对外部设备的状态监控。这种方式的优点是代码简单、易于实现,但是需要不断地进行轮询,会占用一定的CPU资源。 2. 中断 中断模式下,当GPIO检测到被监控的GPIO引脚状态发生改变时,会产生一个中断请求,让CPU去处理这个请求。这种方式节省了CPU资源,也能够及时响应异步事件发生,但是中断会有一定的响应延迟,且对程序的把握和安排要求比较高。 3. DMA DMA模式下,我们通过DMA来监控GPIO引脚状态的变化,并将读取到的数据存储到指定的缓存区中。这种方式能够很好地解决数据传输的问题,具有很高的效率和稳定性,但是实现较为复杂。 总之,STM32GPIO模块提供了多种方便的方式进行高低电平的检测。我们可以根据实际需要选择适用的方式来实现所需的操作。在实际项目中,我们可以根据具体情况灵活应用这些方式,来实现高效、稳定、可靠的外部设备监控、数据处理、信号交互等应用。 ### 回答3: STM32是一种不同类型的嵌入式系统芯片,其包含了多个GPIO引脚以及具有丰富的外设,可用于实现各种嵌入式应用。可以通过按照编程规范并使用合适的GPIO寄存器和指令来检测STM32GPIO电平状态。 在最近几个硬件版本的STM32芯片处理器中,GPIO(Port)控制器的输入/输出和捕获引脚基本与软件GPIO而言相似。在STM32上使用GPIO以检测高低电平时,首先需要通过将PORT的相应位设置为输入模式来使用该引脚。这是通过对GPIO模式寄存器进行配置实现的。需要设置的寄存器名称可能会因芯片的型号而异,但通常都包括"Mode"、"Speed"和"PUPD"这三个参数。Mode参数设置为输入模式可启用该输入/输出引脚,详细配置方法请参考芯片的技术文档。 一旦输出引脚被设置为输入模式,可以使用GPIO访问寄存器来检测STM32芯片上输入引脚的状态。输入值可以使用GPIO输入数据寄存器来轮询,也可以使用GPIO输入数据寄存器中断来检测变化。轮询方式适用于需要读取输入状态的实时任务,而中断方法适用于需要响应输入变化的应用程序。 在轮询方法中,库函数中的GPIO_ReadInputDataBit可以用于读取GPIO引脚输入的实际状态。该函数将返回具有精度的1个TRUE / FALSE值,如果为真,则说明输入电平在ON状态,如果为假,则说明输入电平是OFF状态。通过调用GPIO_ReadInputDataBit以便轮询,可以很容易地在代码中检测输入电平,然后执行相应的操作。 以上就是 STM32 GPIO 检测高低电平的基本方法及应用场景。需要注意的是,在STM32板上操作引脚时请仔细阅读数据手册并使用正确的GPIO模式寄存器和指令,在电路连接时,请充分注意输入电压范围及其他特殊设置需求,以保证系统的安全运行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

南山府嵌入式

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

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

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

打赏作者

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

抵扣说明:

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

余额充值