STM32—按键中断

这篇具有很好参考价值的文章主要介绍了STM32—按键中断。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

中断简介

程序

 注:


中断简介

(1)        EXTI(外部中断):EXTI是ST公司在其STM32产品上扩展的外中断控制。它负责管理映射到GPIO引脚上的外中断和片内几个集成外设的中断,以及软件中断。其输出最终被映射到NVIC的相应通道。因此,配置EXTI中断的过程必然包含对NVIC的配置。

(2)        NVIC(嵌套向量中断):嵌套向量中断控制器,属于内核外设, 管理着包括内核和片上所有外设的中断相关的 功能。嵌套向量中断控制器(NVIC)和处理器核的接口紧密相连,可以实现低延迟的中断处理和高效地 处理晚到的中断。

         至于两者的作用,我们就举个例子来说一下。

        例如下面配置EXTI0的过程,就要首先配置EXTI控制器(使能相应的中断线,选择中断/事件模式,触发边沿极性),然后再配置NVIC控制器(EXTI0映射在NVIC上的通道号,中断优先级,中断屏蔽状态)。也就是EXTI类比成小门,而NVIC是大门,二者是相互联通的,我们使用EXTI来选择中断的中断源,NVIC判决中断源的执行顺序

STM32—按键中断

 程序的编写就是按照这个流程来的,这里是有两条线路,一条事件中断,另一条为NVIC中断控制器,编写程序已NVIC中断为例!

程序

        为了大家更好的理解,我们就写一个按键中断来检验一下。

LED.c

#include "bsp_led.h"   

 /**
  * @brief  初始化控制LED的IO
  * @param  无
  * @retval 无
  */
void LED_GPIO_Config(void)
{		
	GPIO_InitTypeDef	GPIO_InitStruct;
	
	RCC_APB2PeriphClockCmd(LED_GPIO_CLK,ENABLE);
	
	
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP ;
	GPIO_InitStruct.GPIO_Pin=LED_RED_PIN|LED_GREEN_PIN|LED_YELLOW_PIN;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz ;

	GPIO_SetBits(LED_PORT,LED_RED_PIN|LED_GREEN_PIN|LED_YELLOW_PIN);
	GPIO_Init(LED_PORT,&GPIO_InitStruct);
	

}

LED.h

#ifndef __LED_H
#define	__LED_H

#include "stm32f10x.h"

//LED
#define LED_GPIO_CLK			RCC_APB2Periph_GPIOB

#define LED_GREEN_PIN			GPIO_Pin_0
#define LED_PORT				GPIOB

#define LED_RED_PIN				GPIO_Pin_5
#define LED_YELLOW_PIN			GPIO_Pin_1

#define		ON					1
#define 	OFF					0

#define	LED_GREEN(a)			if(a)\
									{GPIO_ResetBits(LED_PORT,LED_GREEN_PIN);}\
								else\
									{GPIO_SetBits(LED_PORT,LED_GREEN_PIN);}

#define	LED_RED(a)				if(a)\
									{GPIO_ResetBits(LED_PORT,LED_RED_PIN);}\
								else\
									{GPIO_SetBits(LED_PORT,LED_RED_PIN);}


#define	LED_YELLOW(a)			if(a)\
									{GPIO_ResetBits(LED_PORT,LED_YELLOW_PIN);}\
								else\
									{GPIO_SetBits(LED_PORT,LED_YELLOW_PIN);}
//打开灯									
#define	LED_G					{LED_GREEN(ON);LED_RED(OFF);LED_YELLOW(OFF);}					
#define	LED_R					{LED_GREEN(OFF);LED_RED(ON);LED_YELLOW(OFF);}
#define	LED_B					{LED_GREEN(OFF);LED_RED(OFF);LED_YELLOW(ON);}

#define LED_G_TOGGLE			{LED_PORT->ODR^=GPIO_Pin_0;}

//BEEPER
#define BEEP_GPIO_CLK			RCC_APB2Periph_GPIOA
#define BEEP_PIN				GPIO_Pin_8
#define BEEP_PORT				GPIOA


void LED_GPIO_Config(void);
void BEEP_Config(void);
#endif /* __LED_H */

KEY.h

#ifndef ___bsp_key____H
#define ___bsp_key____H

#include "stm32f10x.h"

//KEY1
#define KEY1_GPIO_CLK			RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO

