论坛网站建设公司,南昌做网站公司有哪些,利津网页设计,兰州做网站公司哪家好1.概述
Apollo4BlueLite 的中断控制器是采用 ARM Cortex-M4 内核#xff0c;并集成了 NVIC#xff08;Nested Vectored Interrupt Controller#xff0c;嵌套向量中断控制器#xff09;作为其中断控制器。
NVIC 是 ARM Cortex-M 系列处理器中常用的中断控制器#xff0c…1.概述
Apollo4BlueLite 的中断控制器是采用 ARM Cortex-M4 内核并集成了 NVICNested Vectored Interrupt Controller嵌套向量中断控制器作为其中断控制器。
NVIC 是 ARM Cortex-M 系列处理器中常用的中断控制器它具有以下基本特征和功能
1中断优先级和优先级分组NVIC 支持配置和管理中断的优先级可以根据需求将不同的中断分配到不同的优先级组中。这样可以确保高优先级的中断得到更及时的响应。
2中断向量表NVIC 使用中断向量表来管理中断。每个中断对应一个唯一的中断向量在中断触发时NVIC 会根据中断向量找到相应的中断服务程序Interrupt Service RoutineISR来进行中断处理。
3中断使能和禁用NVIC 提供了使能和禁用中断的功能允许根据需要控制特定中断的触发和处理。
4中断嵌套和自动优先级切换NVIC 支持中断的嵌套和自动优先级切换可以在处理当前中断时响应更高优先级的中断请求从而提高系统的灵活性和响应性。
5快速和低延迟的中断触发NVIC 能够快速检测和触发中断减少中断处理的延迟提高系统的实时性和响应能力。
2. Apollo4BlueLite NVIC和cortex-M4 NVIC
NVIC 是嵌套向量中断控制器控制着整个Apollo4BlueLite芯片中断相关的功能它跟Cortex-M4内核紧密联系是内核里面的一个外设。但是各个芯片厂商在设计芯片的时候会对Cortex-M4内核里面的 NVIC 进行裁剪把不需要的部分去掉所以说 Apollo4BlueLite 的 NVIC 是 Cortex-M 4 的 NVIC 的一个子集。
3.NVIC寄存器
1在配置中断的时候我们一般只用 ISER、ICER 和 IP 这三个寄存器ISER 用来使能中断ICER 用来清除中断IP 用来设置中断优先级。 2寄存器表 ISER寄存器Interrupt Set-enable Registers
根据官方文档介绍The NVIC_ISER0-NVIC_ISER7 registers enable interrupts, and show which interrupts are enabled.
可以看到ISER寄存器一共有8组共计256bit该寄存器可读可写那么当需要使能对应中断时需要配置对应bit位为1也可以通过读寄存器来确认对应中断状态为使能或使能。
ICER寄存器Interrupt Clear-enable Registers
根据官方文档介绍The NVIC_ICER0-NVIC_ICER7 registers disable interrupts, and show which interrupts are enabled.
注意直接写ISER寄存器为0不会禁止对应中断必须通过ICER寄存器来实现禁止中断的功能。ICER实现的和ISER相反的功能。
ISPR寄存器Interrupt Set-pending Registers
根据官方文档介绍The NVIC_ISPR0-NVIC_ISPR7 registers force interrupts into the pending state, and show which interrupts are pending.
这个寄存器用来挂起中断对应bit设置为1时中断控制器会将正在进行的中断挂起写0无效。
当高优先级的中断正在执行时低优先级的中断发生了这时CPU会将低优先级的中断临时挂起等待高优先级的中断完成后再去处理低优先级的中断。
ICPR寄存器Interrupt Clear-pending Registers
根据官方文档介绍The NVIC_ICPR0-NCVIC_ICPR7 registers remove the pending state from interrupts, and show which interrupts are pending.
其作用与ISPR相反对应位也和ISER是一样的。通过设置1可以将挂起的中断解挂。
IABR寄存器Interrupt Active Bit Registers
根据官方文档介绍The NVIC_IABR0-NVIC_IABR7 registers indicate which interrupts are active.
A bit reads as one if the status of the corresponding interrupt is active or active and pending.
该寄存器只读如果为1则表示该位所对应的中断正在被执行或者执行期间被挂起。在中断执行完了由硬件自动清零。
IPR寄存器Interrupt Priority Registers
根据官方文档介绍The NVIC_IPR0-NVIC_IPR59 registers provide an 8-bit priority field for each interrupt and each register holds four priority fields. These registers are byte-accessible.
中断优先级寄存器,该寄存器只能以字节访问。每个中断占用8位所以每个寄存器可以表示4个中断优先级如下图所示 这里一共可以表示60*4240个中断的中断优先级每个中断优先级占用1个字节。
ARM的中断优先级分两种抢占优先级和响应优先级。
具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应即中断嵌套或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。
当两个中断源的抢占式优先级相同时这两个中断将没有嵌套关系当一个中断到来后如果正在处理另一个中断这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达则中断控制器根据他们的响应优先级高低来决定先处理哪一个如果他们的抢占式优先级和响应优先级都相等则根据他们在中断表中的排位顺序决定先处理哪一个中断号小的先执行。
3中断号
从Apollo4BlueLite的SDK中可以看到实际上只用了84个中断 4.NVIC 中断配置固件库
1固件库头文件 core_cm4.h 中提供了 NVIC 的一些函数这些函数遵循 CMSIS 规则只要是 Cortex-M4 的处理器都可以使用具体如下 NVIC库函数 描述 void NVIC_EnableIRQ(IRQn_Type IRQn) 使能中断 void NVIC_DisableIRQ(IRQn_Type IRQn) 失能中断 void NVIC_SetPendingIRQ(IRQn_Type IRQn) 设置中断悬起位 void NVIC_ClearPendingIRQ(IRQn_Type IRQn) 清除中断悬起位 uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) 获取悬起中断编号 void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) 设置中断优先级 uint32_t NVIC_GetPriority(IRQn_Type IRQn) 获取中断优先级 void NVIC_SystemReset(void) 系统复位