STM32F407入门开发: GPIO口输入配置

举报
DS小龙哥 发表于 2022/02/27 12:42:11 2022/02/27
【摘要】 本章节介绍按键的初始化配置、手册如何查看、编写按键消抖函数、在主函数调用按键函数检测按键,完成按键控制LED灯。

第一章 F407建工程所需依赖文件

image.png

image.png

image.png

image.png

image.png

image.png

第二章 新建工程

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

第三章 分析 KEY 按键硬件原理图

image.png

image.png

image.png

第四章 编写 KEY 按键驱动代码

查看数据手册:

image.png

image.png

key.c文件代码如下:


#include "key.h"
/*
函数功能:按键初始化配置
硬件连接:
KEY0 --->PE4  按下为低电平
KEY1 --->PE3  按下为低电平
KEY2 --->PE2  按下为低电平
KEY_UP-->PA0  按下为高电平
*/
void KEY_Init(void)
{
	/*1. 开时钟*/
	RCC->AHB1ENR|=1<<0;//使能PORTA时钟
	RCC->AHB1ENR|=1<<4;//使能PORTE时钟

	/*2. 配置GPIO口模式*/
	GPIOE->MODER&=~(0x3<<2*2); //清除模式
	GPIOE->MODER|=0x0<<2*2;    //配置输入模式

	GPIOE->MODER&=~(0x3<<3*2); //清除模式
	GPIOE->MODER|=0x0<<3*2;    //配置输入模式

	GPIOE->MODER&=~(0x3<<4*2); //清除模式
	GPIOE->MODER|=0x0<<4*2;    //配置输入模式

	GPIOA->MODER&=~(0x3<<0*2); //清除模式
	GPIOA->MODER|=0x0<<0*2;    //配置输入模式
		
	/*3. 配置GPIO口上下拉模式*/
	GPIOE->PUPDR&=~(0x3<<2*2); //清除之前配置
	GPIOE->PUPDR|=0x1<<2*2;    //配置上拉

	GPIOE->PUPDR&=~(0x3<<3*2); //清除之前配置
	GPIOE->PUPDR|=0x1<<3*2;    //配置上拉

	GPIOE->PUPDR&=~(0x3<<4*2); //清除之前配置
	GPIOE->PUPDR|=0x1<<4*2;    //配置上拉

	GPIOA->PUPDR&=~(0x3<<0*2); //清除之前配置
	GPIOA->PUPDR|=0x2<<0*2;    //配置下拉
}


/*
函数功能:扫描按键
函数参数:扫描的模式。1表示连续检测、0只能检测单个按键
返 回 值:按下的按键值1、2、3、4
	  返回0表示按键没有按下
*/
u8 ScanKeyVal(u8 mode)
{
	static u8 stat=0; //保存按键按下的状态
	if(mode)stat=0;   //手动清除按键按下标志
	if((KEY_UP||KEY0==0||KEY1==0||KEY2==0)&&stat==0)
	{
		stat=1;      //标记按键已经按下了
		DelayMs(20); //延时消抖
		if(KEY_UP) return 4;
		if(KEY0==0)return 1;
		if(KEY1==0)return 2;
		if(KEY2==0)return 3;
	}
	else
	{
		 if(KEY_UP==0&&KEY0&&KEY1&&KEY2)stat=0; //清除按键按下标志
	}
	return 0;
}

key.h代码如下

#ifndef _KEY_H
#define _KEY_H
#include "stm32f4xx.h"
#include "delay.h"
void KEY_Init(void);
u8 ScanKeyVal(u8 mode);
#define KEY0  (!!(GPIOE->IDR&1<<4))
#define KEY1  (!!(GPIOE->IDR&1<<3))
#define KEY2  (!!(GPIOE->IDR&1<<2))
#define KEY_UP (!!(GPIOA->IDR&1<<0))
#endif

Main.c代码如下


#include "stm32f4xx.h" // Device header
#include "led.h"
#include "delay.h"
#include "key.h"

int main(void)
{
	u8 key,i;
	LED_Init();
	KEY_Init();
	while(1)
	{
		 key=ScanKeyVal(0);
		 if(key)
		 {
			i=!i;
			LED0(i);
			LED1(i);
			BEEP(i);
		 }
	}
}

第五章 编译代码 配置下载

image.png

image.png

image.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。