一、基础知识

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

}

   

}

最新文章

  1. nginx 日志相关配置总结
  2. 图说函数模板右值引用参数(T&&)类型推导规则(C++11)
  3. 用orb-slam2跑RGB-D Example中的TUM Dataset
  4. OpenJudge4980:拯救行动//stl优先队列
  5. wpf:小问题总结
  6. [Leetcode][JAVA] Palindrome Partitioning II
  7. TestNG之执行测试类方式
  8. Foobar音乐播放器——最佳音乐播放器 - imsoft.cnblogs
  9. [HttpClient]SSL双向实例
  10. PHP导出MySQL数据到Excel
  11. 进程序名得到进程ID和句柄与进程的公司名(使用快照和GetPeFileCompany和VerQueryValueW等函数)
  12. JAVA基础编程50题(10-12题)具体解释
  13. CSS盒模型和margin重叠
  14. 前端到后台ThinkPHP开发整站(2)
  15. 策略模式--List排序
  16. Centos 配置eth0 提示Device does not seem to be present
  17. java-信息安全(八)-迪菲-赫尔曼(DH)密钥交换
  18. [转]关于ReentrantLock中线程读某个变量是否需要加锁
  19. 转换 transform
  20. python抓取数据,python使用socks代理抓取数据

热门文章

  1. PHP网络协议相关考点
  2. (转)淘淘商城系列——SSM框架整合之表现层整合
  3. js 作用域 ?????
  4. android studio 调试安装
  5. Web应用启动时,后台自动启动一个线程
  6. vue 添加 fastclick的支持
  7. h5开发app,移动端 click 事件响应缓慢的解决方案
  8. SQL表变量与临时表区别 + 非游标临时表遍历
  9. BZOJ2007 NOI2010 海拔 平面图转对偶图 最小割
  10. 22Spring基于配置文件的方式配置AOP