STM32的中断理解笔记

发布者:HeavenlyJoy444最新更新时间:2021-05-25 来源: eefocus关键字:STM32  中断  中断优先级 手机看文章 扫描二维码
随时随地手机看文章

1、基本理解


ARM Cortex_m3内核支持256个中断(16个内核和240个外部)和可编程256级中断优先级的设置。然而,STM32并没有全部使用M3内核东西,STM32目前支持的中断为84个,16个内核加上68个外部以及16级可编程中断优先级的设置。


由于STM32只能管理16级中断的优先级,所以只是使用到中断优先级寄存器的高四位。


有两种优先级:


(1)抢占式优先级,库函数设置为NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=x(x为0~15,具体要看下面的优先级组别的选择);


(2)响应优先级,库函数设置为NVIC_InitStructure.NVIC_IRQChannelSubPriority =x(x为0~15,具体要看下面的优先级组别的选择);


当两个中断相遇时,谁先执行呢?先比较抢占式优先级,谁的抢占式优先级编号小就可以先执行,编号大的等着;如果抢占式优先级相同才去比较响应优先级,同理,优先级号谁小,谁先执行 。


注意:(1)其优先级编号越小,其优先级别越高。不是越大越高级!!


(2)只要抢占优先级高才可以抢占当前中断,如抢占优先级编号相同,则先到达的先执行,迟到达的即使响应优先级高也只能等着。只有同时到达,才是高响应优先级的中断先执行。要区分清楚。


2、嵌套向量中断控制器NVIC


STM32的中断还是相当多的, 那么需要专门的一个寄存器来管理他们,于是NVIC 出现了。


分为5个优先级组,分别以NVIC_PriorityGroup_0 依次到NVIC_PriorityGroup_4来表示;


NVIC_PriorityGroup_0 => 选择第0组


NVIC_PriorityGroup_1 => 选择第1组


NVIC_PriorityGroup_2 => 选择第2组


NVIC_PriorityGroup_3 => 选择第3组


NVIC_PriorityGroup_4 => 选择第4组


组别0时:所有4位用于响应优先级;


组别1时:最高1位用于抢占优先级,低3位用于响应优先级;


组别2时:最高2位用于抢占优先级,低2位用于响应优先级;


组别3时:最高3位用于抢占优先级,低1位用于响应优先级;


组别4时:最高4位用于抢占优先级,无响应优先级;


理解:假如选择了第三组,那么抢占式优先级就有000~111这8个中选择,你在程序当中可以给不同的中断不同的抢占式优先级,号码是从0~7 ; 而响应优先级只有1位,所以即使你要设置3、4个甚至最多的16个中断,在响应优先级这一项你只能赋予0或1。


所以,抢占式8个* 响应2个=16种优先级,这与上文所述的"STM32只能管理16级中断的优先级"是相符的。


应用举例


void NVIC_Configuration(void)


{


NVIC_InitTypeDef NVIC_InitStructure;


//选择优先级分组第1组 ,抢占2种,响应8种


NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);


NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn ;


NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;


NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;


NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;


NVIC_Init(&NVIC_InitStructure);


NVIC_InitStructure.NVIC_IRQChannel = EXT0_IRQn ;


NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0;


NVIC_InitStructure.NVIC_IRQChannelSubPriority =1;


NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;


NVIC_Init(&NVIC_InitStructure);


NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;


NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;


NVIC_InitStructure.NVIC_IRQChannelSubPriority =1;


NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;


NVIC_Init(&NVIC_InitStructure);


NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;


NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;


NVIC_InitStructure.NVIC_IRQChannelSubPriority =2;


NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;


NVIC_Init(&NVIC_InitStructure);


NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;


NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;


NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;


NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;


NVIC_Init(&NVIC_InitStructure);


}


上述有5个中断,两个外部,三个定时器,那么优先级由高到低应该是:


外部中断9_5(暂不知是哪条中断线),外部中断0,定时器2,定时器3,定时器4。


其中外部中断可以随时打断定时器中断,定时器则不行。

关键字:STM32  中断  中断优先级 引用地址:STM32的中断理解笔记

上一篇:基于STM32单片机利用ST库函数设置Systick
下一篇:STM32GPIO——快速IO的使用

推荐阅读最新更新时间:2024-11-11 11:49

