博客
关于我
【STM32H7教程】第21章 STM32H7的NVIC中断分组和配置(重要)
阅读量:512 次
发布时间:2019-03-07

本文共 2029 字,大约阅读时间需要 6 分钟。

STM32H7嵌入式系统开发教程:NVIC中断优先级配置

本章节将详细讲解STM32H7中的NVIC(Nested Vectored Interrupt Controller)中断优先级配置,帮助开发者全面理解和掌握这一重要知识点。

21.1 NVIC基础知识

NVIC,全称Nested Vectored Interrupt Controller,即嵌套向量中断控制器,是用于管理和配置多个中断的高级功能芯片。对于STM32H7系列,其中断的优先级由一个8位的寄存器(NVIC_PRI)控制,这8位寄存器的使用方式与芯片型号有关。

在实际应用中,芯片厂商根据具体实现进行了优化。例如,STM32F1xx、F4xx和STM32H7系列中,只使用NVIC_PRI的高四位(7:4位),因此能够配置的中断优先级范围是0至15级。

中断优先级的关键知识点

  • 优先级分组、抢占优先级与子优先级

    NVIC支持抢占优先级和子优先级的配置。这意味着高抢占优先级的中断可以在低抢占优先级中断正在执行时强行中断并占用资源。子优先级用于区分同一优先级的中断请求,子优先级高的中断优先执行。

  • 默认配置

    系统上电复位后,默认使用优先级分组0,即没有抢占优先级,只有子优先级。

  • 默认中断响应模式

    -具有高抢占优先级的中断可以在低抢占优先级的中断服务程序运行期间响应。
    -在抢占优先级相同的情况下,子优先级高的中断优先响应。

  • 特殊中断类型

    例如,系统中断(如PendSV、SVC、SysTick)与外设中的普通中断在同一个NVIC中设置,不会占用额外的NVIC资源。

  • 注意事项

    • 避免混淆NVIC优先级和子优先级的概念,
    • 精准掌握抢占优先级数值越小,优先级级别越高的原则,
    • 注意系统默认的中断响应模式,必要时根据实际需求进行调整。

    21.2 常用NVIC API

    在实际开发中,我们主要通过两个函数来配置和管理NVIC中断:

    21.2.1 HAL_NVIC_SetPriority函数

    函数原型

    void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)

    功能描述

    通过该函数可以设置中断的抢占优先级和子优先级。

    参数说明

  • IRQn: 中断号,定义在IRQn_Type枚举类型中。
  • PreemptPriority: 抢占优先级,可取0-15范围内的值。
  • SubPriority: 子优先级,取值范围为0-15。
  • 使用示例

    // 设置ADC中断的抢占优先级为1,子优先级为0HAL_NVIC_SetPriority(ADC_IRQn, 1, 0);

    21.2.2 HAL_NVIC_EnableIRQ函数

    函数原型

    void HAL_NVIC_EnableIRQ(IRQn_Type IRQn)

    功能描述

    通过该函数可以使能指定中断的NVIC中断响应功能。

    注意事项

    在调用HAL_NVIC_EnableIRQ函数前,必须先调用NVIC_PriorityGroupConfig函数以确保优先级分组设置正确。

    使用示例

    // 使能ADC中断响应HAL_NVIC_EnableIRQ(ADC_IRQn);

    21.3 如何查看实际优先级配置

    在开发过程中,为了确保中断优先级设置正确,可以使用Keil’s C-51 Prophet Hermes或IAR Embedded Workbench等开发工具的调试功能。

    操作步骤:

  • 连接开发板,并使用调试工具进行全速运行。
  • 依次点击** Tools > Config View > Sahajinder --> NVIC**。
  • 可以看到外设优先级配置情况,例如滴答定时器(SysTick)的优先级设置为240(表示优先级为4级)。
  • 21.4 开关中断配置

    在STM32H7开发中,开关中断的处理采用分开控制器的方法。

    通过查看 BSP文件中的bsp.h,可以找到开关中断相关的宏定义:

    // 开关中断控制定义  #define ENABLE_INT()     __set_PRIMASK(0)    // 允许全局中断请求  #define DISABLE_INT()    __set_PRIMASK(1)    // 禁止全局中断请求

    其中,__set_PRIMASK(0)__set_PRIMASK(1)分别用于控制是否允许中断进入程序。

    21.5 总结

    通过本章的学习,我们掌握了完整的NVIC中断优先级配置方法。特别需要注意的是:

  • 抢占优先级越低,中断响应越高;
  • 子优先级用于区分同优先级中断的响应顺序;
  • 开关中断的处理需要分开控制器实现。
  • 对于实际开发,建议采用MDK调试工具查看中断优先级配置,确保中断响应正确。同时,对于复杂的嵌套中断场景,可以根据实际需求合理配置抢占优先级和子优先级,以保证系统的实时性和稳定性。

    转载地址:http://aunjz.baihongyu.com/

    你可能感兴趣的文章
    Luogu2973:[USACO10HOL]赶小猪
    查看>>
    mabatis 中出现< 以及> 代表什么意思?
    查看>>
    Mac book pro打开docker出现The data couldn’t be read because it is missing
    查看>>
    MAC M1大数据0-1成神篇-25 hadoop高可用搭建
    查看>>
    mac mysql 进程_Mac平台下启动MySQL到完全终止MySQL----终端八步走
    查看>>
    Mac OS 12.0.1 如何安装柯美287打印机驱动,刷卡打印
    查看>>
    MangoDB4.0版本的安装与配置
    查看>>
    Manjaro 24.1 “Xahea” 发布!具有 KDE Plasma 6.1.5、GNOME 46 和最新的内核增强功能
    查看>>
    mapping文件目录生成修改
    查看>>
    MapReduce程序依赖的jar包
    查看>>
    mariadb multi-source replication(mariadb多主复制)
    查看>>
    MariaDB的简单使用
    查看>>
    MaterialForm对tab页进行隐藏
    查看>>
    Member var and Static var.
    查看>>
    memcached高速缓存学习笔记001---memcached介绍和安装以及基本使用
    查看>>
    memcached高速缓存学习笔记003---利用JAVA程序操作memcached crud操作
    查看>>
    Memcached:Node.js 高性能缓存解决方案
    查看>>
    memcache、redis原理对比
    查看>>
    memset初始化高维数组为-1/0
    查看>>
    Metasploit CGI网关接口渗透测试实战
    查看>>