stm32nvic固件库分析与应用0.docx
- 文档编号:5190982
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:53
- 大小:344.10KB
stm32nvic固件库分析与应用0.docx
《stm32nvic固件库分析与应用0.docx》由会员分享,可在线阅读,更多相关《stm32nvic固件库分析与应用0.docx(53页珍藏版)》请在冰豆网上搜索。
stm32nvic固件库分析与应用0
STM32NVIC固件库分析与应用
Cortex-M3处理器和NVIC对所有优先级进行划分和处理。
所有的异常处理均在Handle模式下进行。
当出现异常时,处理器的状态被自动保存到栈中;在中断服务子程序结束之后,又会自动从栈中恢复处理器的状态。
获取中断向量和状态保存是同时进行的,这提高了进入中断处理的效率。
Cortex-M3处理器支持尾链技术,即当发生背靠背中断时,无需保存和恢复状态,而是继续执行。
Cortex-M3处理器的一下特性,提高了处理异常的效率并降低了时间的延迟。
Ø处理器状态的自动保存和恢复;
Ø中断向量表读取与处理器状态保存并行处理;
Ø支持尾链技术,当处理背靠背的中断时,不需要在2个终端服务子程序之间进行入栈和出栈操作;
Ø可动态重设优先级;
ØNVIC和Cortex-M3处理器和紧密耦合,可尽早处理中断,尤其是晚到的高优先级中断;
Ø中断的数目可以配置,1~240;
Ø为Handle和Thread模式分别提供独立的栈和访问权限等级;
Ø可屏蔽优先级以支持临界区。
一、异常的种类
Cortex-M3处理器将复位、不可屏蔽中断、外部中断、故障都统一为异常,异常有多种类型。
故障是指指令执行时由于错误的条件所导致的异常。
故障可分为同步故障和一般故障,同步故障是指当指令产生错误时就同时报告错误,而异步故障则是指当指令产生错误时无法保证同时报告错误。
下表列出了异常的类型、位置和优先级。
位置是指中断向量在中断向量表中的位置,是相对于中断限量表开始处字的偏移。
优先级的值越小,优先级越高。
表1-1异常的类型
异常类型
偏移
优先级
描述
---
0
--
复位时,加载向量表中第一项作为栈顶地址
复位
1
-3
电源开启可热复位时调用,在执行第一条指令时,优先级下降到最后,异步故障
不可屏蔽中断
2
-2
除了复位,它不能被其他任何中断终止和抢占,异步故障
硬故障
3
-1
如果故障由于优先级或可配置的故障处理程序被禁止而不能激活时,此时所有这些故障均为硬故障,同步故障
存储管理
4
可配置
存储保护单元不匹配,包括不可访问和不匹配,同步故障;也用于MPU不可用或不存在的情况,以支持默认存储映射的从不执行区域
总线故障
5
可配置
预取错误,存储器访问错误,以及其他地址/存储器相关的错误;当为精确地总线故障时是同步故障,不精确时为异步故障
应用故障
6
可配置
应用错误,如执行未定义的指令或试图进行非法的状态装换,同步故障
-
7~10
-
保留
SVCall
11
可配置
使用SVC指令进行系统服务调用,同步故障
调试监视异常
12
可配置
调试监视异常,同步故障,但只在允许时有效;如果它的优先级比当前激活的处理程序的优先级更低,则它不能激活
-
13
-
保留
PendSV
14
可配置
系统服务的可挂起请求,异步故障,只能由软件挂起
SysTick
15
可配置
用于系统嘀嗒定时器,异步故障
外部中断
≥16
可配置
由核外发出的中断,INTISR[239:
0],传递给NVIC都为异步故障
二、异常的优先级
在处理器处理异常时,优先级决定了处理器何时以及如何进行异常处理。
可以给中断设
置软件优先级以及对其进行分组。
优先级NVIC支持通过软件设置的优先级。
通过写中断优先级寄存器的PRI_N字段可以设置优先级,范围为0~255。
硬件优先级随着中断号的增加而减小,优先级0为最高优先级,255为最低优先级。
通过软件设置的优先级权限高于硬件优先级。
例如,如果设置IRQ[0]的优先级为1,IRQ[31]的优先级为0,则IRQ[31]的优先级比IRQ[0]的高。
但通过软件设置的优先级对复位、不可屏蔽中断和硬件故障没有影响。
当多个中断具有相同的优先级时,拥有最小中断号的挂起中断优先执行。
例如,IRQ[0]和IRQ[1]的优先级都为1,则IRQ[0]优先执行。
优先级分组为了更好的对大量的中断进行优先级管理和控制,NVIC支持优先级分组。
通过设定应用中断和复位中断控制寄存器的PRIGROUP字段,可以将PRI_N字段分成2个部分:
抢占优先级和次要优先级,如表2所列。
抢占优先级可以认为是优先级分组,当多个挂起的异常具有相同的抢占优先级时,次要优先级就起作用。
优先级分组和次要优先级共同作用确定了异常的优先级,当两个挂起的异常具有完全相同的优先级时,硬件位置编号低的异常优先级被激活。
表2-1优先级分组
中断优先级字段PRI_N[7:
0]
PRIGROUP[2:
0]
分割点位置
抢占优先级字段
次要优先级字段
占先优先级数量
次要优先级数量
B000
bxxxxxxx.y
[7:
1]
[0]
128
2
B001
bxxxxxx.yy
[7:
2]
[1:
0]
64
4
B010
bxxxxx.yyy
[7:
3]
[2:
0]
32
8
B011
bxxxx.yyyy
[7:
4]
[3:
0]
16
16
B100
bxxx.yyyyy
[7:
5]
[4:
0]
8
32
B101
bxx.yyyyyy.
[7:
6]
[5:
0]
4
64
B110
bx.yyyyyyy
[7]
[6:
0]
2
128
B111
b.yyyyyyyy
无
[7:
0]
0
256
优先级对异常处理的影响异常的处理异常的处理与优先级有很大的关系,异常处理中与优先级相关的操作入表2-2所列
表2-2异常处理中宇优先级相关的操作
操作
描述
抢占
当新异常比当前异常或任务有更高的优先级时,则中断当前的操作流,响应新的中断,并执行新的ISR,于是就产生了中断的嵌套。
异常产生时,处理器的状态将自动入栈保护;与此同时,相应的中断向量被取出。
保存处理器状态后,将执行ISR的第一条指令,进入了处理器流水线的执行阶段
尾链
这时用于加快中断服务处理的机制。
如果有一个新的ISR或任务比即将返回的ISR拥有更高的优先级,则处理器状态出栈就被跳过而去执行新的ISR
返回
如果没有挂起的异常,或没有比栈中的ISR优先级更高的异常,则处理去执行出栈返回操作。
ISR完成时,将自动通过操作恢复进入ISR之前的处理器状态,在恢复处理器状态的过程中,如果有一个新到的中断比当前异常或任务有更高的优先级,则抛弃当前的操作,并对并新的中断做尾链处理
迟到
这时用于加快抢断速度的机制,当这在为先前到达的中断保存处理区状态时,如果有一个更高优先级的中断到达,则处理器的选择处理更高优先级的中断,并未该中断获取向量,但状态保存不会因晚到而受到影响,因为对于两个中断来说,保存处理器状态操作都是一样的,做保存状态不被中断而是继续进行,但保存完状态之后会执行迟到的中断的ISR的第一条指令。
返回时则使用通常的尾链规则
三、NVIC异常处理
1、异常的处理
当一个异常出现以后,Cortex一M3处理器由硬件通过Dbus保存处理器状态,同时通过Ibus读取向量表中的SP,更新PC和LR,执行中断服务子程序。
为了应对堆栈操作阶段到来后的更高优先级异常,Cortex—M3支持迟到和抢占机制,以便对各种可能事件做出确定性的响应。
2、抢占的处理
抢占是一种对更高优先级异常的响应机制。
Cortex—M3异常抢占的处理过程如图1所示。
当新的更高优先级异常到来时,处理器打断当前的流程,执行更高优先级的异常操作,这样就发生了异常嵌套。
迟到是处理器用来加速抢占的一种机制。
如果一个具有更高优先级的异常在上一个异常执行压栈期间到达,则处理器保存状态的操作继续执行,因为被保存的状态对于两个异常都是一样的。
但是,NVIC马上获取的是更高优先级的异常向量地址。
这样在处理器状态保存完成后,开始执行高优先级异常的ISR。
3、异常的返回
为了应对异常返回阶段可能遇到的新的更高优先级异常,Cortex—M3支持完全基于硬件的尾链机制,简化了激活的和未决的异常之问的移动,能够在两个异常之间没有多余的状态保存和恢复指令的情况下实现back—to—back处理。
尾链发生的2个条件:
异常返回时产生了新的异常;挂起的异常的优先级比所有被压栈的异常的优先级都高。
尾链发生后,Cortex—M3处理过程如图3中尾链分支所示。
这时,Cortex—M3处理器终止正在进行的出栈操作并跳过新异常进入时的压栈操作,同时通过Ibus立即取出挂起异常的向量。
在退出前一个ISR返回操作6个周期后,开始执行尾链的ISR。
四、复位过程
Cotex-M3处理器复位时,NVIC同时复位并控制内核从复位中释放出来。
复位的过程是可完全预知的,如下表
表4-1复位的过程
动作
描述
NVIC复位,控制内核
NVIC清除其大部分寄存器,处理器处于Thrend模式,特权访问方式执行代码,堆栈使用Main栈
NVIC从复位中释放内核
NVIC从复位中释放内核
内核配置堆栈
内核从向量表开始处读取初始SP,Main_SP
内核设置PC和LR
内核从向量表偏移中读取初始PC,LR设置为0Xffffffff
运行复位程序
禁止NVIC中断,并允许NMI和硬故障
向量表
在向量表的0位置处,仅需要包含4个值:
✧栈顶地址;
✧复位程序的入口地址;
✧非屏蔽中断ISR的入口地址;
✧硬故障ISR的入口地址。
当中断允许时,不管向量表放在何处,向量总是指向所有可屏蔽异常的处理。
同样,如果使用SVC指令,SVCallISR的位置也被定位。
一个完整向量表的例子:
Unsignedinstack_base[STACK_SIZE];
VoidResetISR(viod);
VoidNmiISR(viod);
┆
ISR_VECTOR_TABLEvevtor_table_at_0
{stack_base+sizeof(stack_base),
RedetISR,
NmiISR,
FaultISR,,
1.//用于内存保护单元
0,//用于总线故障
0,//用于硬件故障
0,0,0,0//保留
SVCallISR,
0,//用于调试监控程序
0,//保留
0,//用于可挂起的服务请求
0,//用于SysTick
//以下向量用于外部中断
Timer1ISR,,
GpioInISR
GpioOoutISR,
I2Cisr
}
五、中断和事件
外部中断/事件控制器(EXTI)由19个产生事件/中断要求的边沿检测器组成。
每个输入线可以独立地配合输入类型和对应的触发事件。
每个输入线都可以被独立地屏蔽,由挂起寄存器保持着状态线的中断要求。
EXTI控制器的结构图如图5-1所示,其主要特性如下:
Ø每个中断/事件都有独立的触发和屏蔽;
Ø每个中断线都有专用的状态线;
Ø支持多达19个中断/事件请求;
Ø检测脉冲宽度低于APB2时钟宽度的外部信号。
图5-1外部中断/事件控制器框图
如果要产生外部中断,那么中断线必须事先配置好并激活。
配置内容包括:
根据需要的边沿检测设置2个触发寄存器、在中断屏蔽寄存器的相应位写1以允许中断请求。
当外部中断线出现相应的边沿信号时,将产生一个中断请求,对应的挂起位也随着置1。
通过写1到挂起寄存器,可以清除该中断请求。
如果要产生事件请求,事件请求线必须事先配置好并激活。
配置内容包括:
根据需要的边沿检测设置2个触发寄存器、在中断屏蔽寄存器的相应位写1以允许中断请求。
当事件请求线上出现相应的边沿信号时,将产生一个事件请求脉冲,对应的挂起位不置1。
也可以通过软件在中断/事件寄存器写1,来产生一个中断/事件请求。
下面具体介绍如何配置软硬中断/事件请求。
(1)硬件中断选择
通过下面的过程,可以配置19根线为中断源:
①配置19根中断线的屏蔽位(EXTI_IMR);
②配置所选中断线的触发选择位;
③配置那些控制映射到外部中断/事件控制器(EXTI)的NVIC中断通道的允许和屏蔽位,使得19根中断线中的请求可以被正确地响应。
图5-2通用I/O与外部中断的映射关系
(2)硬件事件选择
通过下面的过程,可以配置19根线为事件源:
①配置19根事件请求线的屏蔽位;
②配置事件线的触发选择位
(3)软件中断/事件选择
可以配置19根线为软件中断/事件请求线,
通过以下过程可以产生软件中断:
1配置19根中断/事件请求线的屏蔽位;
2设置软件中断请求寄存器的请求。
(4)外部中断/事件线路映射
80个通用I/O端口可以用图5-2方式映射到
16根外部中断/事件线上。
另外3种其他的外部中断/事件控制器的
连接如下:
1EXTI线16连接到PVD输出;
2EXTI线17连接到RTC闹钟事件;
3EXTI线18连接到USB唤醒事件。
Cortex-M3可以通过外部或内部事件来唤醒
内核,利用以上19根中断/事件请求线,可
以配置任何外部I/O端口、RTC闹钟和USB
唤醒事件来唤醒CPU。
(5)相关的功能寄存器
1、中断屏蔽寄存器(EXTI_IMB)
该寄存器用来设置是否屏蔽中断请求线上的中断请求,
31302928272625242322212019181716
Reseved
WR18
WR17
WR16
rwrwrw
1514131211109876543210
WR15
WR14
WR13
WR12
WR11
WR10
WR9
WR8
WR7
WR6
WR5
WR4
WR3
WR2
WR1
WR0
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
图5-3EXTI_IMR寄存器
表5-1EXTI_IMR寄存器的位域定义
位
定义
31:
19
保留,必须始终保持为复位状态(0)
18:
0
MRx:
线x上的中断屏蔽
0:
线x上的中断请求被屏蔽;1:
线x上的中断请求不被屏蔽
2、事件屏蔽寄存器(EXTI_EMR)
该寄存器用来设置是否屏蔽事件请求线上的中断请求,
31302928272625242322212019181716
Reseved
WR18
WR17
WR16
rwrwrw
1514131211109876543210
WR15
WR14
WR13
WR12
WR11
WR10
WR9
WR8
WR7
WR6
WR5
WR4
WR3
WR2
WR1
WR0
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
图5-4EXTI_EMR寄存器
表5-2EXTI_EMR寄存器的位域定义
位
定义
31:
19
保留,必须始终保持为复位状态(0)
18:
0
MRx:
线x上的事件屏蔽
0:
线x上的事件请求被屏蔽;1:
线x上的事件请求不被屏蔽
3、上升沿触发选择寄存器(EXTI_RTSR)
该寄存器用来设置是否上升沿触发中断和事件
31302928272625242322212019181716
Reseved
TR18
TR17
TR16
rwrwrw
1514131211109876543210
TR15
TR14
TR13
TR12
TR11
TR10
TR9
TR8
TR7
TR6
TR5
TR4
TR3
TR2
TR1
TR0
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
图5-5EXTI_RTSR寄存器
表5-3EXTI_RTSR寄存器的位域定义
位
定义
31:
19
保留,必须始终保持为复位状态(0)
18:
0
TRx:
线x上的上升沿触发事件配置位
0:
禁止线x上的上升沿触发;1:
允许线x上的上升沿触发
4、下降沿触发选择寄存器(EXTI_FTSR)
该寄存器用来设置是否上升沿触发中断和事件
31302928272625242322212019181716
Reseved
TR18
TR17
TR16
rwrwrw
1514131211109876543210
TR15
TR14
TR13
TR12
TR11
TR10
TR9
TR8
TR7
TR6
TR5
TR4
TR3
TR2
TR1
TR0
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
图5-6EXTI_FTSR寄存器
表5-4EXTI_FTSR寄存器的位域定义
位
定义
31:
19
保留,必须始终保持为复位状态(0)
18:
0
TRx:
线x上的下降沿触发事件配置位
0:
禁止线x上的下降沿触发;1:
允许线x上的下降沿触发
5、软件中断事件寄存器(EXTI_SWIER)
该寄存器用来软件触发中断和事件
31302928272625242322212019181716
Reseved
SWIER18
SWIER17
SWIER16
rwrwrw
1514131211109876543210
SWIER15
SWIER14
SWIER13
SWIER12
SWIER11
SWIER10
SWIER9
SWIER8
SWIER7
SWIER6
SWIER5
SWIER4
SWIER3
SWIER2
SWIER1
SWIER0
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
图5-7EXTI_SWIER寄存器
表5-5EXTI_SWIER寄存器的位域定义
位
定义
31:
19
保留,必须始终保持为复位状态(0)
18:
0
SWIERx:
线x上的软件中断
该位为0时,写1将设置EXTL-PR中相应的挂起位。
如果在EXTI-IMR和EXTI-EMR中允许产生改中断,则此时将产生一个中断。
通过清除EXTL-PR的对应位,可以清除该位为0
6、挂起寄存器(EXTI_PR)
该寄存器用来保存中断/事件请求线上是否有请求
31302928272625242322212019181716
Reseved
PR18
PR17
PR16
rc_w1rc_w1rc_w1
1514131211109876543210
PR15
PR14
PR13
PR12
PR11
PR10
PR9
PR8
PR7
PR6
PR5
PR4
PR3
PR2
PR1
PR0
rc_w1rc_w1rc_w1rc_w1rc_w1rc_w1rc_w1rc_w1rc_w1rc_w1rc_w1rc_w1rc_w1rc_w1rc_w1rc_w1
图5-8EXTI_PR寄存器
表5-6EXTI_PR寄存器的位域定义
位
定义
31:
19
保留,必须始终保持为复位状态(0)
18:
0
PRx:
挂起位
当外部中断线上发生了选择的边沿事件,该位置1。
在该位写1可以清除它,也可以通过改变边沿检测的极性来清除
六、NVIC库函数
函数使用:
6.1函数NVIC_PriorityGroupConfig
函数名
NVIC_PriorityGroupConfig
函数原形
voidNVIC_PriorityGroupConfig(u32NVIC_PriorityGroup)
功能描述
设置优先级分组:
先占优先级和从优先级
输入参数
NVIC_PriorityGroup:
优先级分组位长度
参阅Section:
NVIC_PriorityGroup查阅更多该参数允许取值范围
输出参数
无
返回值
无
先决条件
优先级分组只能设置一次
被调用函数
无
NVIC_PriorityGroup
该参数设置优先级分组位长度
下表给出了由函数NVIC_PriorityGroupConfig设置的先占优先级和从优先级可取的值
NVIC_PriorityGroup
描述
NVIC_PriorityGroup_0
先占优先级0位从优先级4位
NVIC_PriorityGroup_1
先占优先级1位从优先级3位
NVIC_PriorityGroup_2
先占优先级2位从优先级2位
NVIC_PriorityGroup_3
先占优先级3位从优先级1位
NVIC_PriorityGroup_4
先占优先级4位从优先级0位
1.选中NVIC_PriorityGroup_0,则参数NVIC_IRQChannelPreemptionPriority对中断通道的设置不产生影响。
2.选中NVIC_PriorityGroup_4,则参数NVIC_IRQChannelSubPriority对中断通道的设置不产生影响。
NVIC_IRQChannelCmd
该参数指定了在成员NVIC_IRQChannel中定义的IRQ通道被使能还是失能。
这个参数取值为ENABLE或者DISABLE。
例:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//抢占优先级字段为1,次要优先级字段为3
6.2函数NVIC_Init
函数名
NVIC_Init
函数原形
voidNVIC_Init(NVIC_InitTypeDef*NVIC_InitStruct)
功能描述
根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
输入参数
NVIC_InitStruct:
指向结构NVIC_InitTypeDef的指针,包含了外设GPIO的配置信息
输出参数
无
返回值
无
先决条件
无
被调用函数
无
NVIC_InitTypeDefstructure
NVIC_InitTypeDef定义于文件“stm32f10x_nvic.h”:
typedefstruct
{
u8NVIC_IRQChannel;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- stm32nvic 固件库 分析 应用