t60yz 发表于 2023-5-28 01:52

STM32-中断优先级

中断作为系统资源里面尤为重要的一种系统资源,可以对于硬件的运行发挥着不可或缺的地位。基本每一个硬件都会有相应的中断,只不过是中断类型和中断数量多少的问题。像51单片机的硬件就拥有比较简单中断类型,例如定时器中断、串口接收中断、外部中断等几个简单中断,用起来也是十分简单。
   对于STM32来说因为它使用的基于M3和M4的内核,就M3内核而言,支持256个中断其中包含了16个内核中断和240个外部中断,而且具有256级的可编程中断设置。但是STM32并没有将这些中断都添加到自身的硬件资源中而是使用了其中的部分中断,一种拥有84个中断,包括了16个内核中断和68个可屏蔽中断,具有16级可编程的中断优先级。103系列只有60个可屏蔽中断。可见下图:



上图包含了103系列的60个全部中断,但是如何使用呢?这么多的中断如果准确的使用呢?其实使用起来还是相对简单的,首先STM32将所有的中断进行分组,给每个中断添加两个属性,可以称为先占优先级和从优先级。具体区别可以去百度一下。需要记住的是如果需要使用中断在系统开始或者初始化的时候就要将系统的中断分组设置好,而且不宜更改。


t60yz 发表于 2023-5-28 01:52

如果更改可能会出现中断系统的麻烦。先来看一下中断相关的寄存器和函数表:

t60yz 发表于 2023-5-28 01:52

第一步先初始化中断优先级分组利用NVIC_PriorityGroupConfig()
具体参数可以参照手册,一共有5种模式分别对应不同的先占优先级和从优先级。

t60yz 发表于 2023-5-28 01:53

设置好优先级就可以对每个中断进行单独的设置了假设我想对我的串口中断进行设置,使用void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);就可以了。这样才能在每个中断程序中使能或者打开对应的相应中断的对应中断函数。
#include "stm32f10x.h"
#include "GPIO.h"
#include "USART.h"
#include "SysTick.h"
#include "NVIC.h"

int main()
{   
      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);   //设置中断优先级的分组
      NVIC_init(USART1_IRQn,1,1,ENABLE);                              //设置串口中断的优先级和从优先级并使能
      //在串口初始化函数中使能串口接收中断 并在接收中断函数中填写相应代码
      UART_init(115200,USART_WordLength_8b,USART_StopBits_1,USART_Parity_No,USART_Mode_Tx|USART_Mode_Rx);
      SysTick_init();
      while(1)
      {
            delay_ms(1000);
            delay_ms(1000);
            printf("sss");
            delay_ms(1000);
            delay_ms(1000);
      }

}
页: [1]
查看完整版本: STM32-中断优先级