STM32
直播中

独当一面

9年用户 797经验值
擅长:可编程逻辑
私信 关注
[问答]

stm32中断优先级的分组分别有哪几种情况?

STM32中断优先级的分组分别有哪几种情况?

回帖(1)

袁丹

2021-11-18 10:54:37
stm32学习之中断事件    相信很多小伙伴们早已在51系列的板子上接触中断,大概的概括便是:正在看电影的你,突然来了快递,你暂停了电影去签收了快递,回来继续看电影这便是一级中断。而多级中断也是一样,优先级高的就优先处理,就如在你去签收快递的时候,电话突然来了,电话的优先级更高,所以优先接电话。




而STM32F10x 芯片有 84 个中断通道,包括 16 个内核中断和 68 个可屏蔽中断,他有着自己的中断控制器NVIC,NVIC有控制着中断的相关功能(其中包括中断源、抢占优先级、响应优先级、中断的使能与失能)的功能。每一个中断都有着自己的地址,一旦中断来,cpu便会去到相应的地址处理相对应的中断,这个地址叫中断向量,以下是stm32f1对应的向量表:





在介绍中断的配置之前,优先级的知识梳理一下,一个中断的优先级由两部分决定,一个是抢占式优先级,还有一个是响应优先级。两个优先级组成了一个4位的控制字。 中断优先级分组,因为中断优先级只使用了高4位,所以,中断优先级的分组分别有以下几种情况:




在这连接一个大佬的文章:https://blog.csdn.net/qq_35547767/article/details/82688811
好了,接下来的是有关事件和中断的科普,事件中断和软件中断有什么区别呢,简单来说,事件是外接设备状态变化来了电平信号,不用通过软件的服务函数,仅仅靠硬件便能得到结果,而中断是要cpu的参与,中断来了之后通过写好的中断函数去处理中断。如图,3这个或门的另一个输入是软件中断/事件寄存器,软件可以优先于外部信号请求一个中断或事件,即当软件中断/事件寄存器的对应位为"1"时,不管外部信号如何,编号3的或门都会输出有效信号。4号和6号的屏蔽器用与门来控制。




在此连接一个大佬的文章:https://www.cnblogs.com/smartjourneys/articles/7363114.html
好了,明白这些基础知识后,开始配置中断函数,首先,我要做的是按键中断实验,当按下key0时,led灯状态翻转,先是配置EXTI(外部中断控制器),在这里,小伙伴们可能会问,怎么扯上这个EXTI,是这样的,中断有份外部中断和内部中断,内部中断是指内部定时器、串口、AD、IIC、SPI等等资源的中断,而外部中断则是外部信号引起的中断,如高电平、低电平、上升沿、下降沿等。我做的是外部中断,所以要配置EXTI控制器,其实也是照猫画虎一样,配置EXTI的结构体:
EXTI_InitTypeDef Extra;
Extra.EXTI_Line=EXTI_Line4; //EXTI4对应GPIO的PA4-PG4
Extra.EXTI_Mode=EXTI_Mode_Interrupt;
Extra.EXTI_Trigger=EXTI_Trigger_Falling;
Extra.EXTI_LineCmd=ENABLE;
EXTI_Init(&Extra);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);//选择GPIOE,4的引脚作为中断发生源
然后要配置的是NVIC的结构体:
NVIC_InitTypeDef Press;
Press.NVIC_IRQChannel=EXTI4_IRQn;
Press.NVIC_IRQChannelSubPriority=2;
Press.NVIC_IRQChannelPreemptionPriority=2;
Press.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&Press);
接下来要配置的是中断发生的服务函数,就是中断来了之后的处理函数:
void EXTI4_IRQHandler()
{

        /*  key0¼üµÄ³õʼ»¯  */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
        GPIO_InitTypeDef pre;
        pre.GPIO_Pin=GPIO_Pin_4;
        pre.GPIO_Mode=GPIO_Mode_IPD;
        pre.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOE,&pre);
        GPIO_SetBits(GPIOE,GPIO_Pin_4);
        }
好了,代码就是这些了,要记得初始化key0的时钟是AFIO,至于LED的初始化在这里就不放上来了
举报

更多回帖

发帖
×
20
完善资料,
赚取积分