【技术】中科芯CKS32F4xx系列MCU的NVIC中断优先级管理
本文将为大家讲解CKS32F4xx系列MCU产品的中断优先级管理单元NVIC。CM4内核共支持256个中断,其中包含了16个内核中断和240个外部中断,具有256级可编程中断设置。但CKS32F4xx系列只使用了CM4内核的一部分,共有98个中断,包括16个带有FPU核的CM4中断和82个可屏蔽中断,而常用的就是这82个可屏蔽中断。
NVIC寄存器简介
MDK为NVIC相关寄存器其定义了如下的结构体:
typedef struct
{
__IO uint32_t ISER[8]; /*!< Interrupt Set Enable Register */
uint32_t RESERVED0[24];
__IO uint32_t ICER[8];
/*!< Interrupt Clear Enable Register */
uint32_t RSERVED1[24];
__IO uint32_t ISPR[8];
/*!< Interrupt Set Pending Register */
uint32_t RESERVED2[24];
__IO uint32_t ICPR[8];
/*!< Interrupt Clear Pending Register */
uint32_t RESERVED3[24];
__IO uint32_t IABR[8];
/*!< Interrupt Active bit Register */
uint32_t RESERVED4[56];
__IO uint8_t IP[240];
/*!< Interrupt Priority Register, 8Bit wide */
uint32_t RESERVED5[644];
__O uint32_t STIR;
/*!< Software Trigger Interrupt Register */
} NVIC_Type;
CKS32F4xx系列的中断在这些寄存器控制下有序执行,只有了解这些中断寄存器后,才能方便的使用CKS32F4xx系列中断功能。下面重点介绍这几个寄存器:
ISER[8]:ISER全称是:Interrupt Set-Enable Registers,这是一个中断使能寄存器组。上面说了CM4内核支持256个中断,这里用8个32位寄存器来控制,每个位控制一个中断。但是CKS32F4xx系列的可屏蔽中断最多只有82个,所以有用的就是三个(ISER[0~2]),ISER[0]的bit 0~31分别对应中断0~31;ISER[1]的bit 0~31对应中断32~63;ISER[2]的bit 0~17对应中断64~81,共82个中断。你要使能某个中断,必须设置相应的ISER位为1,使该中断被使能,另外还要配合中断分组、屏蔽、IO口映射等设置才算是一个完整的中断设置。具体每一位对应哪个中断,请参考CKS32f4xx.h。
ICER[8]:全称是:Interrupt Clear-Enable Registers,是一个中断除能寄存器组。该寄存器组与ISER的作用恰好相反,是用来清除某个中断的使能的。其对应位的功能,也和ICER一样。这里要专门设置一个ICER来清除中断位,而不是向ISER写0来清除,是因为NVIC的这些寄存器都是写1有效的,写0是无效的。
ISPR[8]:全称是:Interrupt Set-Pending Registers,是一个中断挂起控制寄存器组。每个位对应的中断和ISER是一样的。通过置1,可以将正在进行的中断挂起,而执行同级或更高级别的中断。写0是无效的。
ICPR[8]:全称是:Interrupt Clear-Pending Registers,是一个中断解挂控制寄存器组。其作用与ISPR相反,对应位也和ISER是一样的。通过设置1,可以将挂起的中断接挂。写0无效。
IABR[8]:全称是:Interrupt Active Bit Registers,是一个中断激活标志位寄存器组。对应位所代表的中断和ISER一样,如果为1,则表示该位所对应的中断正在被执行。这是一个只读寄存器,通过它可以知道当前在执行的中断是哪一个。在中断执行完了由硬件自动清零。
IP[240]:全称是:Interrupt Priority Registers,是一个中断优先级控制的寄存器组。CKS32F4的中断分组与这个寄存器组密切相关。IP寄存器组由240个8bit的寄存器组成,每个可屏蔽中断占用8bit,这样总共可以表示240个可屏蔽中断。而CKS32F4只用到了其中的82个。IP[81]~IP[0]分别对应中断81~0。而每个可屏蔽中断占用的8bit并没有全部使用,而是只用了高4位。这4位,又分为抢占优先级和响应优先级。抢占优先级在前,响应优先级在后。而这两个优先级各占几个位又要根据SCB->AIRCR中的中断分组设置来决定。
NVIC中断分组
这里简单介绍一下CKS32F4的中断分组:CKS32F4将中断分为5个组,组0~4。该分组的设置是由SCB->AIRCR寄存器的bit10~8来定义的。具体的分配关系如下:
通过这个表,就可以清楚的看到组0~4对应的配置关系,例如组设置为3,那么此时所有的82个中断,每个中断的中断优先寄存器的高四位中的最高3位是抢占优先级,低1位是响应优先级。每个中断,你可以设置抢占优先级为0~7,响应优先级为1或0。抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高。
这里需要注意两点:
第一,如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;
第二,高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。而抢占优先级相同的中断,高优先级的响应优先级不可以打断低响应优先级的中断。
结合实例说明一下:假定设置中断优先级组为2,然后设置中断3(RTC_WKUP中断)的抢占优先级为2,响应优先级为1。中断6(外部中断0)的抢占优先级为3,响应优先级为0。中断7(外部中断1)的抢占优先级为2,响应优先级为0。那么这3个中断的优先级顺序为:中断7>中断3>中断6。其中中断3和中断7都可以打断中断6的中断。而中断7和中断3却不可以相互打断!
软件实现
通过以上介绍,熟悉了CKS32F4中断设置的大致过程。接下来介绍如何使用库函数实现以上中断分组设置以及中断优先级管理,使得以后的中断设置简单化。NVIC中断管理函数主要在misc.c文件里面。
首先要讲解的是中断优先级分组函数NVIC_PriorityGroupConfig,其函数申明如下:
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
这个函数的作用是对中断的优先级进行分组,这个函数在系统中只能被调用一次,一旦分组确定就最好不要更改。这个函数可以找到其实现:
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
{
assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
}
从函数体可以看出,这个函数唯一目的就是通过设置SCB->AIRCR寄存器来设置中断优先级分组,查看其定义为:
#define IS_NVIC_PRIORITY_GROUP(GROUP)
(((GROUP) == NVIC_PriorityGroup_0) ||
((GROUP) == NVIC_PriorityGroup_1) || \
((GROUP) == NVIC_PriorityGroup_2) || \
((GROUP) == NVIC_PriorityGroup_3) || \
((GROUP) == NVIC_PriorityGroup_4))
可以看到这个定义对应上表中的分组范围0-4。如果需要设置系统的中断优先级分组值为2,那么方法是:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);这样就确定了一共为“2位抢占优先级,2位响应优先级”。设置好了系统中断分组,接下来设置中断的抢占优先级和响应优先级,这里需要用到一个重要的函数为中断初始化函数NVIC_Init,其函数声明为:voidNVIC_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:定义初始化的是哪个中断,这个可以在CKS32f4xx.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);
这里讲解了中断的分组的概念以及设定优先级值的方法,至于每种优先级还有一些关于清除中断,查看中断状态,这在后面课堂中讲解每个中断的时候会详细讲解到。
课程总结
中断优先级设置的步骤:
1.系统初始化的时候设置中断分组:
确定组号,也就是确定抢占优先级和响应优先级的分配位数。调用函数为NVIC_PriorityGroupConfig();
2.设置所用到的中断的中断优先级别:
对每个中断调用函数NVIC_Init();确定具体的抢占优先级和响应优先级,并使能通道。
- |
- +1 赞 0
- 收藏
- 评论 0
本文由犀牛先生转载自中科芯MCU公众号,原文标题为:MCU微课堂 | CKS32F4xx系列产品 NVIC中断优先级管理,本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。
相关研发服务和供应服务
相关推荐
中科芯CKS32K148系列MCU SCG(系统时钟发生器)模块应用指南(一)
系统时钟发生器(SCG)是MCU中的重要模块,它能够为芯片提供多个灵活的时钟源,并支持各种时钟输出选项,实现对芯片内部各个模块的时钟供应。CKS32K148的时钟生成电路提供了各种时钟分频器和选择器,允许不同的模块以该模块特定的频率运行,而时钟生成逻辑实现了可以独立关闭的模块特定时钟门控,从而能够优化芯片性能以满足低功耗的需求。本文将围绕CKS32K148的SCG模块展开介绍。
技术探讨 发布时间 : 2024-09-27
中科芯(CETC)32位MCU选型指南
目录- 公司简介 MCU MCU型号定义&封装参考 MCU开发工具 LoRa/ NB-IoT LoRa/ NB-IoT产品简介 MCU应用案例
型号- CKS32F103V8T6,CKS32F031K6U6,CKS32F102C6T6,CKS32F417ZET6,CKS32F105VDT6,CKS32F107,SX1262,CKS32F105,CKS32F102R4T6,CKS32F103,CKS32F101,CKS32F102,CKS32F101R6T6,CKS32F103C4T6,CKS32F051K6U6,CKS32F101ZCT6,CKS32F030F6P6,CKS32F101VET6,CKS32F417VGT6,SX1280,CKS32L063C8T6,CKS32F031F4P6,CKS32F101C8T6,CKS32F107V8T6,SX1278,CKS32F103RCT6,CKS32F107RBT6,CKS32F051K6T6,CKS32F405ZGT6,TP20L607,CKS32F103ZET6,CKS32L052R6T6,CKS32L052C8T6,CKS32F105VCT6,CKS32F107系列,CKS32F105RET6,CKS32L051系列,CKS32L051R8T6,CKS32L053C6T6,CKS32F101ZDT6,CRF-62,CKS32F072R6T6,CKS32F051系列,CKS32F103RDT6,CKS32F072C8T6,CKS32F103VBT6,CKS32F030K6T6,CKS32F042K8T6,CKS32F407VET6,CKS32F103R4T6,CKS32F415系列,CKS32F103ZDT6,CKS32F102C8T6,CKS32F417ZGT6,CKS32F042系列,CKS32F105VBT6,CKS32F030R8T6,CKS32F102R6T6,CKS32F105RDT6,CRF62-LKWAN-CY,CKS32F103C6T6,CKS32L052系列,CKS32F030K6U6,CKS32F102系列,CKS32F101R8T6,CKS32F030F4P6,CKS32F101ZET6,CKS32L063R8T6,CKS32F101CBT6,CKS32F031系列,CKS32F107R8T6,CKS32F031G6U6,CKS32F103RET6,CKS32L051K6T6,CRF1278系列,CKS32F415RGT6,CKS32L063系列,CKS32F103VCT6,CKS32F051C8T6,CKS32F103ZCT6,CKS32F417IET6,CKS32L052R8T6,CKS32F105RCT6,CKS32L053系列,CRF1278,CKS32F051R8T6,CKS32F101系列,CKS32L053C8T6,CKS32F072CBT6,CKS32F105V8T6,CKS32F407ZET6,CKS32F101RBT6,CKS,CKS32F030系列,CKS32F072R8T6,CRF62-L2,CRF62-L5,CKS32F042C6T6,CKS32F103VDT6,CKS32L053R6T6,CKS32F107VET6,CKS32F407VGT6,CKS32F103R6T6,CKS32F417系列,CKS32F030C8T6,CKS32F102R8T6,CKS32F105RBT6,CKS32F031C6T6,CKS32F103C8T6,CKS32F102CBT6,CKS32F405系列,CKS32F101RCT6,CKS32L052K6T6,CKS32F415VGT6,CKS32F031G4U6,CKS32F103VET6,CKS32F107VDT6,CKS32F051,CKS32F051C6T6,CKS32L051K8T6,CKS32F417IGT6,CRF-62系列,CRF62-WAN,CKS32,CKS32F103系列,CKS32F072RBT6,CKS32F042,CKS32F407IET6,CKS32F405RGT6,CRF1280-12S,CKS32F107RET6,CKS32F407ZGT6,CKS32F101VBT6,CKS32F102RBT6,CKS32F101RDT6,CKS32L053R8T6,CKS32F031,CKS32F103R8T6,CKS32F042C8T6,CKS32F107VCT6,CKS32F030,CRF1278-L3,CRF1278-L1,CKS32F030C6T6,XY1100,CRF1278-L4,CKS32F103CBT6,CKS32F030K6,CKS32F102C4T6,ASR6601,CKS32F101R4T6,CKS32F105R8T6,CKS32F051K8U6,CKS32F407系列,CKS32F107RDT6,CKS32F101VCT6,CKS32F415ZGT6,CKS32F101RET6,CKS32L052K8T6,CKS32F417,CKS32F417VET6,CKS32F101C6T6,CKS32F415,CKS32F031F6P6,CKS32F107VBT6,CKS32L051C6T6,CKS32F051K8T6,TP20H607,CKS32L051C8T6,CKS32F042K6T6,CKS32L052C6T6,ASR6505,CKS32F105VET6,CKS32F407,CKS32F405,ASR6501,ASR6502,CKS32X...,CKS32F105系列,CKS32L051R6T6,CKS32L063,CKS32F407IGT6,CKS32F405VGT6,CKS32F072,CKS32F101VDT6,CKS32F072系列,CKS32F031K6T6,CKS32F103RBT6,CKS32F072C6T6,CRF1100-N1,CKS32L052,CKS32F107RCT6,CKS32L051,CKS32L053
【经验】中科芯CKS32F1系列MCU替代其他厂牌产品兼容性问题处理注意事项
中科芯基于ARM Cortex-M3的CKS32F1系列MCU功耗较国外品牌低20%,有多种低功耗模式。多重、多样化保护机制,自定义分级读写保护更是提高了产品的安全性。但是在与其他品牌产品进行替换时会遇到一些兼容性问题,在此将常见的问题和解决办法进行说明。
设计经验 发布时间 : 2020-03-08
中科芯CKS32K148系列MCU SCG寄存器配置以及相关示例(二)
在前文中,已经对中科芯CKS32K148 MCU SCG时钟进行了整体介绍,下面以RUN模式下配置SPLL为系统时钟源为例,对时钟配置的具体方法进行讲解。
设计经验 发布时间 : 2024-10-31
Top Chinese 8/32-bit MCU Manufacturers with ARM Cortex-M0, M0+, M3, M4 and Stable Supply
In the face of rising semiconductor raw material prices and a continued shortage of production capacity, Sekorm has joined Civil Technology, Arteli, Chipsea, China Microelectronics, Fudan Microelectronics, Aerospace Shun, and other mainstream MCU manufacturers to provide stable MCU supply guarantees
活动 发布时间 : 2022-06-21
中科芯(CETC)CKS32F030C8/C6/K6/F4 32位MCU数据手册
描述- 本资料给出了中科芯CKS32F030 xx 微控制器产品的器件特性
型号- CKS32F030XX,CKS32F030C6,CKS32F030R8T6XXX,CKS32F030C8,CKS32,CKS32F030K6,CKS32F030F4
【选型】中科芯(CETC)CKS32通用32位MCU快速选型指南
目录- CKS32F030超值型-48Mhz/CKS32F031入门型-48Mhz CKS32F051入门型-48Mhz/CKS32F103系列-72MHz
型号- CKS32F051K8T6,CKS32F051K6T6,CKS32F030C6T6,CKS32F030C8T6,CKS32F031K6U6,CKS32F103CBT6,CKS32F030R8T6,CKS32F031C6T6,CKS32F103,CKS32,CKS32F030K6U6,CKS32F051R8T6,CKS32F103C8T6,CKS32F103TBU6,CKS32F103T8U6,CKS32F030F4P6,CKS32F051K8U6,CKS32F051K6U6,CKS32F030F6P6,CKS32F031K6T6,CKS32F031F4P6,CKS32F103RBT6,CKS32F103VBT6,CKS32F030K6T6,CKS32F031F6P6,CKS32F031,CKS32F051C8T6,CKS32F103R8T6,CKS32F051,CKS32F030
解析中科芯CKS32F107xx系列MCU的GPIO配置
本文中中科芯来给大家介绍CKS32F107xx系列MCU的GPIO配置,希望对各位工程师有所帮助。GPIO是通用输入输出端口的简称,也是CKS32可控制的引脚,CKS32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。
设计经验 发布时间 : 2024-06-12
解析中科芯CKS32F107xx MCU的DAC模块
DAC即数模转换器,它可以将数字信号转换为模拟信号。在常见的数字信号系统中,传感器信号被ADC模块把电压模拟信号转换成易于计算机存储、处理的数字信号,由计算机处理完成后,再由DAC模块转化输出电压模拟信号来驱动某些执行器件。本文将为您解析CKS32F107xx MCU的DAC特点和结构。
设计经验 发布时间 : 2024-08-28
【产品】国产32位MCU、从M0到M4内核8大系列产品和STM32软硬件全兼容 | 视频
在2021年4年27日主控器件及存储专场|世强硬创新产品研讨会中,中科芯分享了其32位通用MCU,从M0到M4内核8大系列产品,同STM32软硬件全兼容,并且讲解了在工业、物联网、通信领域的应用。
新产品 发布时间 : 2021-04-29
【经验】中科芯CKS32F4xx系列MCU DAC功能应用指南
DAC模块作为中科芯CKS32F4xx系列MCU的一个常用外设,可以将数字信号转换成模拟信号,最高分辨率可达12位,且两个独立DAC输出通道转换互不影响,各个通道均能使用DMA功能,可由软硬件触发。因此,为了实现DAC输出正弦波,拟采用一定的时间向DAC的数据寄存器写入数据,随后进行数模转换输出不同的电压,最后在时间轴上显示出波形。
设计经验 发布时间 : 2023-08-19
中科芯CKS32F107xx系列MCU内部温度传感器ADC采集应用指南
中科芯推出的CKS32F107xx系列MCU有一个内部的温度传感器,可以用来测量MCU及周围的温度(TA)。该温度传感器在内部和ADCx_IN16输入通道相连接,此通道把传感器输出的电压转换成数字值。
设计经验 发布时间 : 2024-08-13
中科芯CKS32F4xx系列MCU Flash模拟EEPROM的操作应用指南
中科芯CKS32F4xx系列芯片内部嵌入一个FLASH,若FLASH存储了用户的应用程序后仍留有空间,剩余空间可被当作EEPROM使用,这比访问外部FLASH速度优势更为明显。在本章节中,将会向大家简要介绍内部FLASH,并通过一个例程来演示FLASH模拟EEPROM的操作。
设计经验 发布时间 : 2024-02-22
【经验】中科芯CKS32F4xx系列MCU SPI通信配置及读写SPI FLASH指南
中科芯CKS32F4xx系列MCU的SPI外设可用作通讯的主机及从机,支持最高的SCK时钟频率为fpclk/2,完全支持SPI协议的4种模式。本文介绍利用CKS32F4xx系列固件库来完成对SPI的配置使用及SPI FLASH实验。
设计经验 发布时间 : 2023-04-24
中科芯MCU诚邀新老朋友莅临上海慕尼黑电子展交流指导
中科芯MCU诚邀新老朋友2024年7月8日-10日莅临上海慕尼黑电子展交流指导!望与客户朋友们洽谈合作、携手共赢!
原厂动态 发布时间 : 2024-07-08
电子商城
现货市场
服务
可定制显示屏的尺寸0.96”~15.6”,分辨率80*160~3840*2160,TN/IPS视角,支持RGB、MCU、SPI、MIPI、LVDS、HDMI接口,配套定制玻璃、背光、FPCA/PCBA。
最小起订量: 1000 提交需求>
可烧录IC封装SOP/MSOP/SSOP/TSOP/TSSOP/PLCC/QFP/QFN/MLP/MLF/BGA/CSP/SOT/DFN;IC包装Tray/Tube/Tape;IC厂商不限,交期1-3天。支持IC测试(FT/SLT),管装、托盘装、卷带装包装转换,IC打印标记加工。
最小起订量: 1pcs 提交需求>
登录 | 立即注册
提交评论