STM32中断与DMA通信编程
一、STM32中断
1.概念简述
中断是指计算机运行过程中,出现某些意外情况需要计算机处理时,技能能自动暂停正在运行的程序并转入处理新情况的程序,处理完毕后又返回原先被暂停的程序继续运行的功能。
举一个生活例子来说明:小明在厨房干活,流程是烧水——洗菜——切菜——煮饭——煮汤。烧水需要10分钟,当小明加完水点火后,需要等10分钟才能烧完水。此时小明为了提高效率,不应该白白地10分钟,于是小明继续洗菜。洗菜的过程中,水开了,烧水壶发出了声音,小明停止手里正在洗菜的工作,把烧水的火关了,防止烧干,然后回来继续洗菜。
这个过程中,小明在洗菜等同于计算机正在处理当前程序。水开了等同于中断发生了;小明停止洗菜,去把火关了,等同于计算机开始处理新程序。之后小明继续回来洗菜等同于计算机返回原先被暂停的程序继续运行。
通过这个例子,我们可以知道中断有3个重要的因素:
(1)中断源。引发中断发生的原因,例如水开了就是一个中断源。
(2)中断处理函数。当中断发生时,我们必须为计算机指定该中断对应的处理函数,否则计算机不知道如何处理这个中断。例如小明把火关了这个动作就是中断处理函数。
(3)可返回。中断处理完后必须返回到原先程序。
中断是计算机系统的关键技术之一,可以有效提高计算机的效率,满足实时性的要求。
2.STM32中断向量表
STM32具有非常强大的中断系统,将中断分为两种类型:内核中断和外部中断,并将所有中断编排起来,形成一个表,我们称之为中断向量表。需要注意的是,STM32系列芯片有很多型号,每种型号的中断向量表都不一样,读者需要根据自己的芯片型号去ST官网下载对应的芯片手册查看。本书这里只列出STM32F407系列芯片的中断向量表。如图4.29所示。
其中,-3 ~ 6 被标黑的这几列属于内核中断。从7开始属于外部中断。
内核中断是不能被打断的,也不能设置优先级的,凌驾于外部中断之上。常见的内核中断有:复位(Reset)、不可屏蔽中断(NMI)、硬中断(HardFault)等
外部中断是我们学习的重点,可配置优先级。优先级分为两种:抢占优先级和响应优先级。
(1) 抢占优先级
抢占优先级高的中断能打断抢占优先级低的中断,等优先级高的任务处理完后,再回来继续处理之前低优先级的中断任务。所有当存在多个抢占优先级不同的任务时,可能会出现
(2) 响应优先级
响应优先级又被称为次优先级,若两个任务的抢占式优先级一样,那么响应优先级较高的任务则先执行,且在执行的同时不能被下一个响应优先级更高的任务打断。
STM32F405xx/07xx 和 STM32F415xx/17xx 具有 82 个可屏蔽中断通道,16 个可编程优先级(使用了 4 位中断优先级)。
3.中断控制器
由于STM32的中断系统比较复杂,所以内核中有一个专门管理中断的控制器:NVIC。
STM32标准库提供了一套通过NVIC来控制中断的API。我们首先来看NVIC_Init()函数,这套函数首先要定义并填充一个结构体:NVIC_InitTypeDef 该结构体的定义如下:
NVIC_IRQChannel :需要配置的中断向量。
NVIC_IRQChannelCmd :使能或者关闭相应中断向量的中断响应。
NVIC