关于STM32F中按键中断分析

发布者:bobojrt最新更新时间:2021-06-21 来源: eefocus关键字:执行时间  STM32F中  按键中断 手机看文章 扫描二维码
随时随地手机看文章

  在按键学习中,我们有用到查询的方法来判断按键事件是否发生,这种查询按键事件适用于程序工作量较少的情况下,一旦程序中工作量较大较多,则势必影响程序运行的效率,为了简化程序中控制的功能模块的执行时间,引入中断控制就很有必要,,一旦有中断时间发生,则程序立马跳转到中断向量的执行程序中,执行完成后就恢复到正常的程序状态。


  在STM32F中采用中断控制器NVIC来设定中断。按照中断初始化配置的结构体文件,我们需要在NVIC初始化结构体配置如下:

  void EXti_PB12_Config(void)


  {


  //定义结构体


  GPIO_InitTypeDef GPIO_InitStructure;


  EXTI_InitTypeDef EXTI_InitStructure;


  //开启外设时钟


  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);


  NVIC_Configuration();


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;


  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;


  GPIO_Init(GPIOB, &GPIO_InitStructure);


  // 中断向量模式(PB12)


  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource12);


  //给中断向量成员赋值,这是因为PB12连接到EXTI_Line12;


  EXTI_InitStructure.EXTI_Line = EXTI_Line12;


  //设置中断触发模式,通过这个来不断查询相应的寄存器


  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;


  //设置触发模式为下降沿触发


  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;


  //使能


  EXTI_InitStructure.EXTI_LineCmd = ENABLE;


  //调用库函数


  EXTI_Init(&EXTI_InitStructure);


  }


  static void NVIC_Configuration(void)


  {


  //定义结构体


  NVIC_InitTypeDef NVIC_InitStructure;


  //把NVIC中断优先级分组设置为第一组


  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);


  //PB12配置为EXT1第10-15线的中断向量


  NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;


  //设置抢占优先级为0


  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;


  //设置响应优先级为0


  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;


  //使能


  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;


  //调用库函数


  NVIC_Init(&NVIC_InitStructure);


  }


  从代码可以看出,我们可以创建两个文件,一个是EXTI_KEY.C和EXTI_KEY.H文件,将上述代码放置于EXTI_KEY.C文件中。我们在配置中断时,需要做以下工作:


  1、使能EXTIx线的时钟和第二功能时钟,前者是具体某个GPIO口的时钟,这里代码是PB12的时钟;


  2、配置EXTIx的中断优先级;主要体现在优先级分组,响应优先级,抢占优先级,优先级分组取值意味着设定了抢占优先级和响应优先级的个数,最大支持16个,也就是说他们之和是16,抢占优先级和响应优先级取值越低,意味着优先级越高,一般来说,优先级高的优先执行。


  3、选定要配置的EXTI的I/0线和I/O的工作模式,这里主要GPIO的初始化配置,以及该引脚挂靠的EXTI线。这里挂靠线为LINE12。


  4、配置EXTI中断线工作模式。这里主要是配置中断触发模式(如上升沿触发,下降沿触发等等)


  在做完初始化工作后,我们发现,其实中断配置的模式很固定化,一般修改值为工作2和3,可以实现不同GPIO口的中断配置和中断优先级配置。


  完成中断初始化配置后,我们需要写入中断服务函数。在这里就要涉及到中断标志位,触发中断和清除中断标志位。其中断服务函数如下:



void EXTI15_10_IRQHandler(void)


  {


  IF (EXTI_GetITStatus(EXTI_Line12) != RESET) //确保是否产生了中断


  {


  写入要控制的功能;


  EXTI_ClearITPendingBit(EXTI_Line12); //清除中断标志位


  }


  }


  在中断服务函数中,我们发现这个模板很固定,其采用的配置和中断配置很相似,唯一的区别就是采用哪个功能引脚配置。


  在这一节中,我们主要是学习如何使用中断。虽说在中断没有学习之前,都想象的难度很大。但是在使用STM32F的库函数编程后,我们发现,类似于这种复杂的编程机器用库函数轻松驾驭。所采用的的模板和格式都可以在官方的库函数中找到原型,方便了程序的编写。


  最后总结一下,中断时打破当前程序的运行,直接执行中断服务函数里面的功能,在中断执行完之后一定要清除中断,这样才能跳出中断,回到之前程序运行的阶段。


关键字:执行时间  STM32F中  按键中断 引用地址:关于STM32F中按键中断分析

上一篇:STM32F10xxx GPIO调试复用口
下一篇:stm32之外部中断该如何使用

推荐阅读最新更新时间:2024-11-13 10:34

