一、基础知识

1.ARM的中断优先级分硬件优先级和软件优先级两种

当中软件优先级又由抢占优先级和响应优先级组成

2.中断的优先级採用编号小优先的原则。

3.普通情况:

1).假设设定了软件优先级。先看软件优先级:

具有高抢占式优先级的中断能够在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套。或者说高抢占式优先级的中断能够嵌套低抢占式优先级的中断。

当两个中断源的抢占式优先级同样时,这两个中断将没有嵌套关系,当一个中断到来后,假设正在处理还有一个中断,这个后到来的中断就要等到前一个中断处理完之后才干被处理。假设这两个中断同一时候到达,则中断控制器依据他们的响应优先级高低来决定先处理哪一个。

2).后看硬件优先级

假设他们的抢占式优先级和响应优先级都相等,则依据他们在中断表中的排位顺序决定先处理哪一个。

4. 特殊情况

       软件优先级设置对复位、NMI、硬件故障无效,他们的优先级始终比外部中断高

5.软件优先级的分组
       中断优先级分组就是把优先级寄存器切割。分开哪几位是响应优先级。哪几位是抢占优先级。至于如何设置分组:每个ARM的M4中断优先级设计为可编程的8位,详细到stm32f4就仅仅留给用户4位共16级的可编程优先级,当中低4位已被占用。

也就是说stm32f4的优先级分组情况採用NVIC_PriorityGroup_x,
x=0~4表示。相应例如以下表格:

[10:8]

切割点

抢占优先级位

响应优先级位

抢占优先级数

响应优先级数

0b011(组4)

xxxx

[7:4]

none

16(0~15)

1(0~0)

0b100(组3)

xxx.y

[7:5]

[4]

8

2

0b101(组2)

xx.yy

[7:6]

[5:4]

4(0~3)

4(0~3)

0b110(组1)

x.yyy

[7]

[6:4]

2

8

0b111(组0)

yyyy

none

[7:4]

1

16

二、详细实例

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGl0empt/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">


1.分析:
1).开关没有按下去时候。GPIO为高电平。开关按下去时候为低电平。

2).相应GPIO为低电平时候将点亮二极管。
 STM32F407VG将外部GPIO接到 16 个外部中断/事件线上。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGl0empt/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">


依据上图可知:本文的GPIO连接到例如以下中断线
PE12-->EXIT12
PE13-->EXIT13
PE14-->EXIT14
PE15-->EXIT15

在中断向量表中能够查到 EXTI 线 [15:10]  公用40号中断EXTI15_10。优先级是47  


2.程序编制
2.1中断初始化部分
1)配置中断线源在哪个port
 EXTI_InitTypeDef   EXTI_InitStructure;
   /* 使能SYSCFG时钟 */ 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource12);
 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource13);
 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource14);
 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource15);
 2)配置并初始化中断线
 /* 配置 EXTI LineXXX */
 EXTI_InitStructure.EXTI_Line = EXTI_Line12 | EXTI_Line13 | EXTI_Line14 | EXTI_Line15;
 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
 EXTI_InitStructure.EXTI_LineCmd = ENABLE;
 EXTI_Init(&EXTI_InitStructure);

3)配置并初始化
 NVIC_InitTypeDef   NVIC_InitStructure;
 /* 设置NVIC优先级分组为Group2:4个抢占式优先级,4响应式优先级 */
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
 
 /* 中断优先级配置 最低优先级 这里一定要分开的设置中断。不可以合并到一个里面设置 */
 NVIC_Init(&NVIC_InitStructure);
 
 NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
 NVIC_Init(&NVIC_InitStructure);

2.2中断处理函数部分
void EXTI15_10_IRQHandler(void)

{

if(EXTI_GetITStatus(EXTI_Line12) != RESET)

{

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

//do something

}



if(EXTI_GetITStatus(EXTI_Line13) != RESET)

{

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

//do something

}

if(EXTI_GetITStatus(EXTI_Line14) != RESET)

{

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

//do something

}

if(EXTI_GetITStatus(EXTI_Line15) != RESET)

{

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

//do something

}

   

}

