基于ARM中断体系的STM32中断NVIC优先级管理机制

前言:

        STM32的中断体系非常强大,每个片上外设都可以产生中断。因此在掌握GPIO普通输入输出的基础上,想要学习其他外设的使用,必然离不开中断的理论知识。

        本文以F407芯片为例,系统异常有10个,外部中断有82个 --- 详细请查看《STM32F4xx中文查看手册》第10章10.1.3的中断向量表。

一  优先级

ARM中断优先级分类的3个类型:

抢占优先级:抢占优先级高的中断函数可以抢断优先级低的中断函数
响应优先级:若抢占优先级相同,则同一时刻触发下,比较响应优先级,其不具有抢断特性
自然优先级:若抢占和响应优先级都相同下,则遵循固定的自然优先级

优先级比较顺序:

抢占优先级 > 响应优先级 > 自然优先级

二  优先级分组机制

NVIC:

        在ARM中断体系中,NVIC嵌套向量中断控制器是一个内核外设,它控制着整个芯片中断的相关功能,如我们常设置的中断优先级管理系统。

NVIC的优先级分组机制:

        由内核外设SCB应用中断和复位控制寄存器中的PRIGROUP区来配置每个中断源的8位中断优先级寄存器PRI_N的位值,来设置抢占优先级和响应优先级不同的区间范围。

该表在《Cortex-M3技术参考手册》--- 书签"5.3.2优先级分组”可查

中断分组总结:

        由PRIGROUP[10:8] 3位决定7个优先级分组,来将PRI_N[7:0] 8位抢占优先级区(x)和响应优先级区(y).

三  STM32中的中断体系

STM32中断体系说明:

        ST公司在设计芯片时对ARM中断体系中的NVIC进行了裁剪,PRI_N只用了高4位,分组沿用了ARM中断体系中的第3,4,5,6,7号分组。
 

《STM32F3与F4系列Cortex M4内核编程手册》---书签“4.4.5”可查

组3:抢占优先级占4位 级别范围 0~15,响应优先级占0位
组4:抢占优先级占3位 级别范围 0~7,  响应优先级占1位 级别范围 0~1
以此类推......
       

ARM内核函数说明:

        ARM提供的固件库core_cm4.h中有NVIC的相关函数,可以用这些函数进行NVIC优先级配置,这些函数遵循CMSI规则,只要是使用Cortex-M4,其配置方法和作用是完全相同的。同理,该ARM中断体系在M0,M3,M4,M7---M系统是通用的。

四  使用内核函数配置优先级

在core_cm4.h文件通过Ctrl + F搜索,可以找到所有关于NVIC的函数

①Ctrl + F:NVIC 找到优先级分组和优先级配置的函数
②Ctrl + F:IRQn 找到中断源名称
③Ctrl + F:IRQH 找到中断服务函数名称

1.NVIC管理中断源优先级分组设置:

中断优先级分组函数:

void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) 
//位于core_cm4.h文件1435行

该函数用来决定抢占优先级的位数,形参即为设置分组组号(写入值为3,4,5,6,7)
根据需要设置的抢占优先级位数有以下公式:
优先级分组写入值 = 7 - 抢占优先级位数
一般该函数会放在主函数执行
注意:一个工程里只需要一个中断分组函数,所有中断源共用一个优先级分组

如该代码,设置5号优先级分组,在PRI_N中,抢占优先级占2位 级别范围 0~3,  响应优先级也占2位 级别范围 0~3。

2.计数优先级编码值

计算PRI_N值函数

uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)
//位于core_cm4.h文件1592行

将优先级分组写入值,抢占优先级值,响应优先级值写入形参,该函数会计算成一个整形数据返回
--- PRI_N编码值 0~15(4bit)

在配置某个中断外设初始化函数中,定一个变量pri来接收该函数返回的PRI_N编码值

3.具体某个中断源的优先级设置

设置某个中断源优先级函数

void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
//位于core_cm4.h文件1550行

根据需要配置的中断源名称写入第一个参数,将前面得到的pri值写入第二个参数

如该代码,配置USART1的中断优先级

4.开启中断源的中断使能

使能NVIC中断源通道函数

void NVIC_EnableIRQ(IRQn_Type IRQn)
//位于core_cm4.h文件1467行

写入对应的中断源名称,NVIC就响应片上外设中断源的信号

开启中断使能后,当该中断源的某个中断标志位置1就会进入中断服务函数

五  中断服务函数

中断服务函数说明:

中断服务函数具有固定名字固定格式,不需要调用,无参无返
中断服务函数本质是一个函数,此函数用于执行紧急事件,而且不会卡主程序
(避免在中断服务函数中使用大量延时函数和循环函数)

中断服务函数格式:

void 中断服务函数名字(void)

{
        //清除标志位

        //处理紧急事件

}

  • 29
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值