博客
关于我
【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/

    你可能感兴趣的文章
    mysql 判断表字段是否存在,然后修改
    查看>>
    MySQL 到底能不能放到 Docker 里跑?
    查看>>
    mysql 前缀索引 命令_11 | Mysql怎么给字符串字段加索引?
    查看>>
    mysql 协议的退出命令包及解析
    查看>>
    mysql 取表中分组之后最新一条数据 分组最新数据 分组取最新数据 分组数据 获取每个分类的最新数据
    查看>>
    mysql 四种存储引擎
    查看>>
    MySQL 基础模块的面试题总结
    查看>>
    MySQL 备份 Xtrabackup
    查看>>
    mysql 多个表关联查询查询时间长的问题
    查看>>
    mySQL 多个表求多个count
    查看>>
    mysql 多字段删除重复数据,保留最小id数据
    查看>>
    MySQL 多表联合查询:UNION 和 JOIN 分析
    查看>>
    MySQL 大数据量快速插入方法和语句优化
    查看>>
    mysql 如何给SQL添加索引
    查看>>
    mysql 字段区分大小写
    查看>>
    mysql 字段合并问题(group_concat)
    查看>>
    mysql 字段类型类型
    查看>>
    MySQL 字符串截取函数,字段截取,字符串截取
    查看>>
    MySQL 存储引擎
    查看>>
    mysql 存储过程 注入_mysql 视图 事务 存储过程 SQL注入
    查看>>