STM32中按键中断分析(附源码)

发布者:chenxiaohong68最新更新时间:2022-12-27 来源: zhihu关键字:STM32  按键  中断分析 手机看文章 扫描二维码
随时随地手机看文章

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


  在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的库函数编程后,我们发现,类似于这种复杂的编程机器用库函数轻松驾驭。所采用的的模板和格式都可以在官方的库函数中找到原型,方便了程序的编写。


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


关键字:STM32  按键  中断分析 引用地址:STM32中按键中断分析(附源码)

上一篇:STM32单片机GPIO口配置问题
下一篇:STM32时钟分解与解析

推荐阅读最新更新时间:2024-11-07 19:29

基于STM32的步行者航位推算装置设计
  基于便携性与实用性考虑,提出一种新的步行者航位推算装置设计。使用三维加速度计与电子罗盘集成芯片LSM303DLHC和陀螺仪集成芯片MPU3050对步行者的实时运动信息进行采集,采用具有ARMCortex-M3内核的STM32F103RBT6单片机收集传感器数据并对数据进行航位推算处理,将步行者航迹信息显示于TFTLCD上。实验证明,该装置具有较高的推算精度,能满足实际应用需求。   1、系统组成与工作原理 该步行者航向推算装置主要由三维传感器模块、数据转换模块与处理模块组成,具体的组成框图如图1所示。三维传感器模块上分为三轴加速度计与电子罗盘集成芯片LSM303DLHC、陀螺仪集成芯片MPU3050,以及用于数据处理的单片机S
[单片机]
基于<font color='red'>STM32</font>的步行者航位推算装置设计
STM32笔记--ADC(DMA方式)
在上一次的博客中重新学习了DMA,这次我们便学以致用了,ADC的概念想必大家都是十分清楚了,模拟转数字,可以用在测信号,测电压,在我们的生活中有着十分巨大的作用,这次我们就来看看ADC又有哪些操作吧! ADC流程,首先ADC采集一个信号(信号范围大都为0-3.3V,ps:3.3V可通过更改Vref寄存器修改),每隔相同时间菜一次数值发送到一个可变16位数中,下面是我们的数组定义: __IO uint16_t ADC_ConvertedValue; //定义该16位数用来传输数据,原因是我们使用的12位AD,由于寄存器的定义方便,因此使用16位数 下面是ADC的初始化和配置代码: void ADC1_Init(void
[单片机]
STM32内存分配解析及变量的存储位置
内存映射 在一些桌面程序中,整个内存映射是通过虚拟内存来进行管理的,使用一种称之为内存管理单元(MMU)的硬件结构来将程序的内存映射到物理RAM。在对于RAM紧缺的嵌入式系统中,是缺少MMU内存管理单元的。因此在一些嵌入式系统中,比如常用的STM32来讲,内存映射被划分为闪存段(也被称为Flash,用于存储代码和只读数据)和RAM段,用于存储读写数据。 STM32的Flash和RAM地址范围 标题中所说的内存是指STM32的Flash和RAM,下图是ARM Cortex M3的地址映射 从图中我们可以看出,RAM地址是从0x2000 0000开始的,Flash地址是从0x8000 0000开始的。 Flash 代码
[单片机]
<font color='red'>STM32</font>内存分配解析及变量的存储位置
stm32关于串口输出的几种常用方式
在使用stm32做项目时,我们常常会使用到串口调试,通过串口来输出我们想要看的相关参数值,这样既方便有快捷。 具体方法有哪些呢,我自己整理了一下,这个也是借鉴别人的用法而已。希望大家可以相互讨论学习。 1、使用printf语句通过串口输出我们想要的参数值 具体的用法:使用之前必须包含相应的头文件#include stdio.h int fputc(int ch, FILE *f)//重定向,让printf输出到串口 { USART_SendData(USART1, (uint8_t) ch); while (USART_GetFlagStatus(USART1, USART_FLAG_TC) ==
[单片机]
<font color='red'>stm32</font>关于串口输出的几种常用方式
STM32使用FATFSW读写SD出现错误2的原因
最近在最项目时遇到使用STM32写入SD卡数据时,刚开始数据写入正常,过一会就回出现错误,错误代码2,查阅FATFS的官方文档,给出如下: 总共4种可能的情况,依次实验了上述问题的各种解决方法,都补管用,最后在写入数据前加入 设备正常运行,替换成延时函数也正常运行 由此推断可能是由于写入的速度过快造成。
[单片机]
<font color='red'>STM32</font>使用FATFSW读写SD出现错误2的原因
STM32之LWIP网络协议栈移植步骤与方案
1.LWIP介绍 lwip是瑞典计算机科学院网络嵌入式系统小组(SICS)的Adam Dunkels(亚当·邓克尔) 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持 TCP 协议主要功能的基础上减少对RAM的占用。 LwIP是Light Weight(轻型)IP 协议,有无操作系统的支持都可以运行。LwIP 实现的重点是在保持TCP协议 主要功能的基础上减少对RAM的占用,它只需十几KB的RAM和 40K左右的ROM就可以运行,这使LwIP协议栈适合在低端的嵌入式系统中使用。lwip提供三种API: RAW API (NETCONN)lwip API BSD API 2.LWIP源码下载 源码下载地址:LWIP
[单片机]
<font color='red'>STM32</font>之LWIP网络协议栈移植步骤与方案
stm32 驱动 触摸屏
由于智能手机的发展和大屏幕的兴起,触摸屏已经得到了广泛的应用。触摸屏分为两种:电阻触屏 俗称“软屏”;电容触屏俗称“硬屏”。 电阻触摸屏的屏体部分是一块多层复合薄膜,由一层玻璃或有机玻璃作为基层,表面涂有一层透明的阻性材料组成的导电层(ITO膜),上面再盖有一层外表面经过硬化处理、光滑防刮的塑料层。它的内表面也涂有一层ITO,在两层导电层之间有许多细小(小于千分之一英寸)的透明隔离点把它们隔开。当手指接触屏幕时,两层 ITO发生接触,电阻发生变化,控制器根据检测到的电阻变化来计算接触点的坐标,再依照这个坐标来进行相应的操作,因此这种技术必须是要施力到屏幕上,才能获得触摸效果。 所有的电阻式触摸屏都采用分压器原
[单片机]
<font color='red'>stm32</font> 驱动 触摸屏
STM32的SRAM调试
据说Flash的擦写次数是有限的,所以在调试的时候擦来擦去不好,看到boot0、boot1可以配置从SRam启动,就查了相关资料,试了一下,ok了。记录一下,免得以后又忘了。跟flash调试部分相同的就不再描述了,重点在于SRam调试的设置部分,大部分以图片形式。 Dbg_RAM.ini(D:KeilARMBoardsKeilMCBSTM32Blinky下面有一个,其实MCBSTM32目录下的都一样的,只要有)的内容: /*---------------------------------------------------------------------------- * Name: Dbg_RAM.ini *
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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