NVIC中断管理

NVIC中断管理使用中断之前,第一步要了解的是其优先级管理,下面总结一下STM32NVIC的中断优先级管理。(正点原子系列)以smt32f103系列为例,其具有16个内核中断和60个可屏蔽中断。下面介绍其库函数的开发:MDK内与NVIC相关的寄存器包含在结构体中,通过创建结构体,配置其内部组成员也就是寄存器,来配置NVIC各个配置。先介绍其结构体的内部内容:在结构体内有介绍!中断配置寄存器[]内的…

大家好,又见面了,我是你们的朋友全栈君。

使用中断之前,第一步要了解的是其优先级管理,下面总结一下STM32 NVIC的中断优先级管理。(正点原子系列)

以smt32f103系列为例,其具有16个内核中断和60个可屏蔽中断。
下面介绍其库函数的开发:

MDK内与NVIC相关的寄存器包含在结构体中,通过创建结构体,配置其内部组成员也就是寄存器,来配置NVIC各个配置。

先介绍其结构体的内部内容:在结构体内有介绍!

中断配置寄存器

[ ]内的8表示有8个这样的寄存器!

typedef struct
{
//[ ]内8表示有8个寄存器,每个都是32位,总计256个位,每个位控制一个中断,最高支持256个!
// offest 表示地址
  __IO uint32_t ISER[8];                      /*!< Offset: 0x000  打开中断的使能寄存器           */
       uint32_t RESERVED0[24];                                   
  __IO uint32_t ICER[8];                      /*!< Offset: 0x080  清除的中断使能的寄存器         */
       uint32_t RSERVED1[24];                                    
  __IO uint32_t ISPR[8];                      /*!< Offset: 0x100   把中断挂起的寄存器(就是暂停现在的中断放到一边,执行同级或者更高的中断)         */
       uint32_t RESERVED2[24];                                   
  __IO uint32_t ICPR[8];                      /*!< Offset: 0x180  关闭中断挂起        */
       uint32_t RESERVED3[24];                                   
  __IO uint32_t IABR[8];                      /*!< Offset: 0x200  中断标志位,对应位为1则表示对应中断正在执行,为0则未执行,中断执行完成后自动置0        */
       uint32_t RESERVED4[56];                                   
  __IO uint8_t  IP[240];                      /*!< Offset: 0x300  240个8位寄存器组成,配置240个可屏蔽中断,8位长度,只使用了高4位,用来配置抢占优先级和子优先级,两者分别占一定的长度来配置,具体长度由SCB->AIRCR的中断分组来确定 */
       uint32_t RESERVED5[644];                                  
  __O  uint32_t STIR;                         /*!< Offset: 0xE00  Software Trigger Interrupt Register     */
}  NVIC_Type;

中断分组:

将中断分为5组,每组有对应的抢占优先级和子优先级。
由寄存器SCB->AIRCR寄存器的位8-10来定义的!具体配置参考下图:
在这里插入图片描述
关于优先级,注意一下两点:
这里需要注意两点:第一,如果个中断的抢占优先级和响应都是样话则看哪个中断先发生就先执行;第二,高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。而抢占优先级相同的中断,高优先级的响应优先级不可以打断低响应优先级的中断。

以上就是原理的一点总结了,下面到使用中断时库函数的配置:

配置中断三步走:
第一!分组配置优先级在AIRCR中的分配位数!
第二!配置结构体内需要用到的成员 、什么中断 、什么抢占优先级、 什么子优先级 、是否使能 !
第三!将结构体首地址传入,装载配置!

分组

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
{
  /* Check the parameters */
  assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
  
  /* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */
  SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
}
//IS_NVIC_PRIORITY_GROUP详解
#define IS_NVIC_PRIORITY_GROUP(GROUP) (((GROUP) == NVIC_PriorityGroup_0) || \
                                       ((GROUP) == NVIC_PriorityGroup_1) || \
                                       ((GROUP) == NVIC_PriorityGroup_2) || \
                                       ((GROUP) == NVIC_PriorityGroup_3) || \
                                       ((GROUP) == NVIC_PriorityGroup_4))

中断的分组直接通过void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)传参传入NVIC_PriorityGroup_X对应的值就行。

配置

通过结构体配置(如下)
typedef struct
{

uint8_t NVIC_IRQChannel; /* 定义初始化的是哪个中断,这个我们可以在 stm32f10x.h 中找到 每个中断对应的名字。例如 USART1_IRQn*/

uint8_t NVIC_IRQChannelPreemptionPriority; /定义这个中断的抢占优先级别。/

uint8_t NVIC_IRQChannelSubPriority; /* 定义这个中断的子优先级别。*/

FunctionalState NVIC_IRQChannelCmd; /*该中断是否使能 */
} NVIC_InitTypeDef;

传入参数

通过下面函数传址,把配置的结构体传入寄存器中,
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)

样例:

比如我们要使能串口 1 的中断,同时设置抢占优先级为 1,子优先级位 2,初始化的方法是(分组省去):

NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //串口 1 中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ; // 抢占优先级为 1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; // 子优先级位 2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道使能
NVIC_Init(&NVIC_InitStructure); //根据上面指定的参数初始化 NVIC 寄存器

OVER!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/140696.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 运维架构

    运维架构运维架构1、运维团队配置运维团队分为:应用运维、系统运维、运维开发、监控运维、DBA团队和安全团队团队分工:应用运维:负责支持线上业务,各自会负责对应的业务线,主要职能是保证线上业务稳定性和同开发共

    2022年7月1日
    24
  • 级数敛散性

    级数敛散性

    2021年9月16日
    42
  • 浅析Java中volatile关键字及其作用

    浅析Java中volatile关键字及其作用在Java多线程中如何保证线程的安全性?那我们可以使用Synchronized同步锁来给需要多个线程访问的代码块加锁以保证线程安全性。

    2022年5月31日
    39
  • 面试 SQL整理 常见的SQL面试题:经典50题

    面试 SQL整理 常见的SQL面试题:经典50题目录​SQL基础知识整理:常见的SQL面试题:经典50题三、50道面试题2.汇总统计分组分析3.复杂查询sql面试题:topN问题4.多表查询【面试题类型总结】这类题目属于行列如何互换,解题思路如下:其他面试题:SQL基础知识整理:select查询结果如:[学号,平均成绩:组函数avg(成绩)]from从哪张表中查找数…

    2022年5月20日
    30
  • 如何理解相位式激光测距公式

    如何理解相位式激光测距公式参考链接1:相位式激光测距法中相位产生原理参考链接2:相位法激光测距原理及算法详解公式t=Δφ/w在N=0时才成立,可以用多尺测量方法。如果单尺测量,精度较小。选择高频率,则测程变小。所以,综合使用多尺测量。2L=c/f可以用于计算精尺和粗尺频率。…

    2022年6月2日
    40
  • 爆肝六万字整理的python基础,快速入门python的首选

    爆肝六万字整理的python基础,快速入门python的首选Python基础大全1环境安装学习python开发,首先要学会安装Python环境,我一般使用Anaconda+Pycharm作为开发环境。Anaconda是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。因为包含了大量的科学包,Anaconda的下载文件比较大(约531MB),如果觉得安装包太大可以使用Miniconda。关于环境的安装我已经写了多篇文章,比如:Ubuntu20.04的开发环境搭建:(4条消息)Ubuntu20.04安装A

    2022年6月25日
    17

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号