• STM32 中断应用概览


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

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

    NVIC 简介
    在讲如何配置中断优先级之前,我们需要先了解下 NVICNVIC 是嵌套向量中断控制
    器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。但是
    各个芯片厂商在设计芯片的时候会对 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 结构体,配置中断优先级分组,设置抢占优先级和子优
    先级,使能中断请求

    2NVIC_IRQChannelPreemptionPriority:抢占优先级,具体的值要根据优先级分组来
    确定,具体参考表格 16 优先级分组真值表 。
    3NVIC_IRQChannelSubPriority:子优先级,具体的值要根据优先级分组来确定,具
    体参考表格 16 优先级分组真值表 。
    4NVIC_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*/

  • 相关阅读:
    Fastjson
    react 使用createContext、Consumer 及 useContext 、Class.contextType父子组件共享数据
    使用useReducer 实现 todoList
    react中 useMemo与useCallback使用
    react17 函数组件 使用 better-scroll2.0 封装方法 及 使用
    react 执行 yarn build ,无法直接打开dist文件下的index
    react-redux 持久数据存储
    document.body.removeChild 获取到 symbol 标签
    react嵌套路由,并设置默认子路由
    Vagrant环境下配置node_exporter、mysqld_exporter、prometheus、grafana
  • 原文地址:https://www.cnblogs.com/yangguang-it/p/6861610.html
Copyright © 2020-2023  润新知