2440裸机程序——按键中断
工程当中需要添加 S3C2440A.s ;2440lib.c;main.c;keyscan.c这段四个程序。 主程序: /********************************************************************************************* * File name: main.c * Author: ZXL * Description: 按下按键,相应的LED灯点亮且蜂鸣器响,由于触发了外部中断,通过串口向电脑发送是哪一个外部中断源触发了中断。 * History: 2013.5.6 ***********************************
[单片机]
ARM-LINUX按键中断驱动程序
驱动程序 #include linux/module.h #include linux/kernel.h #include linux/moduleparam.h #include linux/init.h #include linux/kdev_t.h #include linux/fs.h #include linux/cdev.h #include linux/device.h #include asm/arch/regs-gpio.h #include asm/hardware.h #include asm/uaccess.h #include linux/p
[单片机]
ARM-LINUX<font color='red'>按键</font><font color='red'>中断</font>驱动程序
单片机C语言程序设计:用计数器中断实现100以内的按键计数
/* 名称:用计数器中断实现 100 以内的按键计数 说明:本例用 T0 计数器中断实现按键技术,由于计数寄存器初值为 1,因此 P3.4 引脚的每次负跳变都会触发 T0 中断,实现计数值累加。 计数器的清零用外部中断 0 控制。 */ #include reg51.h #define uchar unsigned char #define uint unsigned int //段码 uchar code DSY_CODE ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; uchar Count=0; //主程序 void main(
[单片机]
单片机C语言程序设计:用计数器<font color='red'>中断</font>实现100以内的<font color='red'>按键</font>计数
使用STM32CubeMX开发三:按键中断实验
硬件平台:stm32F407Zet6 软件平台:stm32cubeMX 4.7+MDK5.14 电路连接:PE8-LED0、PE9-LED1、PE10-LED2、PE11-LED3、PE12-KEY0、PE13-KEY1、PE14-KEY2、PE15-KEY3 第一步、使用stm32cubeMX创建工程,选择相应的芯片,配置RCC、SYS、引脚和时钟如下图所示: 注意,由于按键上有上拉电阻,这里选择中断模式的时候,我们选择下降沿触发中断。 第二步,配置输出Keil工程 第三步、编写程序下载验证 STM32CubeMx把代码都生成了,查找函数,分析调用的过程,添加应用层代码就行 首先在stm32f4xx_it
[单片机]
使用STM32CubeMX开发三:<font color='red'>按键</font><font color='red'>中断</font>实验
1.5.5_按键中断程序示例_概述与初始化
中断的处理流程与异常的处理流程类似,当中断发生时,以下操作将由硬件执行: 保存被中断的下一条指令地址到LR_异常,在ARM State下保存的是PC+8,在Thumb State下保存的是PC+4; 把CPSR存入SPSR_异常; 修改CPSR的 进入异常模式; 跳到向量表。 但中断是由中断源产生的,这与其他异常稍有差别。比如,中断的触发方式有很多种,当中断发生时,我们是通过中断标志位来判断是哪种中断发生了;中断处理完成后,需要清楚对应的中断标志位来表示已经处理该中断请求。 与异常类似(中断也属于一种异常),中断的退出流程大致如下: 将LR_异常减去offset,得到的值赋给PC(offset的取值如下表)。 CP
[单片机]
1.5.5_<font color='red'>按键</font><font color='red'>中断</font>程序示例_概述与初始化
zigbee学习之路(四):按键控制(中断方式)
一.前言 通过上次的学习,我们学习了如何用按键控制led,但是在实际应用中,这种查询方式占用了cpu的时间,如果通过中断控制就可以解决这个问题,我们今天就来学习按键控制的中断方式。 二.原理分析 传统的51单片机如果要使用中断,也要对相应的寄存器进行控制,cc2530芯片也不例外,而且相对复杂。需要配置多个中断寄存器,下面来一一介绍。 这个寄存器是来控制端口0中断使能的,要开启中断,应设为1. 这个是配置各种中断使能的,我们只需要配置P0IE. 这个是配置中断触发方式的,根据上次的按键原理图,我们应该选择低下降沿触发模式。 中断状态标志位,当中断没有发生或者结束时,应将标志位置0. 三.程序代码 #includ
[单片机]
zigbee学习之路(四):<font color='red'>按键</font>控制(<font color='red'>中断</font>方式)
专题2-通过按键中断\2440按键中断编程lesson2
1、程序优化 修改Makefile 把main.c里面的mmu代码复制到mmu.c并修改如下 main.c的修改 由于在bootloader当中一般不会使用MMU,所以 main.c 加入led.c文件 makefile 2440中断源初始化 打开开发板底板与核心板原理图 底板 比如K1对应EINT1,然后到核心板去搜EINT1 然后去2440芯片手册去找到GPF这一组IO口 创建一个button.c,加入到makefile里面去button.o 按键初始化 编写button.c文件 #define GPFCON (volatile unsigned long *)0x56000050
[单片机]
专题2-通过<font color='red'>按键</font>玩<font color='red'>中断</font>\2440<font color='red'>按键</font><font color='red'>中断</font>编程lesson2
STM32通过按键中断点亮led灯
首先是led头文件,其中调用的一些库是原子的我只是借鉴一下 侵删 #ifndef __LED_H #define __LED_H #include sys.h #define LED PCout(13) // PA8 void LED1_Init(void);//³õʼ»¯ #endif led的c文件 #include led.h //初始化PB5和PE5为输出口.并使能这两个口的时钟 //LED IO初始化 void LED1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockC
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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