STM32外部中断的配置(NVIC)

概要

先介绍NVIC,NVIC在单片机中不属于单片机的普通外设它属于核心外设,它是包含在Cortex-3内核中,我们可以理解为普通的外设他们住在普通的房子内,而NVIC住在皇宫。(图片来源于铁头山羊)

了解中断协作模型

在配置NVIC之前,我们先要了解外部中断的协作模型,如下图所谓中断的协作模型,就是发生一次中断的全流程,从开始的外设产生中断源,到外部中断源传导到NVIC(管理中断),再到NVIC到FIash中的中断向量表,最后再由中断向量表指向中断响应函数。

中断向量表的理解

了解完中断协作模型后,我们需要了解一下什么是中断向量表 官方的解释是:Flash存储内部从地址0开始的一段区域,按照中断号排列,每四个字节存储一个中断响应函数的地址。简单的说就是在中断向量表中存储着我们不同中断需要的不同中断响应函数,因为中断类型是有很多种的,有串口外部中断I2C外部中断,中断的类型有很多种,这就导致每一种中断对应的中断函数也不同,而我们需要根据中断向量表来找寻我们所需要的中断所对应的中断服务函数。(图片来源于铁头山羊)

代码编程

我们进入中断编程部分

我们已配置串口外部中断为例

我们编程首先要做的就是在底层驱动文件中找该外设对应的接口函数,而NVIC的接口函数是在misc.h中(跟以前的gpio不同有自己单独的驱动文件gpio.h)我们点开misc.h文件,下图中的函数就是我们NVIC的全部接口函数,而我们在中断中需要配置的是

NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);(中断分组函数)

NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

(NVIC初始化函数)

我们继续详细了解这两个函数

  1. NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);在这个函数中我们需要填入一个uint32_t类型的NVIC_PriorityGroup变量,而这个变量的取值可以是下图的四个参数,这四个参数分别代表不同的中断分组(对中断分组不了解的可以看我前面那篇文章)我们选择NVIC_PriorityGroup_2分组2,抢占和子优先级都能各分到2bits.
  2. 2. NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

    NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);在这个函数中我们需要填入的是一个结构体NVIC_InitTypeDef,我们继续跳转看一看这个结构体内部有那些参数,NVIC_InitTypeDef

    中有四个参数,我们逐一解释和学习 第一个参数NVIC_IRQChannel;我们看这个参数旁边的详解,解释到这个参数可以是IRQn_中的某个参数,我们继续跳转IRQn_

  3. 补充如何跳转:跳转就是勾选IRQn_然后ctrl+f 然后把里面的current Document 改为current Project然后点击Find Next然后就会跳转到,我们看到这个里面有很多数值,那么我们该如何找到我们所需要的串口外部中断所需要的函数值呢?

    想要找到串口中断所需要的函数值,就要借助我们的中断向量表,我们打开参考手册翻到翻到9.1.2节

    看到如下图这张表,这个表中我们需要关注的就是,中断名称,我们可以根据中断名称找到我们所需要配置的中断,然后就是中断号,我们可以根据中断号在我们的驱动文件中找到此种中断对应的函数值,我们用实际例子加深理解(图片来源于铁头山羊)比如我们现在配置的是USART1的外部中断,我们现在中断向量表中找到它所处的位置,然后发现它的位置是37号。根据37这个数字,我们继续回到底层驱动文件(这个文件就是我们刚才跳转的IRQn_),我们看图中的37 就是我们需要的函数参数。根据37这个数字,我们继续回到底层驱动文件(这个文件就是我们刚才跳转的IRQn_),我们看图中的37 就是我们需要的函数参数。

    那么经过上面的讲解我们就知道第一个参数NVIC_IRQChannel如何填了。

    第二和第三个参数其实是一个东西 就是配置抢占优先级和子优先级(这个东西我在以前的博客中有讲,在此我们直接配置)第四个参数就是使能 直接填ENABLE就可以了,最终的效果如下图在上述的一系列配置下 ,我们就成功配置了串口1的外部中断。

  • 13
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值