蓝桥杯STM32自学记录_GPIO输入_按键

前言

笔记是人类的第二大脑,以前的我也总是在记录上所懈怠,遇到不会的就csdn cv 一顿操作,始终不得其内涵。从这个赛事开始,我来学习大佬在嵌入式上的理解,自己做好每次记录,辅助记忆的同时也能亲手过一次知识与项目。希望能在赛事上大放光彩

一、IO口常用函数

HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)——读电平状态
HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState)——写电平状态
HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)——转换电平状态HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)——锁电平状态

二、按键原理图

由原理图可知

浮空状态:高电平        按下状态:低电平

上拉模式意味着内部电阻将GPIO端口拉高到VCC,确保在没有外部信号时,端口状态为高;

下拉模式意味着内部电阻将GPIO端口拉低到GND,确保在没有外部信号时,端口状态为低。

按键代码逻辑是检测低电平(0),低电平有效,那我们就得设置默认高电平。

PB0——B1按键

PB1——B2按键

PB2——B3按键

PA0——B4按键

三、配置STM32Cubemx

注意事项:按键代码需要进行延时消抖

目标程序:B1按下LED1亮,B2按下LED1灭,B3按下LED2亮,B4按下LED2灭。

选芯片,配置时钟树,配置RCC,工程配置,魔术棒配置等在第一篇文章有讲解,我们直接从配置IO口开始。

配置引脚

吸取教训

1.本来想直接只设置LED1和LED2的,但是其他灯在浮空状态时是亮的,而我预想是默认熄灭,所以其他LED只能全部配置上拉。

2.忘记配置锁存器了!真的很容易忘记。

GENERATE CODE!

模块化设置(第一篇有讲解,不复述了)

四、代码编辑

key.c代码

#include "key.h"
#include "main.h"

int key(void)
{
	int num=0;//统一出口
	if(HAL_GPIO_ReadPin(GPIOB,B1_Pin)==RESET)//检测是否按下
	{
		HAL_Delay(5);//消抖
		if(HAL_GPIO_ReadPin(GPIOB,B1_Pin)==RESET)//再次检测
		{
			num=1;//检测到一号按键被按下
		}
		while(HAL_GPIO_ReadPin(GPIOB,B1_Pin)==RESET);//循环到按键释放才能进行下一步
	}
	
	if(HAL_GPIO_ReadPin(GPIOB,B2_Pin)==RESET)
	{
		HAL_Delay(5);
		if(HAL_GPIO_ReadPin(GPIOB,B2_Pin)==RESET)
		{
			num=2;
		}
		while(HAL_GPIO_ReadPin(GPIOB,B2_Pin)==RESET);
	}
	
	if(HAL_GPIO_ReadPin(GPIOB,B3_Pin)==RESET)
	{
		HAL_Delay(5);
		if(HAL_GPIO_ReadPin(GPIOB,B3_Pin)==RESET)
		{
			num=3;
		}
		while(HAL_GPIO_ReadPin(GPIOB,B3_Pin)==RESET);
	}
	
	if(HAL_GPIO_ReadPin(GPIOA,B4_Pin)==RESET)
	{
		HAL_Delay(5);
		if(HAL_GPIO_ReadPin(GPIOA,B4_Pin)==RESET)
		{
			num=4;
		}
		while(HAL_GPIO_ReadPin(GPIOA,B4_Pin)==RESET);
	}
	
	return num;
}

key.h代码

#ifndef __KEY_H
#define __KEY_H

#include "main.h"

int key(void);

#endif

main.c代码

#include "key.h"
#include "LED.h"

int num=keynum();
	  switch(num)
	  {
		 case 1:
			 LED(1,1);
			 break;
		 case 2:
			 LED(1,0);
			 break;
		 case 3:
			 LED(2,1);
			 break;
		 case 4:
			 LED(2,0);
			 break;		 
	   } 

至此,实验目的完成。


总结

更改配置后需要重新设置魔法棒和盒子;使用部分LED得把全部LED都设置成上拉;LED锁存器的配置。

引用[1]:上一节看完手册以后,你或许已经明白怎么配置一个GPIO接口让它实现输入输出的各种功能了。但是如果我问起你:如果要让GPIOA端口的P0和P1配置成推挽输出10MHz模式,你该怎么做,你会做些什么? 绝大多数人做的事情应该还是翻开手册里GPIO_CRL的寄存器定义,然后照着手册编程。GPIO外设的功能比较简单,需要配置的功能不算太多,这么做没什么难度。但有些外设的配置寄存器有许许多多控制位,比如下面这位: 这是串口通信外设的控制寄存器1(对没错,还有个控制寄存器2),里面的14个有效位都与通信的各种规则和状态密切相关,通过查手册一位一位地改显然有点不太经济且不甚直观。 标准固件库函数就是为这个而生的。ST官方将常用的对外设的操作和外设的各种状态封装成可读性更高的函数和结构供用户使用。我们就着GPIIO的库函数来看看,这玩意到底有什么魔力。 请从固件库文件夹里找出stm32f10x_gpio.h,stm32f10x_gpio.c和stm32f10x_rcc.h、stm32f10x_rcc.c四个文件,添加到寄存器编程的模板里。 并且在你的main里包含两个.h。打开这gpio的两个文件,里面虽然看着纷繁,但核心思路我们一讲便通。 固件库版的外设初始化 。 引用[2]:打开stm32f10x_gpio.h,用Ctrl F找到“GPIO_Exported_Functions”,其下便是所有的gpio库函数了。 GPIO_Init函数就是初始化外设使用的函数了。有一个形参类型“GPIO_InitTypeDef”我们没有见过,你可以在上边右键单击后选择“Go to Defnition”查看它的内容: typedef struct { uint16_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured. This parameter can be any value of @ref GPIO_pins_define */ GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins. This parameter can be a value of @ref GPIOSpeed_TypeDef */ GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins. This parameter can be a value of @ref GPIOMode_TypeDef */ }GPIO_InitTypeDef; 。 引用[3]:void Button_Config(void){ GPIO_InitTypeDef GPIO_InitStructure; /* Enable GPIOD clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); /* Configure PD.03, PD.04 as output push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD, &GPIO_InitStructure);} 。 问题:stm32f10x_gpio.h文件中有什么内容? 回答: 在stm32f10x_gpio.h文件中,我们可以找到"GPIO_Exported_Functions",其下是所有的GPIO库函数。其中,GPIO_Init函数是用于初始化外设的函数。在该文件中还定义了一个名为GPIO_InitTypeDef的结构体,该结构体包含了GPIO_Pin、GPIO_Speed和GPIO_Mode等参数,用于配置GPIO引脚的功能和模式。[2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值