STM32(12)-- GPIO输入,按键检测

1. 硬件原理图

通过GPIO读取按键状态实现LED灯的亮灭切换,当按键按下后,引脚会读到高电平;未按下时,引脚读到低电平。需配置PA0和PC13。

2. 软件设计

2.1 新增驱动文件

新增按键驱动的头文件和源文件

2.2 驱动文件的实现

在驱动文件中肯定会用到GPIOA、GPIOB等宏定义,所以需要包含"stm32f4xx.h"文件,这个文件中包含寄存器映射等定义

外设的初始化配置

1. 开GPIO的时钟

2. 定义一个GPIO的初始化结构体

3. 配置GPIO初始化结构体成员

4. 调用GPIO初始化函数,把配置好的结构体成员的参数写入寄存器

2.2.1 开启时钟

cpp 复制代码
//1.开启时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);

//可以用或操作同时打开多个外设的时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOA,ENABLE);

2.2.2 定义初始化结构体

cpp 复制代码
//2.定义初始化结构体
	GPIO_InitTypeDef GPIO_InitStruct;

2.2.3 配置初始化结构体成员

GPIO需配置成输入模式,无上下拉的模式

cpp 复制代码
//3.配置结构体成员
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
	//GPIO_InitStruct.GPIO_OType ,输出模式不用配置
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_InitStruct.GPIO_Speed = GPIO_Fast_Speed;

2.2.4 调用GPIO初始化函数

cpp 复制代码
//4.调用初始化函数
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	
	//继续赋值,可继续初始化别的引脚
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
	//GPIO_InitStruct.GPIO_OType ,输出模式不用配置
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_InitStruct.GPIO_Speed = GPIO_Fast_Speed;
	GPIO_Init(GPIOC,&GPIO_InitStruct);

定义一个初始化结构体,赋值并调用Init函数完成赋值后,可继续给这个结构体赋值,然后对别的引脚初始化

2.2.5 按键检测函数

cpp 复制代码
uint_8 Key_Scan(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
	if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==1)
	{
		while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==1);//按下后,松开返回1
		return 1;
	}
	else
		return 0;
}

2.3 头文件包含的知识

这两个头文件的位置如上所示

main.c包含的两个头文件路径的写法不同,一个是绝对路径一个是相对路径。

若使用相对路径,需在此处添加头文件路径,就是头文件所在的文件夹

这里的 .\ 表示的是 "工程文件所在的目录" ------也就是你 .uvprojx(或旧版 .uvproj)所在的那个文件夹,通常也就是你说的"Keil 工程目录"

./ 就是表示"当前工程(当前目录)",更准确一点说是:

当前源文件所在的目录(编译器处理该 .c 文件时的相对路径基准)

.. 表示"上一级目录
一、相对路径包含

以当前源文件为参照

cpp 复制代码
#include "include/myheader.h"
#include "../common/utils.h"

特点:

  • 路径相对于当前 .c 文件所在目录

  • 常用于项目内部头文件

  • 可读性强,但目录层级深时不太优雅


二、绝对路径包含

从根目录开始写完整路径

cpp 复制代码
#include "/usr/include/stdio.h"
#include "D:/project/include/config.h"

特点:

  • 路径唯一、明确

  • 可移植性差(换机器、系统就容易炸)

  • 实际项目中不推荐

2.4 主函数的实现

cpp 复制代码
#include "stm32f4xx.h"
#include "led.h"
#include "./key.h"

void delay(uint32_t count);
int main(void)
{
	LED_Config();
	Key_Config();
	
	while(1)
	{
		if(Key_Scan(GPIOA,GPIO_Pin_0))
		{
			GPIO_ToggleBits(GPIOF,GPIO_Pin_6);
		}
	}
}


void delay(uint32_t count)//软件延时
{
	for(;count>0;count--);
	
}
相关推荐
LCG元7 小时前
STM32MP1边缘网关:Linux系统下Modbus转MQTT协议转换实战
linux·stm32·嵌入式硬件
Max_uuc10 小时前
【硬件心法】打破软硬边界:从原理图剖析探秘“微安级”精密电流采样的底层架构
单片机·嵌入式硬件
2501_9181269113 小时前
stm32核心板是什么属性?
linux·c语言·stm32·嵌入式硬件·个人开发
古译汉书13 小时前
RTOS:ISR与互斥量的关系
运维·服务器·stm32·嵌入式硬件
国科安芯19 小时前
实战验证:ASM1042S2S CANFD收发器的质子单粒子效应试验与在轨性能
网络·人工智能·单片机·嵌入式硬件·物联网·fpga开发
Zevalin爱灰灰19 小时前
基于STM32实现OTA&BootLoader 第二章——外设功能开发
stm32·单片机·物联网·嵌入式
2501_9181269119 小时前
stm32能刷什么程序?
linux·stm32·单片机·嵌入式硬件·学习
国科安芯19 小时前
ASP4644S电源芯片引脚功能与参考设计输出电压计算方法
网络·单片机·嵌入式硬件·fpga开发·性能优化
国科安芯20 小时前
抗辐照MCU芯片在核工业水下探测耐辐照数字摄像机中的应用研究
网络·单片机·嵌入式硬件
VALENIAN瓦伦尼安教学设备20 小时前
品牌故事:1964年塞纳河畔ASHOOTER激光对中仪诞生的夜晚
数据库·人工智能·嵌入式硬件