内嵌向量中断控制器:Nested Vectored Interrupt Controller (NVIC)

设置中断向量的优先级并使能。

响应优先级& 抢占优先级

抢占优先级:一个中断A还在处理时,另一个中断B发生,B能否先处理? 答:如果B抢占优先级高就行。

响应优先级:抢占优先级相同时,中断A和中断B同时发生时,先处理哪个? 答:响应优先级高的哪个。

而抢占优先级相同的中断,高优先级的响应优先级不可以打断低响应优先级的中断。

中断优先级组

是指在寄存器SCB->AIRCR中,配置:

4个位当中,几位是抢占优先级,几位是响应优先级

注意:设置好后不要再改了!以免造成混乱

相关库函数

NVIC相关的库函数在FWLIB的misc.c中

中断优先级分组函数

(一般只调用一次!)

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);

例如:

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

中断初始化函数

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)

其中 NVIC_InitTypeDef 是一个结构体,我们可以看看结构体的成员变量:

typedef struct
{
uint8_t NVIC_IRQChannel;
uint8_t NVIC_IRQChannelPreemptionPriority;
uint8_t NVIC_IRQChannelSubPriority;
FunctionalState NVIC_IRQChannelCmd;
} NVIC_InitTypeDef;

NVIC_InitTypeDef 结构体中间有三个成员变量,这三个成员变量的作用是:

NVIC_IRQChannel:定义初始化的是哪个中断,这个我们可以在 stm32f4xx.h 中定义的枚举类 型 IRQn

的成员变量中可以找到每个中断对应的名字。例如串口 1 对应 USART1_IRQn。

NVIC_IRQChannelPreemptionPriority:定义这个中断的抢占优先级别。

NVIC_IRQChannelSubPriority:定义这个中断的响应优先级别。

NVIC_IRQChannelCmd:该中断通道是否使能。

比如我们要使能串口 1 的中断,同时设置抢占优先级为 1,响应优先级位 2,初始化的方法是:

NVIC_InitTypeDef NVIC_InitStructure;;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口 1 中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;// 抢占优先级为 1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;// 响应优先级位 2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道使能
NVIC_Init(&NVIC_InitStructure); //根据上面指定的参数初始化 NVIC 寄存器

编程步骤

最简单的应用中,只要

  1. 设置分组
  2. 外设中断使能(函数名在外设的头文件中有)
  3. 初始化
  4. 写中断服务函数(函数名在setup巴拉巴拉中定义)

    即可:
//1.
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //可能在主函数
//2.
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //可能在初始化函数中
//3.
NVIC_InitTypeDef NVIC_InitStructure; / /可能在初始化函数
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口 1 中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;// 抢占优先级为 1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;// 响应优先级位 2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道使能
NVIC_Init(&NVIC_InitStructure); //根据上面指定的参数初始化 NVIC 寄存器
//4.中断服务函数
void USART1_IRQHandler(void)
{
}

上面是一些常用的东西,下面是其他一些有的没的

支持的中断数量

  • CM4内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。
  • STM32F4并没有使用CM4内核的全部东西,而是只用了它的一部分。

    STM32F40xx/STM32F41xx总共有92个中断。

    STM32F42xx/STM32F43xx则总共有96个中断
  • STM32F40xx/STM32F41xx的92个中断里面,包括10个内核中断和82个可屏蔽中断,具有16级可编程的中断优先级,而我们常用的就是这82个可屏蔽中断。

中断设置相关的寄存器

__IO uint8_t  IP[240]; //中断优先级控制的寄存器组

__IO uint32_t ISER[8]; //中断使能寄存器组

__IO uint32_t ICER[8]; //中断失能寄存器组

__IO uint32_t ISPR[8]; //中断挂起寄存器组

__IO uint32_t ICPR[8]; //中断解挂寄存器组

__IO uint32_t IABR[8]; //中断激活标志位寄存器组

中断优先级控制寄存器组:IP[240]

Interrupt Priority Registers

240个8位寄存器

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

例如:NVIC_Init(&NVIC_InitStructure);

中断使能寄存器组:ISER[8]

8个32位寄存器(CM4内核支持256个中断)

每个位控制一个中断的使能

STM32F40x只有82个可屏蔽中断,所以只使用了其中的ISER[0]~ISER[2]。

ISER[0]的bit031分别对应中断0-31

ISER[1]的bit0-27对应中断32-63;