#define KEY1_GPIO_PIN			GPIO_Pin_0
#define KEY1_PORT				GPIOA
#define	KEY1_IRQn				EXTI0_IRQn 
#define	KEY1_PortSource			GPIO_PortSourceGPIOA
#define KEY1_PinSource			GPIO_PinSource0
#define KEY1_IRQHandler			EXTI0_IRQHandler
#define	KEY1_Line				EXTI_Line0

//KEY2
#define KEY2_GPIO_CLK			RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO

#define KEY2_GPIO_PIN			GPIO_Pin_13
#define KEY2_PORT				GPIOC
#define	KEY2_IRQn				EXTI15_10_IRQn
#define	KEY2_PortSource			GPIO_PortSourceGPIOC
#define KEY2_PinSource			GPIO_PinSource13
#define KEY2_IRQHandler			EXTI15_10_IRQHandler
#define	KEY2_Line				EXTI_Line13


void KEY_Config(void);

#endif

KEY.c

#include "bsp_key.h"


static void NVIC_Config()
{
	NVIC_InitTypeDef	NVIC_Initstruct;
	
	//嵌套向量KEY1中断控制器

    //配置优先级组为1,级别越低,等级越高
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    //选择中断源——KEY1按键
	NVIC_Initstruct.NVIC_IRQChannel=KEY1_IRQn;
    //抢占优先级配置为1
	NVIC_Initstruct.NVIC_IRQChannelPreemptionPriority=1;
    //子优先级为1
	NVIC_Initstruct.NVIC_IRQChannelSubPriority=1;
    //使能中断通道
	NVIC_Initstruct.NVIC_IRQChannelCmd=ENABLE;
	
	NVIC_Init(&NVIC_Initstruct);

    //KEY2按键和上面的都一样
	NVIC_Initstruct.NVIC_IRQChannel=KEY2_IRQn;
	NVIC_Init(&NVIC_Initstruct);
}


void KEY_Config(void)
{		
	GPIO_InitTypeDef	GPIO_InitStruct;
	EXTI_InitTypeDef	EXTI_Initatruct;
	
	
	//KEY1/2时钟使能
	RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK,ENABLE);
	RCC_APB2PeriphClockCmd(KEY2_GPIO_CLK,ENABLE);
    
    // 初始化中断控制器   
	NVIC_Config();
    
    //按键属于输入,所以这里上拉输入
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING ;
	GPIO_InitStruct.GPIO_Pin=KEY1_GPIO_PIN;
	
    //EXTI信号源的选择
	GPIO_EXTILineConfig(KEY1_PortSource,KEY1_PinSource);
	EXTI_Initatruct.EXTI_Line=EXTI_Line0;
    //配置为中断模式
	EXTI_Initatruct.EXTI_Mode=EXTI_Mode_Interrupt;
    //上升沿检测,这里也可以是下降沿后上升下降沿
	EXTI_Initatruct.EXTI_Trigger=EXTI_Trigger_Rising;
    //使能中断
	EXTI_Initatruct.EXTI_LineCmd=ENABLE;
	EXTI_Init(&EXTI_Initatruct);  

	GPIO_Init(KEY1_PORT,&GPIO_InitStruct);
	
	//KEY2初始化
	RCC_APB2PeriphClockCmd(KEY2_GPIO_CLK,ENABLE);
	GPIO_InitStruct.GPIO_Pin=KEY2_GPIO_PIN;
	GPIO_Init(KEY2_PORT,&GPIO_InitStruct);
	
	GPIO_EXTILineConfig(KEY2_PortSource,KEY2_PinSource);
	EXTI_Initatruct.EXTI_Line=EXTI_Line13;
	EXTI_Initatruct.EXTI_Mode=EXTI_Mode_Interrupt;
	EXTI_Initatruct.EXTI_Trigger=EXTI_Trigger_Falling;
	EXTI_Initatruct.EXTI_LineCmd=ENABLE;
	EXTI_Init(&EXTI_Initatruct);
	
}



stm32f10x_it.c

void KEY1_IRQHandler(void)
{
	if(EXTI_GetITStatus(KEY1_Line)!=RESET)
	{
		LED_B;//这里是根据自己的要求实现不同的函数,这里以LED灯的亮灭为例
	}
	EXTI_ClearITPendingBit(KEY1_Line);  
}

void KEY2_IRQHandler(void)
{
	if(EXTI_GetITStatus(KEY2_Line)!=RESET)
	{
		LED_G_TOGGLE;
	}
	EXTI_ClearITPendingBit(KEY2_Line);  
}

 把这些放入程序里面就可以了,当然相应的头文件自己注意下,这里没有其他的头文件。

 注:

        中断函数里面的执行的函数依据自己的要求,这里以LED灯为例。文章来源地址https://www.toymoban.com/news/detail-402476.html

到了这里,关于STM32—按键中断的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (STM32)中断系统和外部中断

    中断系统:是执行和管理中断的逻辑结构 外部中断:是众多能产生中断的外设之一 中断:指的是中断源(中断通道),中断产生CPU暂停正在执行程序,去执行中断程序,然后返回。提高效率 F1系列的STM32有68个中断源,不同系列需要看手册 EXTI(外部中断)、TIM、ADC、USART、SPI、

    2024年02月06日
    浏览(28)
  • STM32—按键中断

    目录 中断简介 程序  注: (1)         EXTI(外部中断):EXTI是ST公司在其STM32产品上扩展的外中断控制。它负责管理映射到GPIO引脚上的外中断和片内几个集成外设的中断,以及软件中断。其输出最终被映射到NVIC的相应通道。因此,配置EXTI中断的过程 必然包含对NVIC的配置

    2023年04月08日
    浏览(23)
  • 外部中断实验(stm32)

    说明:以下内容参考正点原子资料 中断服务函数名称默认 参考前面的文章实验代码 参考前面的文章实验代码 参考前面的文章实验代码 GPIO 的管教 GPIOx.0~GPIOx.15(x=A,B,C,D,E,F,G)分别对应中断线 0~15,这样每个中 断线对应了最多 7 个 IO 口,以线 0 为例:它对应了 GPIOA.0、GPIOB.0、

    2024年02月13日
    浏览(29)
  • 【stm32----按键中断实验,按键控制LED灯】

    1、按下KEY1,LED1亮,再次按下KEY1,LED1灭; 2、按下KEY2,LED2亮,再次按下KEY2,LED2灭; 3、按下KEY3,LED3亮,再次按下KEY3,LED3灭; 一、头文件 1、gpio.h 2、key.h 二、初始化函数及功能函数 1、gpio.c 2、key.c 三、中断处理函数 do_irq.c 四、主函数 main.c 依次按下key3、key2、key1、key2

    2024年02月04日
    浏览(41)
  • STM32--EXTI外部中断

    前文回顾---STM32--GPIO 相关回顾--有关中断系统简介 目录 STM32中断 NVIC  EXTI外部中断 AFIO EXTI框图 旋转编码器简介 对射式红外传感器工程 代码: 旋转编码器工程 代码: 先说一下 基本原理 : 1. 中断请求发生 :外部事件(如按键触发,定时器溢出等)引起中断请求信号; 2. 中

    2024年02月12日
    浏览(32)
  • STM32 HAL库 STM32CubeMx -- 外部中断

    中断,是指处理机处理程序运行中出现的紧急事件的整个过程。程序运行过程中,系统外部、系统内部或者现行程序本身若出现紧急事件,处理机立即中止现行程序的运行,自动转入相应的处理程序(中断服务程序),待处理完后,再返回原来的程序运行,这整个过程称为程序

    2024年02月08日
    浏览(31)
  • 【STM32】STM32学习笔记-EXTI外部中断(11)

    中断 :在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行 中断优先级 :当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加

    2024年02月04日
    浏览(31)
  • STM32 外部中断 标准库函数

    中断对于单片机来说是必不可少的存在。例如使用一个按键打开一个灯的方法,就可以使用 中断 的方式实现,并且效果更好。 中断的概念比较容易理解,就相当于做饭的时候,你的主任务是炒菜,炒菜炒到一半,来了个电话你就需要优先去接电话,然后电话处理完后才会继

    2024年01月16日
    浏览(35)
  • STM32入门学习之外部中断

    1.STM32的IO口可以作为外部中断输入口。本文通过按键按下作为外部中断的输入,点亮LED灯。在STM32的19个外部中断中,0-15为外部IO口的中断输入口。STM32的引脚分别对应着0-15的外部中断线。比如,外部中断线0对应着GPIOA.0-GPIOG.0,以此类推就可以将所以的IO映射到0-15个外部中断

    2024年02月14日
    浏览(23)
  • STM32库函数开发外部中断

    目录 函数介绍:                STC32F10x_rcc: GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource) EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct) NVIC_PriorityGroupConfig(uint32_tNVIC_PriorityGroup) NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct) EXTI15_10_IRQHandler ITStatus EXTI_GetITStatus(uint32_t EXTI_Line) EXTI_ClearITPendingB

    2024年02月16日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包