stm32f407之NVIC

发布者:独行侠客最新更新时间:2018-09-20 来源: eefocus关键字:stm32f407  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触发。


关键字:stm32f407  NVIC 引用地址:stm32f407之NVIC

上一篇:stm32f407之EXTI(操作寄存器)
下一篇:stm32f407之DAC(操作寄存器)

推荐阅读最新更新时间:2024-03-16 16:14

分享关于stm32f407定时器时钟频率的问题
上午想要用Timer10做相对精确的延时功能,但是用示波器发现实际延时数值总是只有一半,百思不得其解。 仔细查阅各处资料结合实际研究后对stm32f407的14个定时器的时钟做一个总结: 从时钟树中我们可以得知(时钟树的图片可以直接参考6楼,感谢6楼xkwy补上的图): (1)高级定时器timer1, timer8以及通用定时器timer9, timer10, timer11的时钟来源是APB2总线 (2)通用定时器timer2~timer5,通用定时器timer12~timer14以及基本定时器timer6,timer7的时钟来源是APB1总线 从STM32F4的内部时钟树可知,当APB1和APB2分频数为1的时候,TIM1、
[单片机]
STM32开发笔记4: STM32F407 UART的使用方法
STM32F4内嵌4个通用异步/同步收发器(USART1、USART2、USART3、USART6)和两个通用异步收发器(UART4和UART5)。本文讲解此6个串行口,在异步模式下的使用方法,如不加说明,以USART1为例。 可以按照下述步骤,对通用异步串行口进行设置。 1、打开config.h文件,对如下图所示的宏进行设置,0x0c表示将当前串行口UART1的波特率设为115200bps,无效验。 2、打开main.c文件,可以在其中断服务函数中,完成接收逻辑的代码编写,如下图所示。此代码表明,当串行口收到1个字节的数据后,将触发串行口中断,在中断服务程序中,将接收到的1字节数据取出,送u8_Ua
[单片机]
STM32开发笔记4: <font color='red'>STM32F407</font> UART的使用方法
CubeMX Stm32F407生成一定周期的占空比不同的方波DMA+定时器
先上图 如图 是我生成的一个波形 这个波形的占空比在连续的四个周期内分别是10%,20%,30%,40%, 并且按照这个顺序循环这里大致介绍一下实现的方式。 使用的软件是Cubemx(库函肯定也可以实现) 第一步是器件选型 这一部分不做介绍 用的是Stm32F407 第二是时钟配置 接下来是定时器配置 第三步就是生成代码了 这里 需要在生成的代码里面加上一行开始的代码。
[单片机]
CubeMX <font color='red'>Stm32F407</font>生成一定周期的占空比不同的方波DMA+定时器
6.中断优先级分组NVIC
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup) void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct) typedef struct NVIC_InitTypeDef{ uint8_t NVIC_IRQChannel; //中断通道 uint8_t NVIC_IRQChannelPreemptionPriority; //抢占优先级 uint8_t NVIC_IRQChannelSubPriority; //响应优先级 FunctionalState NVIC_IRQChannelCmd
[单片机]
【STM32CubeMX】15,NVIC,中断优先级
以前虽然用到了中断,但很少用到中断优先级。现在必须有了,比如急停之类的。 http://www.waveshare.net/study/article-641-1.html 抢占优先级是用来判断一个中断是否可以打断另外一个中断的中断服务程序抢先运行。 响应优先级是用来判断抢占优先级相同的几个中断那个中断会优先响应。 中断优先级分组是为了给抢占式优先级和响应优先级在中断优先级寄丛器的四个比特位分配各个优先级数字所占的位数。例如3位用于抢占优先级(优先级有2^3=8种优先级),1位用于响应优先级(优先级有2^1=2种优先级)。 中断服务函数里面就调用了GPIO外部中断处理函数HAL_GPIO_EXTI_IRQH
[单片机]
【STM32CubeMX】15,<font color='red'>NVIC</font>,中断优先级
STM32f407学习 ----(1)外部中断
任务:主要利用跑马灯、按键、外部中断这三个例程实现:初始状态红灯亮,当按键按下(既有外部中断产生),此时红灯灭,绿灯闪烁3下后红灯继续亮,如此循环。 1:外部中断初始化可以按例程根据需要配置 2:根据需要中断的个数写外部中断函数,我是用了两个键控制LED0,LED1,所以写了两个函数 3:在初始化外部中断函数 void EXTIX_Init(void) 时,对抢占优先级,响应优先级这两个概念不太清楚, 下面是这抢占优先级与响应优先级的解释: 当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时
[单片机]
<font color='red'>STM32f407</font>学习 ----(1)外部中断
stm32F407之内部温度传感器
刚才发了ADC的一般用法,得知stm32内部内置了一个温度传感器,于是趁热调试了一下内部温度传感器。没有软件滤波,正如手册里所说的,该温度传感器起到一个检测温度变化的作用,如果你想要精确的温度测量,请你外置测温元件...呵呵,测试结果如图: 代码如下: /************************************************************ Copyright (C), 2012-2022, yin. FileName: main.c Author: 小枣年糕 Date: 2012\05\01 Description: ADC1 DMA tempersen
[单片机]
<font color='red'>stm32F407</font>之内部温度传感器
stm32F407(CORTEX-M4)之RCC配置与TIM2的PWM
之前我已经发过了关于TIM2的PWM,但是没有自己配置RCC时钟,用到的系统时钟、HCLK、PCLK1与PCLK2都是系统启动代码里默认设置的,但是由于应用场合不同,默认的设置可能不满足用户需要,这时便需要手动配置。还是同样的问题,M4的资料太少,我只能参考函数的英文说明(我已经习惯看英文了,呵呵)来自己配置,不敢独享,现分享如下: (我的外部时钟为25MHz) #include static __IO uint32_t TimingDelay; //__IO为volatile的宏定义 int8_t LED_Flag = 1; //LED灯翻转标志位 void RCC_Config(void); voi
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved