STM32关于NVIC寄存器方向理解

五、NVIC


       中断向量嵌套控制器是用来管理所有中断和事件的,包括中断的使能和除能,中断的优先级。这个是属于内核的东西,所以ST的参考手册上对它的描述较少,但他又是十分重要的东西,要了解它就要看ARM的《Cortex™-M4 Devices Generic User Guide》。

 

相关寄存器

译自《Cortex™-M4 Devices Generic UserGuide》,若有错误,请以原文为准。

 

中断使能寄存器NVIC_ISER[8]

中断使能寄存器共有8个,ISER[0]设置0~31号中断的使能,ISER[1]设置32~63号中断的使能,如此类推。以下以ISER[0]为例:


[31:0] SETENA中断设置使能位。
写:
0 =无影响
1 =使能中断。
读:
0 =中断是禁止的
1=中断已经被使能

如果要使能0号中断,就向该寄存器的0位写1,如果要使能38号中断,就向NVIC_ISER[1]的6位写1,如此类推,至于哪个中断对应哪个中断号,请参见参考手册《RM0090 Reference manual》中的第9章Table 30. Vector table的Position一列。

 

 

 

中断除能寄存器NVIC_ICER[8]

中断除能寄存器共有8个,ICER[0]设置0~31号中断除能,ICER[1]设置32~63号中断的使能,如此类推。以下以ICER[0]为例:


[31:0] SETENA中断设置使能位。
写:
0 =无影响
1 =除能中断。
读:
0 =中断是禁止的
1=中断已经被使能

以下寄存器均为8个,仅以***R[0]为例

 

 

 

中断挂起设置寄存器NVIC_ISPR[8]


[31:0]SETPEND中断挂起设置位。
写:
0 =无影响
1 =改变中断状态为挂起。
读:
0 =中断没有挂起
1 =中断正在等待处理。

 

 

 

解除中断挂起寄存器NVIC_ICPR[8]


[31:0] CLRPEND中断清除挂起位。
写:
0 =无影响
1 =删除中断的挂起状态。
读:
0 =没有挂起的中断
1 =中断正在等待处理。

 

 

 

中断激活位寄存器NVIC_IABR[8]


[31:0]中断活跃的标志:
0 =中断不活跃
1 =中断活跃。

如果相应的中断的状态是作为一个活跃的或活跃和正被挂起的,读该位将会读出1。

 

 

 

 

中断优先级寄存器NVIC_IPR[60]


       中断优先级寄存器为60个32位寄存器,st的结构体中用了240个8位的字节数组NVIC->IP[240]来映射,每一个对应一个中断的优先级。

ARM的中断优先级分两种,抢占优先级和响应优先级。

        具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。

         当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。

        中断优先级分组就是把优先级寄存器分割,分开哪几位是响应优先级,哪几位是抢占优先级。至于怎样设置分组,就要看一个不属于NVIC的寄存器了。

 

 

 

应用中断和复位控制寄存器SCB_AIRCR


在这里我们需要看的是[31:16]位和[10:8]位,[31:16]位是识别码,用以保护此寄存器不会被意外修改,[10:8]位就是中断优先级分组的设置位。

[31:16]

写:VECTKEYSTAT
读:VECTKEY
RW注册键:
读为0xFA05
写入时,要写0x05FA到 VECTKEY,否则写入将被忽略。

 

[10:8]中断优先级

每一个ARM的M4中断优先级设计为可编程的8位,具体到stm32f4就只留给用户4位共16级的可编程优先级,其中低4位已被占用。也就是说stm32f4的优先级分组情况如下表所示:

[10:8]

分割点

抢占优先级位

响应优先级位

抢占优先级数

响应优先级数

0b011

xxxx

[7:4]

none

16

1

0b100

xxx.y

[7:5]

[4]

8

2

0b101

xx.yy

[7:6]

[5:4]

4

4

0b110

x.yyy

[7]

[6:4]

2

8

0b111

yyyy

none

[7:4]

1

16

 

 

 

最后一个NVIC的寄存器

软件触发中断寄存器NVIC_STIR


当SCB_CCR的USERSETMPEND位为1时,无特权的用户程序才能写此寄存器。

[31:9]保留。
[8:0] INTID  ID号中断触发,
范围0-239。例如,0x03的指定中断IRQ3触发。


  • 10
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
STM32中断NVIC是指嵌套向量中断控制器(Nested Vectored Interrupt Controller),它是控制整个芯片中断相关功能的一个外设。在STM32中,NVIC被用于分组中断、分配抢占优先级和响应优先级。STM32NVIC支持256个中断,其中包括16个内核中断和240个外部中断。中断优先级可通过NVIC进行编程设置,可以设置256级的优先级。在具体的STM32型号中,比如STM32F103,只支持60个可屏蔽中断,因此只有ISER的32位和ISER的28位是有效的。关于每一位对应哪一个中断的信息可以在对应的STM32的头文件中找到。 此外,NVIC还包含了中断使能寄存器(ISER)、中断清除寄存器(ICER)、中断使能悬起寄存器(ISPR)、中断清除悬起寄存器(ICPR)、中断有效位寄存器(IABR)和中断优先级寄存器(IP)等寄存器。这些寄存器用于控制和配置中断相关的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [【STM32】中断(NVIC)](https://blog.csdn.net/qq_40130613/article/details/125771416)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [STM32单片机NVIC和中断](https://blog.csdn.net/qq_44223560/article/details/124730645)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值