嵌入式知识清单学习(一)

自学《STM32不完全手册》的笔记二

NVIC中断优先级管理

1.STM32 有 84 个中断,包括 16 个内核中断和 68 个可屏蔽中断,具有 16 级可编程的中断优先级。
常用的是这 68 个可屏蔽中断, 但是 STM32 的 68 个可屏蔽中断,在 STM32F103 系列上面,又只有 60 个。

2.中断寄存器:
1)ISER[8]: ISER 全称是: Interrupt Set-Enable Registers,这是一个中断使能寄存器组。8个32位寄存器控制CM3支持的256个中断,对STMF103有用的是ISER[0]和 ISER[1]共表示64个中断的前60位。 你要使能某个中断,必须设置相应的 ISER 位为 1,使该中断被使能(这里仅仅是使能,还要配合中断分组、屏蔽、 IO 口映射等设置才算是一个完整的中断设置)。
2)ICER[8]:全称是: Interrupt Clear-Enable Registers,是一个中断除能寄存器组。用来清除某个终端的使能。(专门设置一个 ICER 来清除中断位,而不是向 ISER 写 0 来清除,是因为 NVIC 的这些寄存器都是写 1 有效的,写 0 是无效的。)
3)ISPR[8]:全称是: Interrupt Set-Pending Registers,是一个中断挂起控制寄存器组。通过置 1,可以将正在进行的中断挂起,而执行同级或更高级别的中断。
4)ICPR[8]:全称是: Interrupt Clear-Pending Registers,是一个中断解挂控制寄存器组。通过设置 1,可以将挂起的中断解挂。
5)IABR[8]:全称是: Interrupt Active Bit Registers,是一个中断激活标志位寄存器组。如果为 1,则表示该位所对应的中断正在被执行。这是一个只读寄存器,通过它可以知道当前在执行的中断是哪一个。中断执行完了由硬件自动清零。
6)IP[240]:全称是: Interrupt Priority Registers,是一个中断优先级控制的寄存器组。!重要的寄存器! IP 寄存器组由 240 个 8bit 的寄存器组成,每个可屏蔽中断占用 8bit,这样总共可以表示 240 个可屏蔽中断。 而 STM32 只用到了其中的前 60 个。 每个可屏蔽中断占用的 8bit 并没有全部使用,而是 只用了高 4 位。这 4 位,又分为抢占优先级和子优先级。抢占优先级在前,子优先级在后。而这两个优先级各占几个位又要根据 SCB->AIRCR 中的中断分组设置来决定。
注意: 1.如果两个中断的抢占优先级和响应优先级都是一样的话,则哪个中断先发生就先执行;
2.第二,高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。而抢占优先级相同的中断,高优先级的响应优先级不可以打断低响应优先级的中断。

NVIC 中断管理函数主要在 misc.c 文件里面。
首先要讲解的是中断优先级分组函数 NVIC_PriorityGroupConfig,其函数申明如下:

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);

这个函数的作用是对中断的优先级进行分组,这个函数在系统中只能被调用一次,一旦分组确定就最好不要更改。比如我们设置整个系统的中断优先级分组值为 2,那么方法是:

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

中断初始化函数 NVIC_Init

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)

比如我们要使能串口 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. 系统运行开始的时候设置中断分组。确定组号,也就是确定抢占优先级和子优先级的
    分配位数。调用函数为 NVIC_PriorityGroupConfig();
  2. 设置所用到的中断的中断优先级别。对每个中断调用函数为 NVIC_Init();

猜你喜欢

转载自blog.csdn.net/LGYSYGWH/article/details/106460964