stm32nvic固件库分析与应用0Word文档下载推荐.docx

上传人:b****4 文档编号:18162805 上传时间:2022-12-13 格式:DOCX 页数:53 大小:344.10KB
下载 相关 举报
stm32nvic固件库分析与应用0Word文档下载推荐.docx_第1页
第1页 / 共53页
stm32nvic固件库分析与应用0Word文档下载推荐.docx_第2页
第2页 / 共53页
stm32nvic固件库分析与应用0Word文档下载推荐.docx_第3页
第3页 / 共53页
stm32nvic固件库分析与应用0Word文档下载推荐.docx_第4页
第4页 / 共53页
stm32nvic固件库分析与应用0Word文档下载推荐.docx_第5页
第5页 / 共53页
点击查看更多>>
下载资源
资源描述

stm32nvic固件库分析与应用0Word文档下载推荐.docx

《stm32nvic固件库分析与应用0Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《stm32nvic固件库分析与应用0Word文档下载推荐.docx(53页珍藏版)》请在冰豆网上搜索。

stm32nvic固件库分析与应用0Word文档下载推荐.docx

存储管理

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:

分割点位置

抢占优先级字段

次要优先级字段

占先优先级数量

次要优先级数量

B000

bxxxxxxx.y

[7:

1]

[0]

128

B001

bxxxxxx.yy

2]

[1:

64

B010

bxxxxx.yyy

3]

[2:

32

8

B011

bxxxx.yyyy

4]

[3:

16

B100

bxxx.yyyyy

5]

[4:

B101

bxx.yyyyyy.

6]

[5:

B110

bx.yyyyyyy

[7]

[6:

B111

b.yyyyyyyy

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从复位中释放内核

内核配置堆栈

内核从向量表开始处读取初始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到挂起寄存器,可以清除该中断请求。

如果要产生事件请求,事件请求线必须事先配置好并激活。

当事件请求线上出现相应的边沿信号时,将产生一个事件请求脉冲,对应的挂起位不置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:

MRx:

线x上的中断屏蔽

0:

线x上的中断请求被屏蔽;

1:

线x上的中断请求不被屏蔽

2、事件屏蔽寄存器(EXTI_EMR)

该寄存器用来设置是否屏蔽事件请求线上的中断请求,

rwrwrw

rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

图5-4EXTI_EMR寄存器

表5-2EXTI_EMR寄存器的位域定义

线x上的事件屏蔽

线x上的事件请求被屏蔽;

线x上的事件请求不被屏蔽

3、上升沿触发选择寄存器(EXTI_RTSR)

该寄存器用来设置是否上升沿触发中断和事件

TR18

TR17

TR16

TR15

TR14

TR13

TR12

TR11

TR10

TR9

TR8

TR7

TR6

TR5

TR4

TR3

TR2

TR1

TR0

图5-5EXTI_RTSR寄存器

表5-3EXTI_RTSR寄存器的位域定义

TRx:

线x上的上升沿触发事件配置位

禁止线x上的上升沿触发;

允许线x上的上升沿触发

4、下降沿触发选择寄存器(EXTI_FTSR)

图5-6EXTI_FTSR寄存器

表5-4EXTI_FTSR寄存器的位域定义

线x上的下降沿触发事件配置位

禁止线x上的下降沿触发;

允许线x上的下降沿触发

5、软件中断事件寄存器(EXTI_SWIER)

该寄存器用来软件触发中断和事件

31302928272625242322212019181716

SWIER18

SWIER17

SWIER16

1514131211109876543210

SWIER15

SWIER14

SWIER13

SWIER12

SWIER11

SWIER10

SWIER9

SWIER8

SWIER7

SWIER6

SWIER5

SWIER4

SWIER3

SWIER2

SWIER1

SWIER0

图5-7EXTI_SWIER寄存器

表5-5EXTI_SWIER寄存器的位域定义

SWIERx:

线x上的软件中断

该位为0时,写1将设置EXTL-PR中相应的挂起位。

如果在EXTI-IMR和EXTI-EMR中允许产生改中断,则此时将产生一个中断。

通过清除EXTL-PR的对应位,可以清除该位为0

6、挂起寄存器(EXTI_PR)

该寄存器用来保存中断/事件请求线上是否有请求

PR18

PR17

PR16

rc_w1rc_w1rc_w1

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寄存器的位域定义

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;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1