本章参考资料《 STM32F4xx 中文参考手册》第十章-中断和事件、《ARM Cortex™-
M4F 技术参考手册》 -4.3 章节: NVIC 和 4.4 章节: SCB—4.4.5 的 AIRCR。
STM32 中断非常强大,每个外设都可以产生中断,所以中断的讲解放在哪一个外设里
面去讲都不合适,这里单独抽出一章来做一个总结性的介绍,这样在其他章节涉及到中断
部分的知识我们就不用费很大的篇幅去讲解,只要示意性带过即可。
本章如无特别说明,异常就是中断,中断就是异常,请不要刻意钻牛角尖较劲。

异常类型
F429 在内核水平上搭载了一个异常响应系统, 支持为数众多的系统异常和外部中断。
其中系统异常有 10 个,外部中断有 91 个。除了个别异常的优先级被定死外,其它异常的
优先级都是可编程的。有关具体的系统异常和外部中断可在标准库文件 stm32f4xx.h 这个头
文件查询到,在 IRQn_Type 这个结构体里面包含了 F4 系列全部的异常声明。

NVIC 简介
在讲如何配置中断优先级之前,我们需要先了解下 NVIC。 NVIC 是嵌套向量中断控制
器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。但是
各个芯片厂商在设计芯片的时候会对 Cortex-M4 内核里面的 NVIC 进行裁剪,把不需要的
部分去掉,所以说 STM32 的 NVIC 是 Cortex-M4 的 NVIC 的一个子集。

NVIC 寄存器简介
在固件库中, NVIC 的结构体定义可谓是颇有远虑,给每个寄存器都预览了很多位,
恐怕为的是日后扩展功能。不过 STM32F429 可用不了这么多,只是用了部分而已,具体
使用了多少可参考《ARM Cortex™-M4F 技术参考手册》 -4.3.11:NVIC 寄存器映射。

NVIC 中断配置固件库
固件库文件 core_cm4.h 的最后,还提供了 NVIC 的一些函数,这些函数遵循 CMSI 规
则,只要是 Cortex-M4 的处理器都可以使用。

优先级定义
在 NVIC 有一个专门的寄存器:中断优先级寄存器 NVIC_IPRx(在 F429 中, x=0...90)
用来配置外部中断的优先级, IPR 宽度为 8bit,原则上每个外部中断可配置的优先级为
0~255,数值越小,优先级越高。但是绝大多数 CM4 芯片都会精简设计,以致实际上支持
的优先级数减少,在 F429 中,只使用了高 4bit,如下所示:

在配置每个中断的时候一般有 3 个编程要点:
1、 使能外设某个中断,这个具体由每个外设的相关中断使能位控制。比如串口有发送
完成中断,接收完成中断,这两个中断都由串口控制寄存器的相关中断使能位控制。
2、 初始化 NVIC_InitTypeDef 结构体,配置中断优先级分组,设置抢占优先级和子优
先级,使能中断请求

2) NVIC_IRQChannelPreemptionPriority:抢占优先级,具体的值要根据优先级分组来
确定,具体参考表格 16 优先级分组真值表 。
3) NVIC_IRQChannelSubPriority:子优先级,具体的值要根据优先级分组来确定,具
体参考表格 16 优先级分组真值表 。
4) NVIC_IRQChannelCmd:中断使能( ENABLE)或者失能( DISABLE) 。操作的
是 NVIC_ISER 和 NVIC_ICER 这两个寄存器。
3、 编写中断服务函数
在启动文件 startup_stm32f429_439xx.s 中我们预先为每个中断都写了一个中断服务函
数,只是这些中断函数都是为空,为的只是初始化中断向量表。实际的中断服务函数都需
要我们重新编写,中断服务函数我们统一写在 stm32f4xx_it.c 这个库文件中。
关于中断服务函数的函数名必须跟启动文件里面预先设置的一样,如果写错,系统就
在中断向量表中找不到中断服务函数的入口,直接跳转到启动文件里面预先写好的空函数,
并且在里面无限循环,实现不了中断。

best practice:

用中断优先级分组0或4最省心,省去一大堆比较,谁小谁优先级高,如果优先级相同看硬件中断编号,小的优先级高。

/*优先级分组为4最好,没有枪占优先级的中断,我实在想不出有什么程序需要这样配置,而且没有抢占优先级,子优先级中断发生时,有其他高优先级中断发生,依旧不能打断低优先级中断的执行,这是致命缺陷,而且后面的操作系统移植上,官方也建议我们分组为4,0-15的抢占优先级,没有子优先级。2017.8.5*/