利用单片机定时中断实现软定时器
以下是代码实现已经测试并用到项目上课放心使用 Author : 吾本杞人 #include reg52.h #include Intrins.h #include TypeDef.h #include CPUPin_Def.h #include VarDef.h #define TIME_BASE_2MS 2 #define TIME_BASE_500MS 250 #define TIME_BASE_10MS 5 #define F_OSC 110592 //定义这个是默认按照11.0592MHZ的晶振算的 TH0 TL0的值 方式1 16位定时器 //注意这种写法只
[单片机]
stm32 IAP 实现
在对STM32存储器结构及相关知识了解后,我们就可以进行IAP的设计了。 在上一篇笔记中,进行了一个简单的IAP程序结构,以及和User App程序的相互联系的系统设计。 本篇对IAP实现的细节进行了较为详细的论述,包括源码结构的设计;我们从上位机(PC C#)和下位机(MCU C)共同描述IAP功能的实现过程。 1 STM32的IAP实现平台 IAP功能的实现需要两个方面(上位机和STM32上的IAP程序)的密切合作。因此,我们除了需要知道STM32芯片上的IAP程序结构,我们还需要了解上位机的程序结构,这样才能使上位机和STM32很好的相互工作。 下位机(指的是STM32构成的单片机系统): 本下位机系统使用C语言
[单片机]
<font color='red'>stm32</font> IAP 实现
STM32 BOOT位理解及设置
STM32F10x 片上存储区有3个部分:内置Flash,内置SRAM ,内置ROM(system memory),这就定义了系统的启动方式有3种:从内置Flash启动,从内置SRAM启动,从system memory 启动,这三种启动方式是通过BOOT 这两个引脚来决定的。 SRAM:即芯片内置的RAM区,通俗意义上的内存。 系统存储区(system memory):芯片内部一块特定的区域,芯片出厂时ST在这个区域烧写了一段Bootloader ,由于这个区域为ROM,因此芯片出厂后是无法修改的。这个Bootloader的主要任务就是通过UART1下载程序到内置Flash中去。BOOT选择System memory 模
[单片机]
<font color='red'>STM32</font> BOOT位理解及设置
如何将CoreMark程序移植到STM32
说起CoreMarK,可能对于很多人来说并不陌生。经常看到有人在谈及一些中央处理器时往往会提到它的COREMARK是多少多少。它其实就是一项用来测试各类中央处理器性能的基准代码。代码使用C语言写成,包含列举、数学矩阵操作、状态及CRC等运算法则。 目前CoreMark已迅速成为测量与比较各类处理器性能的业界标准的测试基准。CoreMark得分越高,意味着性能更高。大家在CoreMark的官网上可以可以看到各家处理器各型号的CoreMark得分。也可以从CoreMark的官网上下载测试代码,亲自评测一下自己手中芯片的性能。CoreMark官网的链接地址如下: http://www.eembc.org/coremark/ind
[单片机]
如何将CoreMark程序移植到<font color='red'>STM32</font>
STM32驱动LCD实战
01 驱动时序 我们通常说的MCU-LCD接口,就是8080接口,8080接口的详细介绍请看《STM32驱动LCD原理》。 下面是LMT028DN给出的8080模式总线时序 下面是总线时序中的参数 时序参数 Tast- 地址设置时间 Taht- 地址保持时间(写) Tchw- 芯片选择高脉冲宽度 Tcs- 芯片选择设置时间(写) Tcsf- 芯片选择等待时间(写) Twc- 写入周期 Twrh- 控制脉冲高电平时间 Twrl- 控制脉冲低电平时间 Tdst- 数据设置时间 Tdht- 数据保持时间 根据FSMC的配置和时序图,我们需要的3个时序参数是 3个重要参数 1、地址建立时间:5ns 2
[单片机]
<font color='red'>STM32</font>驱动LCD实战
STM中SPI运用的NSS引脚解读
STM的NSS引脚 首先我们说该引脚有两个电平需要注意,一个是与NSS引脚连接的外部电平,一个是NSS引脚的内部电平。 然后我们知道在SPI通信的时候master必须在NSS引脚的内部电平为高电平时才得以进行通信,slaver在NSS引脚的内部电平为低电平时才可以通信。这是前提条件。 我们知道NSS引脚电平的管理有两种方式,一个是软件管理和硬件管理。但当为硬件管理时(SSM=0),NSS管脚的内部电平由与NSS连接的外部电平决定,即外面是高电平,则NSS引脚的内部电平也为高电平。如果你想工作在该模式下,那么master的NSS引脚必须连接高电平,slaver必须连接低电平(一般接地)。软件管理模式(SSM=1)则是通过SS
[单片机]
学习笔记——Cortex-M0中断控制和系统控制
一. NVIC和系统控制块特性 1. 灵活的中断管理:使能/禁止中断,优先级配置 2. 硬件嵌套中断支持 3. 向量化的异常入口 4. 中断屏蔽 5. NVIC寄存器的起始地址:0xE000E100, 对其访问必须是每次32bit 6. SCB的起始地址: 0xE000E010,也是每次32bit访问。1234567 二. 中断使能和清除使能 1. 中断寄存器是可编程的,用于控制中断请求(异常编号16以上)的使能(SETENA)和禁止(CLRENA), 如下所示:12 2. 使能/禁止 中断的代码: 1). C代码:123 *(volatile unsigned long) (0xE000E1
[单片机]
ARM 处理器 ~ 中断与异常
中断与异常 定义 ARM 中的工作模式除 User 和 System 外,均为异常模式,这里的异常是广义的,包含以下三类情况 外部中断(外部中断) 由于 CPU 外部的原因而改变程序执行流程,属于异步事件,可以屏蔽 软件中断(自陷) 通过处理器拥有的软件指令,可预期地使正在执行的程序改变执行流程,以执行特定的程序 显式的事件,无条件执行 属同步事件,且不可屏蔽 例如 Motorola 68000 系列的 Trap 指令、ARM 中的 SWI、Intel 8086 中的 INT 异常 由 CPU 内部的原因(如非法指令)或外部的原因(如访存错误)引起的事件 没有对应的处理器指令 异常发生时,处理器无条件地挂起当前运行的程序,
[单片机]
ARM 处理器 ~ <font color='red'>中断</font>与异常
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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