5. Stm32f407 key查询方式示例

23 篇文章 1 订阅
21 篇文章 2 订阅

                         5. Stm32f407 key查询方式示例

 

硬件平台:  stm32f407ve

软件平台:  win10 (OS Name:                   Microsoft Windows 10 Enterprise

                                   OS Version:                10.0.18363 N/A Build 18363)

             Keil5  5.26.2

             HAL库版本: 2.14.0(目前下载的最新的)

时间:   2020-02-10

 

实验介绍:

     本次是使用hal库进行按键循环查询实验。(根据之前建立的模板操作,这里不再建立工程模板)

 

  1. 首先看原理图,按键的原理比较简单,按下去,电路短路,松开,电路开路。在下图中,我们看到与cpu的连接时PE10,11,12 3个引脚,松开按钮的时候,对于的引脚是高电平(上拉电阻)。按键按下去之后,对应得引脚为低电平。
  2. 这个时候,我们可以看到芯片引出的3个引脚的电平由按键控制,而不是由cpu控制(对比led的引脚的方式,led的引脚的状态是由cpu控制的)。这个时候,cpu是要获取这个引脚的状态,才能知道按键是否按下。这就是常说的输入模式(led的引脚应该配置为输出模式)。
  3. 按键的状态(按下或松开)是不确定的,是由外部的人为控制的,人可能随时想按一下就按一下,可能很长时间也不按。对cpu而言,cpu无法得知人什么时候会按下按键。所以cpu想知道按键是否被按下,就需要时时查询按键对应的引脚的状态(在程序中变现为循环查询)。这也就是我们这次使用的查询方法。在生活中类似于我有一个手机,这个手机没有铃声,没有震动,只能在来电的时候亮屏,为了不错过任何一个电话,我就要不断的盯着这个手机屏幕,这个过程就是一直在查询。(除了查询方式之外,还可以使用中断方式。)

 

 

4.那么我们对于按键的操作就比较简单了,首先初始化按键对应得引脚为输入模式,然后在循环中不断查询引脚的状态就可以了,如果获得的状态为低电平就是按键被按下了,如果是高电平,那么就是按键时松开的。

5.程序如下

 


#include <stm32f4xx.h>


void led_init(void)
{	
	GPIO_InitTypeDef GPIO_Init;

	//1.时钟使能
	__HAL_RCC_GPIOE_CLK_ENABLE();
	
	
	//2.端口设置
	GPIO_Init.Mode = GPIO_MODE_OUTPUT_OD;  //输出开漏模式
	GPIO_Init.Pin = GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
	GPIO_Init.Pull = GPIO_PULLUP;
	GPIO_Init.Speed = GPIO_SPEED_FREQ_LOW;
//	GPIO_Init.Alternate = ;  //GPIO的mode设置位复用功能的时候,才会配置复用功能
	HAL_GPIO_Init(GPIOE, &GPIO_Init);
	
	//3.点亮或熄灭灯
}


/*按键初始化*/
void key_init(void)
{	
	GPIO_InitTypeDef GPIO_Init;

	//1.时钟使能,按键使用的时GPIOE
	__HAL_RCC_GPIOE_CLK_ENABLE();
	
	
	//2.端口设置
	GPIO_Init.Mode = GPIO_MODE_INPUT;  //输入模式
	GPIO_Init.Pin = GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12;   //设置的引脚
	GPIO_Init.Pull = GPIO_NOPULL;      //上拉电阻可以有也可以没有,电路本身有上拉
//	GPIO_Init.Speed = GPIO_SPEED_FREQ_LOW;    //这个是设置输出速度,输入模式可以不管
//	GPIO_Init.Alternate = ;  //GPIO的mode设置位复用功能的时候,才会配置复用功能
	HAL_GPIO_Init(GPIOE, &GPIO_Init);
	
}



/*
	按键测试程序,我的例子实现为,(这是最简单的方法)
    第一个按键按下的时候,第一个灯点亮
	第二个按键按下的时候,第二个灯点亮
	第三个按键按下的时候,第三个灯点亮
*/

int main(void)
{
	int i;
	GPIO_PinState pins;
	
	
	HAL_Init();  //必须在第一个语句执行
	
	led_init();
	
	key_init();
	
	while(1)
	{
		//1.读取第一个按键的状态,根据按键的状态控制灯的状态
		pins = HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_10);
		if(pins == GPIO_PIN_RESET) //按键被按下了
		{
			HAL_GPIO_WritePin(GPIOE, GPIO_PIN_13, GPIO_PIN_RESET);
		}
		else
		{
			HAL_GPIO_WritePin(GPIOE, GPIO_PIN_13, GPIO_PIN_SET);
		}
		
		
		
		//2.读取第二个按键的状态,根据按键的状态控制灯的状态
		pins = HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_11);
		if(pins == GPIO_PIN_RESET) //按键被按下了
		{
			HAL_GPIO_WritePin(GPIOE, GPIO_PIN_14, GPIO_PIN_RESET);
		}
		else
		{
			HAL_GPIO_WritePin(GPIOE, GPIO_PIN_14, GPIO_PIN_SET);
		}
		
		
		//3.读取第三个按键的状态,根据按键的状态控制灯的状态
		pins = HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_12);
		if(pins == GPIO_PIN_RESET) //按键被按下了
		{
			HAL_GPIO_WritePin(GPIOE, GPIO_PIN_15, GPIO_PIN_RESET);
		}
		else
		{
			HAL_GPIO_WritePin(GPIOE, GPIO_PIN_15, GPIO_PIN_SET);
		}

	}
}


void SysTick_Handler(void)
{
	HAL_IncTick();
}

 

 

 

6.当然加上一些软件方法,可以实现按下一次点亮,再按下一次松开等操作。这个就作为练习了。

您好!对于STM32F407ZG,key_up是一个事件或信号的名称,可能与按键的释放动作相关。通常,我们可以通过编程来检测按键的状态变化并执行相应的操作。以下是一个示例代码片段,用于检测并处理key_up事件: ```c #include "stm32f4xx.h" #include "stm32f4_discovery.h" void EXTI0_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line0) != RESET) { // 处理key_up事件 // 在这里执行您想要的操作 EXTI_ClearITPendingBit(EXTI_Line0); } } int main() { // 初始化按键引脚 STM_EVAL_PBInit(BUTTON_USER, BUTTON_MODE_EXTI); // 配置外部中断 EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; // 使用PA0引脚作为按键输入 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0); EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); // 配置中断优先级 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); while (1) { // 主循环 // 在这里执行其他任务 } } ``` 请注意,以上代码是一个简单的示例,假设您已经正确配置了GPIO和外部中断。您可能需要根据您的具体硬件和需求进行适当的修改。 希望这可以帮助到您!如果您有任何其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大智兄

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

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

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

打赏作者

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

抵扣说明:

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

余额充值