STM32 中断应用概览的更多相关文章

  1. 第16章 STM32中断应用概览

    第16章     STM32中断应用概览 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fi ...

  2. 第16章 STM32中断应用概览—零死角玩转STM32-F429系列

    第16章     STM32中断应用概览 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fi ...

  3. STM32 学习笔记之中断应用概览--以f103为例

    异常类型 F103 在内核水平上搭载了一个异常响应系统, 支持为数众多的系统异常和外部中断.其中系统异常有8 个(如果把Reset 和HardFault 也算上的话就是10 个),外部中断有60个.除 ...

  4. STM32中断管理函数

    CM3 内核支持256 个中断,其中包含了16 个内核中断和240 个外部中断,并且具有256 级的可编程中断设置.但STM32 并没有使用CM3 内核的全部东西,而是只用了它的一部分. STM32 ...

  5. STM32中断应用总结

    STM32中断很强大,STM32中断可以嵌套,任何外设都可以产生中断,其中中断和异常是等价的. 中断执行流程: 主程序执行过程可以产生中断去执行中断的内容(保护现场),然后在返回继续执行中断. 中断分 ...

  6. 【转载-Andrew_qian】stm32中断学习

    [转载]stm32中断学习 中断对于开发嵌入式系统来讲的地位绝对是毋庸置疑的,在C51单片机时代,一共只有5个中断,其中2个外部中断,2个定时/计数器中断和一个串口中断,但是在STM32中,中断数量大 ...

  7. STM32中断编程三步曲教你弄会中断设置以及中断优先级设置

    中断作为stm32中必不可少的一个功能,其重要性是不言而喻的因此把中断学习好是根本. 所以今天就来好好啃一下中断配置的知识,俗话说:磨刀不误砍柴工.问题是什么呢?项目中我用到了一个触摸键盘TTP229 ...

  8. stm32 中断几个库函数实现过程分析

    感谢原文作者:鱼竿的传说,这篇文章写得不错,转载自 http://www.cnblogs.com/chineseboy/archive/2013/03/14/2956782.html 前题: 闭门造车 ...

  9. stm32中断无电平触发的解决办法

    这几天在用stm32读取FPGA中FIFO里的数据,遇到了不少的问题.其中有个自己觉得比较好玩的问题,就拿出来写写.其实这个问题也比较简单,开始我觉得没必要拿出来写,不过,想想后觉得还是写写吧,就当做 ...

随机推荐

  1. C#模拟MSN窗体抖动

    C#模拟MSN窗体抖动 窗体抖动是件很有意思的事情,就让我们看看一起来看看它的原理吧. 其实是生成随机数,然后改变Form的左上角的坐标.我用的是循环来弄得,其实可以用timer来控制. 我把抖动分成 ...

  2. Android -- SurfaceView绘制

    SurfaceView SurfaceView是View的一个特殊子类,它的目的是另外提供一个线程进行绘制操作. 步骤 1.用SurfaceView进行绘制,首先要创建一个类,继承 SurfaceVi ...

  3. [AngularJS] Angular 1.3 $submitted for Form in Angular

    AngularJS 1.3 add $submitted for form, so you can use  $submitted  to track whether the submit event ...

  4. 锁Lock的概念

    并发访问同一资源的功能,需要引入锁Lock的概念,也就是说,某个时刻,当有一个访问类访问这个数据对象时,这个数据对象必须上锁Locked,用完后就立即解锁unLocked,再供其它访问类访问.

  5. HDU1004——Let the Balloon Rise

    Problem Description Contest time again! How excited it is to see balloons floating around. But to te ...

  6. 你在使用assetbundle时可能遇到的坑【转】

    在公司项目开发中,用到了assetbundle,由于是webplayer不像手机,流量限制几乎没有,所以场景都是用assetbundle打包后动态加载的,但是这个过程中,遇到不少坑: 1.Editor ...

  7. Java开发环境配置(Win7 64位系统/server 2008)

    下面以jdk1.8.0_05版本为例: 1.在用户变量里新增变量名:JAVA_HOME 变量值:D:\Java\jdk1.8.0_05 (根据实例路径变换) 2.在用户变量里新增变量名:CLASSPA ...

  8. session 防止表单重复提交

    防止表单重复提交应该现在前台做一遍,再在后台做一遍.这样双重安全而且减轻服务器负担. 代码: package flying.form; import java.io.IOException; impo ...

  9. Appium(JAVA)Windows 7系统搭建及示例运行

    Appium(JAVA)Windows 7系统搭建及示例运行 分类: Appium 2014-11-14 17:44 4323人阅读 评论(2) 收藏 举报 1.搭建Android环境 http:// ...

  10. 中文latex参考文献格式

    中文latex参考文献格式 原来英文: \begin{thebibliography}{1} \bibitem{Ben-Shimon2015RecSys} D.~Ben-Shimon, A.~Tsik ...