STM32F104VG (一)中断与外部中断的更多相关文章

  1. STM32——外部中断EXIT实现

    外部中断实现步骤: 一.初始化,包括:1.AFIO时钟中断和GPIO时钟使能:                          2.GPIO初始化                           ...

  2. [Arduino] 外部中断

    原文:http://www.arduino.cn/thread-2421-1-1.html 1.什么是中断? 试想一下,你正在家里吃饭,这时传来了敲门声,虽然你巨饿,虽然面前全是山珍海味,但此时你不得 ...

  3. STM8的中断系统以及外部中断详解

    STM8具有最多32的中断系统,在中断的处理上类似于cortexm系列的芯片,首先是每个中断的向量都是固化在系统内部的,用户需要向相应的中断向量flash位置写入中断处理函数,其二,每个中断向量都具有 ...

  4. Stm32CubeMX5 配置 外部中断

    实验使用连接PA8引脚的按键触发中断,外部中断使用双边沿触发,这样就可以检测按键按下与松开,当按键按下时点亮LED, 当按键松开是关闭LED,在中断服务函数中只置位相应的标志,在main函数中具体处理 ...

  5. 转载:STM32之中断与事件---中断与事件的区别

    这张图是一条外部中断线或外部事件线的示意图,图中信号线上划有一条斜线,旁边标志19字样的注释,表示这样的线路共有19套.图中的蓝色虚线箭头,标出了外部中断信号的传输路径,首先外部信号从编号1的芯片管脚 ...

  6. STM32f103之外部中断

    一.背景 有个需求,IO口检测上升沿,然后做相应的动作.在此记录STM32F103的外部中断结构及配置方法, 以备下次快速上手使用. 有许多不太明白,又是老司机(:-D)帮忙,真的是站在别人的肩膀上会 ...

  7. STM32之EXTI——外部中断

    互联网的广大网友,大家早上中午晚上好.EXTI...故名思义..EX表外,出..I表示Intrrupt..所以合起来就是外部中断...说到这..我觉得我最近的六级水平(背单词)又进了一步,稍微自夸了下 ...

  8. 转别人的 STM32外部中断使用注意事项

    前言:这些问题都是我之前在工作中遇到的,后来觉得需要总结,自己记忆不好,所以在这个给自己打个mark. 一:触发方式 STM32 的外部中断是通过边沿来触发的,不支持电平触发: 二:外部中断分组 ST ...

  9. STM32外部中断初理解

    PA0,PB0...PG0--->EXTI0 PA1,PB1...PG1--->EXTI1 ....... PA15,PB15...PG15--->EXTI15 以上为GPIO和中断 ...

随机推荐

  1. 洛谷 P2341 [HAOI2006]受欢迎的牛

    题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的“喜欢”是可以传递的——如果A喜 欢B,B喜欢C,那么A也喜欢C ...

  2. idea 中pom.xml依赖版本号报错(报红,如下图所示)

    1.maven工程中出现的错误 2.解决办法:file->setting->Maven 如果还没好的话请尝试以下方法:

  3. h5 移动端 监听软键盘弹起、收起

    前面一篇博客 h5 安卓 键盘弹起界面适配 修改webview高度提到了在adnroid中如何监听软键盘的弹起与收起,是利用的窗口的高度发生变化window.onresize事件来做突破点的,但是io ...

  4. bash - GNU Bourne-Again SHell

    概述(SYNOPSIS) bash [options] [file] 版权所有(COPYRIGHT) Bash is Copyright (C) 1989-2002 by the Free Softw ...

  5. Linux内核中TCP SACK机制远程DoS预警通告

    漏洞描述 2019年6月18日,RedHat官网发布报告:安全研究人员在Linux内核处理TCP SACK数据包模块中发现了三个漏洞,CVE编号为CVE-2019-11477.CVE-2019-114 ...

  6. vue-cli 中使用less

    (1)安装Less模块: npm install less (2)安装less和less-loader,命令如下 npm install less less-loader --sava-dev (3) ...

  7. hdfs深入:04、hdfs当中的元数据管理以及元数据节的查看

    6.HDFS的元数据信息FSimage以及edits和secondaryNN的作用 fsimage:存放的是一份最完整的元数据信息,内容比较大edits:元数据操作日志,记录了一段时间的元数据信息的变 ...

  8. Server.MapPath() 用法

    Server.MapPath() ./当前目录/网站主目录../上层目录~/网站虚拟目录 如果当前的网站目录为E:\wwwroot   应用程序虚拟目录为E:\wwwroot\company 浏览的页 ...

  9. javascript的prototype经典使用场景

    prototype的经典使用场景就是为对象增加属性和方法,如给自定义的Man对象增加个姓名属性和语言方法: function man() {        this.age = "22&qu ...

  10. Android获取屏幕的大小与密度的代码

    Android项目开发中很多时候需要获取手机屏幕的宽高以及屏幕密度来进行动态布局,这里总结了三种获取屏幕大小和屏幕密度的方法 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...