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

  在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中断系统)

  http://www.makeru.com.cn/live/1392_1124.html?s=45051

  (时钟系统)

  http://www.makeru.com.cn/live/1392_1082.html?s=45051

  (stm32 温湿度采集)

  http://www.makeru.com.cn/live/detail/1476.html?s=45051

  (stm32 USART串口应用)

  http://www.makeru.com.cn/live/1392_1164.html?s=45051

  PWM脉宽调制技术

  http://www.makeru.com.cn/live/4034_2146.html?s=45051

  基于STM32讲解串口操作

  http://www.makeru.com.cn/live/1758_490.html?s=45051

STM32中按键中断分析的更多相关文章

  1. STM32—中断详解(配合按键中断代码,代码亲测)

    在STM32中执行中断主要分三部分: 1.配置NVIC_Config()函数 2.配置EXTI_Config()函数 3.编写中断服务函数 (注:本文章所用代码为中断按键代码,实现了按键进入中断从而控 ...

  2. u-boot中断功能初步分析之---------按键中断

    作者:彭东林 邮箱:pengdonglin137@163.com QQ: 405728433 以前一直有个疑问,在U-boot下到底能不能使用中断,为了验证这个问题,于是乎,昨天晚上我在自己的 TQ2 ...

  3. 关于STM32 (Cortex-M3) 中NVIC的分析

    一.STM32 (Cortex-M3) 中的优先级概念 STM32(Cortex-M3)中有两个优先级的概念:抢占式优先级和响应优先级,也把响应优先级称作"亚优先级"或" ...

  4. 2、CC2541芯片中级教程-OSAL操作系统(进一步了解-OLED && 普通按键和5方向按键-中断!!!)这个系统驱动层和应用层不一样~

    本文根据一周CC2541笔记汇总得来—— 适合概览和知识快速索引—— 全部链接: 中级教程-OSAL操作系统\OSAL操作系统-实验01 OSAL初探 [插入]SourceInsight-工程建立方法 ...

  5. ok6410按键中断编程,linux按键裸机

    6410按键中断编程 一.流程分析 外部中断控制寄存器(s3c6410x  359页) 1.EINTxCONy: 外部中断组x的第y个控制器.这个就是设置中断的触发方式.有5种触发方式. 2.EINT ...

  6. STM32固件库文件分析

    STM32固件库文件分析 1.汇编编写的启动文件 startup/stm32f10x.hd.s:设置堆栈指针,设置pc指针,初始化中断向量,配置系统时钟,对用c库函数_main最后去c语言世界里. 2 ...

  7. S3C2440—12.按键中断

    文章目录 一. 总体 二. CPSR设置 三. 中断源设置 四. 中断控制器设置 五. C中断处理函数 六. 汇编IRQ异常处理程序 七. 源码 一. 总体 要驱动按键中断控制LED亮灭,程序要进行如 ...

  8. nios II--实验4——按键中断硬件部分

    按键中断 硬件开发 新建原理图 1.打开Quartus II 11.0,新建一个工程,File -> New Project Wizard…,忽略Introduction,之间单击 Next&g ...

  9. Linux内核中的中断

    http://blog.csdn.net/weiqing1981127/article/details/8298585 中断处理程序是被内核调用来响应中断的,它运行在中断上下文,中断处理程序是上半部, ...

随机推荐

  1. 硕盟 TYPE C转HDMI+VGA+USB3.0+PD3.0四口扩展坞

    硕盟SM-T54是一款USB-C 四合一多功能扩展坞,支持四口同时使用,您可以将含有USB 3.1协议的电脑主机,通过此产品连接到具有HDMI或VGA的显示器.电视机或其他显示设备.产品可以接入硬盘. ...

  2. 可选链运算符、空值合并运算符 --应用到vue项目

    1.npm安装 npm install @babel/plugin-proposal-optional-chaining // 可选链运算符 ?. npm install @babel/plugin- ...

  3. 基于Tensorflow + Opencv 实现CNN自定义图像分类

    摘要:本篇文章主要通过Tensorflow+Opencv实现CNN自定义图像分类案例,它能解决我们现实论文或实践中的图像分类问题,并与机器学习的图像分类算法进行对比实验. 本文分享自华为云社区< ...

  4. PHP中的PDO操作学习(四)查询结构集

    关于 PDO 的最后一篇文章,我们就以查询结果集的操作为结束.在数据库的操作中,查询往往占的比例非常高.在日常的开发中,大部分的业务都是读多写少型的业务,所以掌握好查询相关的操作是我们学习的重要内容. ...

  5. Batch Size对神经网络训练的影响

    ​ 前言 这篇文章非常全面细致地介绍了Batch Size的相关问题.结合一些理论知识,通过大量实验,文章探讨了Batch Size的大小对模型性能的影响.如何影响以及如何缩小影响等有关内容. 本文来 ...

  6. ~/.emacs emacs 配置文件

    windows ~/.emacs (when (>= emacs-major-version 24) (require 'package) (add-to-list 'package-archi ...

  7. Android Kotlin协程入门

    Android官方推荐使用协程来处理异步问题.以下是协程的特点: 轻量:单个线程上可运行多个协程.协程支持挂起,不会使正在运行协程的线程阻塞.挂起比阻塞节省内存,且支持多个并行操作. 内存泄漏更少:使 ...

  8. USACO Section 4

    前言 好久没更新这个系列了,最近闲的无聊写一下.有两题搜索懒得写了. P2737 [USACO4.1]麦香牛块Beef McNuggets https://www.luogu.com.cn/probl ...

  9. 解决 Asp.Net5 在视频文件下载预览时无法快进的问题

    前情提要 https://www.cnblogs.com/puzhiwei/p/15265005.html 在解决.Net5 如何修改Content-Disposition实现在线预览的功能后,我又遇 ...

  10. Netty常用招式——ChannelHandler与编解码

    本文是Netty系列第8篇 上一篇文章我们深入学习了Netty逻辑架构中的核心组件ChannelHandler和ChannelPipeline,并介绍了它在日常开发使用中的最佳实践.文中也提到了,Ch ...