5a29af638a17bf85694d13014eeb73fa.png

\\\插播一条:

自己在今年整理一套单片机单片机相关论文800余篇

论文制作思维导图

原理图+源代码+开题报告+正文+外文资料

想要的同学私信找我。

STM32中断如此简单

下面我们先来了解一些根本概念:

中断:中断是什么?举个例子来说,当我们正在工作时,忽然电话响了,这时你会把手里的工作先停下来,其次去接电话,当接完电话后,电话里的人安排你马上做一件事,这时你须要立刻去做这件事,当把这件事做完后你会继续之前被打断的工作,这个过程为一次中断。

异常:一个系统本应该正常的运行,但由于某些条件使系统产生了错误,就会使系统运行不正常,我们称之为异常。就好比一个强健的人,假如身体某个器官出现了问题,那他将会生病,不能像以前那样强健生活,称他的身体出现了异常。系统出现异常,我们必需对异常做出处理,才能让系统正常运行。

事件:假如一个教师在教室里给学生上课,下面的学生会做出各种不同的动作,如有仔细记笔记的,有讲小话的,有翻自己书包的等等,我们把学生的这些行为称为事件。但教师对这些事件有些是不会有动作的,有些事件是须要教师干预的,假如两个学生讲话,影响了教师上课,教师须要警告讲话的学生,其次再继续上课。

优先级:当我们接到了两个电话,两个电话都安排你去做别的事,这时你须要先完成比较急的事,其次再完成不是太急的事,这就是优先级的问题。当有多个中断时,我们须要依据中断优先级判断先响应优先级高的中断,其次再响应优先级低的中断。

中断与事件的联络与差别:有些事件须要响应,称这个事件为可中断事件,但有些事件不须要做出响应称这些事件为不可中断事件。当硬件正常连接时,对应事件会自动产生,但中断则需软件配置相应的中断使能位。

抢占式优先级和响应优先级:所谓抢占式优先级和响应优先级,具有高抢占式优先级的中断能够在低抢占式优先级中断处理过程中被响应,即中断嵌套。当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,假如正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。假如这两个中断同时到达,则中断控制器依据他们的响应优先级高低来决定先处理哪一个;假如他们的抢占式优先级和响应优先级都相等,则依据他们在中断表中的排位顺序决定先处理哪一个。每一个中断源都必需定义2个优先级。

STM32的中断管理利用了NVIC(Nested Vectored Interrupt Controller)嵌套向量中断控制器,它把所有的外设中断和系统异常用一张向量表来管理,每个系统异常和外设中断都被分配相应的地址,除了一些系统异常的优先级不能变更外,其余的系统异常和中断的优先级都可变化。详细向量表局部截图如下图所示:

5bdfeb81d8de3ac9eeaaa4cf78eac729.png

53f1eb7da5862f3cf6ac3f363d597c2b.png

0941e2f0db8279b211fbe5583c883cf9.png

其中包括10个系统异常,有82个外部中断地址,其中有11个被保留,没有运用,从上表可查出对应的默认优先级和地址分配情况。

NVIC是嵌套向量中断控制器,它控制芯片所有中断功能,是Cortex-Mx内核里的一个外设下图为Cortex-M4内核NVIC寄存器的分布图:

01534783bc07e777157d91238fe7d475.png

从上图能够看出,Cortex-M4内核NVIC嵌套向量中断控制器总的有7个类型的寄存器,其中有1个控制器类型的寄存器,8个中断使能寄存器,8个中断失能寄存器,8个中断挂起设定/革除寄存器,8个中断有效位寄存器,60个中断优先级寄存器。而ST对CM4内核NVIC控制器寄存器做了一定缩减,其寄存器分布图如下:

470a49b48bcdee60cc5b20f37dc8380b.png

在中断编程时,我们一般运用ST提供的固件库,对中断配置在程序编写时我们一般就运用中断使能、中断失能、中断优先级设定三个寄存器。

NVIC嵌套向量中断控制器里有一个用于管理中断优先级的寄存器NVIC_IPRx(x=0,1,20),其数据位宽度为8bit,假如8位全运用,则可配置的优先级为0-255,数值小的优先级越高,但在STM32F373中,只是运用了高4位,可配置的优先级为0-15。

这4位又被分为抢占优先级和响应优先级。对这4位又有5种搭配方式,定义抢占优先级和响应优先级的位数,其分组由内核外设SCB模块的应用程序中断及复位控制寄存器AIRCR的bit8-bit10(PRIGROUP[0:2])三位决定,分组可用下图所示:

66d87f7e27e68e36336d64af2fd17a95.png

ST官方已经把设定优先级分组封装成了一个库函数,我们设置优先级分组时,可直接调用有关库函数即可,中断库函数可在官方库文件misc.c和misc.h中找得到,其优先级分组设定函数如下图所示:

3040a281163e753f9cf2f3317c9f88eb.png

如我们想设置0位响应优先级、4位抢占优先级即优先级分组0,其函数可写为:

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

那我们仅仅是配置了优先级就够了吗?我们还须要配置通道,即配置中断源,依照前面中断向量表中的Position中断编号来查询即可配置即可。配置了中断源后,我们还需对中断源使能中断,ST官方把通道配置、优先级设定、通道使能定义为了一个构造体,其定义如下:

ddd68b6be9cafc5d4fc21b1b43fe8f46.png

下面我们以USART1为例,配置中断优先级分组为3,即3位响应优先级,1位抢占优先级,抢占优先级级数为0,响应优先级级数为1,对其编写程序如下:

Void NVIC_Init(void)

{

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3); //配置优先级分组

NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn; //USART1中断通道

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级为最高 0

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //响应优先级为 1

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断通道

NVIC_Init(&NVIC_InitStructure); //将构造体成员的值写入对应的寄存器

}

至此,中断篇讲解完毕,更多详细的NVIC的介绍

7ff5a344dca836310b69d88b0471f765.png6f3b0907c5c3d6e367f6b41d7f5a7412.pngb9e41218b6cd5d38c4acc3088176b8af.png

说了这么多,大家记得留意下方评论第一条(或者私信我)有干货~

-END-

*本文系网络转载,版权归原作者所有,如有侵权请联系删除

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