ISER[2]的bit0-17对应中断64~81;

STM32F407 NVIC 中断优先级管理 个人笔记的更多相关文章

  1. 【STM32】NVIC中断优先级管理

    (1)NVIC中断优先级分组 1>,CM4内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且 具有256级的可编程中断设置. 2>,STM32F4并没有使用CM4的内核 ...

  2. stm32中断优先级管理与外部中断编程

    stm32中断优先级管理与外部中断编程 中断优先级管理 外部中断编程 官方示例程序 exti.h #ifndef __EXTI_H #define __EXIT_H #include "sy ...

  3. C++内存管理学习笔记(5)

    /****************************************************************/ /*            学习是合作和分享式的! /* Auth ...

  4. C++内存管理学习笔记(6)

    /****************************************************************/ /*            学习是合作和分享式的! /* Auth ...

  5. C++内存管理学习笔记(7)

    /****************************************************************/ /*            学习是合作和分享式的! /* Auth ...

  6. Docker Image管理学习笔记,ZT

    Docker Image管理学习笔记 http://blog.csdn.net/junjun16818/article/details/38423391

  7. Linux内存管理学习笔记 转

    https://yq.aliyun.com/articles/11192?spm=0.0.0.0.hq1MsD 随着要维护的服务器增多,遇到的各种稀奇古怪的问题也会增多,要想彻底解决这些“小”问题往往 ...

  8. JVM自动内存管理学习笔记

    对于使用 C.C++ 的程序员来说,在内存管理领域,他们既是拥有最高权力的皇帝又是从事最基础工作的劳动人民——拥有每一个对象的“所有权”,又担负着每一个对象生命开始到终结的维护责任.对于 Java 程 ...

  9. Linux文件与目录管理(学习笔记)

    本笔记为<鸟哥linux私房菜>第六章学习笔记 一.目录与路径 相对路径与绝对路径 绝对路径:一定由根目录 / 写起              正确度比较好 相对路径:不是由 / 写起  ...

随机推荐

  1. 注册jdbc驱动的三种方式

    java.sql.DriverManger类简介   java的驱动管理类.管理一组 JDBC 驱动程序. javax.sql.DataSource 接口是 JDBC 2.0 API 中的新增内容,它 ...

  2. fscanf

    fscanf (PHP 4 >= 4.0.1, PHP 5, PHP 7) fscanf — 从文件中格式化输入 说明 mixed fscanf ( resource $handle , str ...

  3. 正则表达式中的?=,?!,?<=,?<!(预查)解释小栗子

    之前在学正则表达式的时候学的并不是很透彻 感觉看看元字符(元字符要用 \ 转义),限定符(^开头 $结尾),   前面写个范围[a-z],在后面写个{n,}能匹配就行了 当时的自己 然而昨天我参加了个 ...

  4. php 缓存工具类 实现网页缓存

    php 缓存工具类 实现网页缓存 php程序在抵抗大流量访问的时候动态网站往往都是难以招架,所以要引入缓存机制,一般情况下有两种类型缓存 一.文件缓存 二.数据查询结果缓存,使用内存来实现高速缓存 本 ...

  5. RxJava的map方法与flatMap方法

    简单讲,map和flatMap都是来完成Observable构造的数据到Observer接收数据的一个转换,这么说有点绕

  6. 字符串逆序-c语言

    给定一个含有n个元素的字符串,实现逆序. 这是个很基础的问题,实现方式也是很常见的c语言思路.虽然简单,但是仍然记录下来. [期望] 比如char str[] = "abcdefg" ...

  7. 我的关于phoneGap的安装及测试。

    一.PhoneGap简介 PhoneGap是一个用基于HTML,CSS和JavaScript的,创建移动跨平台移动应用程序的快速开发平台.它使开发者能够利用 iPhone,Android,Palm,S ...

  8. SQL系列学习 基础数据

    //班主任表 CREATE TABLE [dbo].[teacher]( [id] [int] IDENTITY(1,1) NOT NULL primary key, [name] [varchar] ...

  9. SQL Server之增删改操作

    -------添加约束.增删改 use StudentDB2 go --------创建学生表--------- create table StudentInfo( --studentId int p ...

  10. codevs 1422 河城荷取

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 在幻想乡,河城荷取是擅长高科技工业的河童.荷取的得意之作除了光学迷彩外,还有 ...