STM32按键扫描/按键中断/外部中断

发布者:Tianran2021最新更新时间:2017-09-30 来源: eefocus关键字:STM32  按键扫描  按键中断  外部中断 手机看文章 扫描二维码
随时随地手机看文章

接触STM32有一段时间了,也算是简单入了门,但由于一些原因,今天才来写本应该是入门级的按键相关程序,分为扫描模式和中断模式


MCU:STM32F334C8

1.扫描模式

首先配置按键引脚为上拉输入模式,根据原理图按键接PA0,按键没有按下的时候引脚输入为低电平0,按键按下输入高电平1,松开又回到低电平0

然后在死循环中不断读取相应引脚的输入状态,并根据返回结果判断按键是否按下,做出相应处理

下面的代码完成的功能是:按键第一次按下,点亮灯,再按一次,熄灭,重复。


#include "Userkey.h"

u8 flag=0;

void key_GPIO_Config(void)
{
	GPIO_InitTypeDef      GPIO_InitStructure;

	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	

	GPIO_Init(GPIOA,&GPIO_InitStructure);
}

void key_scanmode(void)
{
	key_GPIO_Config();
	
	while(1)
		{
			if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0))
				{
					flag =~flag;
					
					if(flag)//第1?3?5,,次按下
						{
							GPIO_SetBits(GPIOB, GPIO_Pin_6);
						}
					else//第2?4?6,,,次按下
						{
							GPIO_ResetBits(GPIOB, GPIO_Pin_6);
						}
				}
		}

}




2.中断模式

第一步和上面相同,将接按键的引脚配置为上拉输入,然后配置相应中断,PA0对应外部中断0

功能:按键按下,点亮LED并向串口发送按键按下到PC,按键松开,关掉LED并发送按键松开

void key_interruptmode(void)
{
	EXTI_InitTypeDef EXTI_InitStructure;
	NVIC_InitTypeDef NVIC_InitStruct;
	
	key_GPIO_Config();

	NVIC_InitStruct.NVIC_IRQChannel =EXTI0_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	
	NVIC_Init(&NVIC_InitStruct);

	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);
	EXTI_ClearITPendingBit(EXTI_Line0);
	
	EXTI_InitStructure.EXTI_Line=EXTI_Line0;
	EXTI_InitStructure.EXTI_LineCmd =ENABLE;
	EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising_Falling;

	EXTI_Init(&EXTI_InitStructure);

}

void EXTI0_IRQHandler(void)
{
	if(EXTI_GetITStatus(EXTI_Line0))
		{
			if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0))//按键按下
				{
					GPIO_SetBits(GPIOB, GPIO_Pin_6);
					printf("按键按下\n");			//串口打印状态
				}
			else										//按键松开
				{
					GPIO_ResetBits(GPIOB, GPIO_Pin_6);
					printf("按键松开\n");
				}
			
		}
	
	EXTI_ClearITPendingBit(EXTI_Line0);
}

注:如果要实现和1一样的功能,将EXTI_Trigger改为上升沿或者下降沿,再改一下中断处理函数即可


关键字:STM32  按键扫描  按键中断  外部中断 引用地址:STM32按键扫描/按键中断/外部中断

上一篇:STM32高分辨率定时器(HRTIM)使用实例之PWM
下一篇:STM32F3的ADC使用DMA模式传输转换数据

推荐阅读最新更新时间:2024-03-16 15:39

stm32+sdio+文件系统 源码分析
一、概述 1、目的 在移植之前,先将源代码大概的阅读一遍,主要是了解文件系统的结构、各个函数的功能和接口、与移植相关的代码等等。 2、准备工作 在官方网站下载了0.07c版本的源代码,利用记事本进行阅读。 二、源代码的结构 1、源代码组成 源代码压缩包解压后,共两个文件夹,doc是说明,src里就是代码。src文件夹里共五个文件和一个文件夹。文件夹是option,还有00readme.txt、diskio.c、diskio.h、ff.c、ff.h、integer.h。对比网上的文章,版本已经不同了,已经没有所谓的tff.c和tff.h了,估计现在都采用条件编译解决这个问题了,当然文件更少,可能编译选项可能越复杂。 2、0
[单片机]
基于STM32单片机利用ST库函数设置Systick
Systick是STM32中特有的系统时钟SysTIck有两个功能:1.可以产生精确延时;2.可以提供给系统一个单独的时钟节拍。一般延时程序: DELAY(N) { for( i=0 ; i《=x ; i++ ) ; } 对于STM32系列的微处理器中,执行一条指令只需要几十ns,进行for循环时,要实现N毫秒延时,那么x的意义非常大,而且由于系统频率的宽广,很难计算出延时N毫秒的精确值,那么在一些高速电路中,是不允许的,容易出现问题,很难查找出来。尤其在液晶驱动中,延时要求非常精确。针对STM32的处理器中,需要重新设计一个方法实现该功能,来代替DELAY(N)延时; cortex-m3中包含了一个SysTI
[单片机]
STM32管脚复用的理解
STM32中定时器3为例。重点是Full remap和Partial remap的理解。 1.管脚功能图。 2.完全复用和部分复用说明。 3.相关配置说明,时钟说明AFIO和管脚复用FullRemap。
[单片机]
<font color='red'>STM32</font>管脚复用的理解
STM32的ADC获取电池电压
adc.c #include adc.h void Adc_Init(void) { ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE ); //使能ADC1通道时钟 RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M //PA4 作为模拟通道输入引脚
[单片机]
STM32大行当道,Microchip却集中发布60余款8位MCU
为满足对 8 位微控制器 (MCU) 的需求,Microchip 一下子推出了 5 个新系列、超过 60 款器件,涵盖PIC 和 AVR。 嵌入式设计正成为电子产品越来越流行和重要的元素。就目前而言,您可以在市场上的绝大多数电子和消费设备中找到 MCU。 支持种类繁多的嵌入式设备需要一个多功能的市场,提供满足大多数应用需求的产品。为了满足这一需求,Microchip 最近发布了五个全新的 8 位 PIC 和 AVR MCU 系列,总计超过 60 款器件。 在本文中,我们将介绍 8 位 MCU,它们为何如此重要,以及 Microchip 的五个新系列带来了什么。 单片机位宽 由于 MCU 可用于许多不同的应用,因
[单片机]
<font color='red'>STM32</font>大行当道,Microchip却集中发布60余款8位MCU
串行通信 软件仿真STM32与74LS164通信
1、串行通信 2、常见的4种串行通信标准 3、对74LS164芯片的介绍 74LS164:串行转并行芯片,内部是1个8位的移位寄存器组成,由8个D触发器组成 缺点是:不带锁存寄存器,移位寄存器移位的过程会表现在164的输出引脚上,容易产生输出干扰。 4、用KEIL4进行软件仿真时,按正常步骤建立工程,然后在下图位置按照下图设置即可。 5、软件仿真:STM32与74LS164进行通信的程序如下: /**************************************************************************************************
[单片机]
串行通信 软件仿真<font color='red'>STM32</font>与74LS164通信
详解STM32的PWM输出及频率和脉宽(占空比)的计算
一、stm32的pwm输出引脚是使用的IO口的复用功能。 二、T2~T5这4个通用定时器均可输出4路PWM——CH1~CH4。 三、我们以tim3的CH1路pwm输出为例来进行图文讲解(其它类似),并在最后给出tim3的ch1和ch2两路pwm输出的c代码(已在STM32F103RBT6上测试成功,大家放心使用!)。 四、给出了PWM频率和占空比的计算公式。 步骤如下: 1、使能TIM3时钟 RCC- APB1ENR |= 1 1; 2、配置对应引脚(PA6)的复用输出功能 GPIOA- CRL &= 0XF0FFFFFF;//PA6清0 GPIOA- CRL |= 0X0B000000;//复用功能输出(推挽50MHz
[单片机]
详解<font color='red'>STM32</font>的PWM输出及频率和脉宽(占空比)的计算
使用VSCode搭建STM32开发环境
首先附上一张VS Code图一直都喜欢这种,黑色主题感觉高大上。 一、需要的软件和工具。 下载最新版VS Code: 安装好插件,具有良好的代码补全与调试功能。 “VS Code下载地址:https://code.visualstudio.com/” 下载 LLVM:用于代码补全,其实可以理解为 Clang。因为VS Code 中“C/C++”插件的自动补全功能不太好用。STM32中好多库函数都补全不出来。记得按照好之后,将路径添加到环境变量里。 “LLVM下载地址:http://releases.llvm.org/download.html” 下载安装 Git for Windows: 提供Git支持和MINGW64指令终端
[单片机]
使用VSCode搭建<font color='red'>STM32</font>开发环境
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved