STM32:NVIC中断控制器

NVIC(Nested Vectored Interrupt Controller) ,即内嵌向量中断控制器,NVIC位于内核中,响应速度更快,同时标准化,各厂家Cortex内核芯片NVIC都一致。

M4/M7 内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置,实际中各厂家会进行裁剪,支持的中断会少些。如STM32F40x/41x总共有92个中断,10个内核中断,82个可屏蔽中断;STM32F42x/STM32F43x则总共有97个中断,10个内核中断,87个可屏蔽中断;STM32F76x总共118个中断,10个内核中断,108个可屏蔽中断。

如何管理这么多的中断?

STM32对每个中断都设置了两个优先级:抢占式优先级(主优先级)和响应优先级(从优先级)。中断处理优先级原则:先看谁的主优先级高,高的先处理,如果一样高先到先处理,同时到才看从优先级,如果主、从优先级都一样且同时到,则按它们在中断表中的排序先后来决定处理顺序。[注:高抢占优先级的中断可以打断正在进行的低抢占优先级的中断]

stm32对中断进行分组(0~4组),分组是在寄存器SCB->AIRCR中配置,所谓分组就是分主、从优先级各占几位,比如分组为2,则有2位抢占优先级(值取0~4,值越小优先级越高)和2位响应优先级(值取0~4,值越小优先级越高)。

AIRCR[108]

IP bit[74]分配情况

分配结果

0

111

04

0位抢占优先级,4位响应优先级

1

110

13

1位抢占优先级,3位响应优先级

2

101

22

2位抢占优先级,2位响应优先级

3

100

31

3位抢占优先级,1位响应优先级

4

011

40

4位抢占优先级,0位响应优先级

中断优先级设置步骤(HAL库)

1. 设置整个系统的中断优先级分组:

    void HAL_NVIC_SetPriorityGrouping (NVIC_PriorityGroup_2); // 中断优先级分组为2,也就是2位抢占优先级,2位响应优先级  [注:此函数在Hal_Init()里面调用配置

2. 针对具体每个中断,设置各自的抢占优先级和子优先级:

    void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority);  //IRQn为具体中断名,如 USART1_IRQn、EXTI9_5_IRQn等,PreemptPriority和SubPriority为优先级具体数值,分组为2时,取值0~4

3. 使能中断:  

    void HAL_NVIC_EnableIRQ(IRQn_Type IRQn);

猜你喜欢

转载自blog.csdn.net/chn_zx/article/details/131696690