《野火STM32F407 霸天虎版》学习笔记——第17章、第18章 中断概览与EXTI外部中断


前言

STM32 中断非常强大,每个外设都可以产生中断。本章对于STM32的中断及具有代表性的EXTI中段做了总结,EXTI即外部中断控制器,管理了控制器的 23 个中断线。由于异常和中断并没有太大的区别,所以接下来提到的异常即中断,中断即异常。


一、异常类型

STM32F407系列支持系统异常有10个,外部中断有82个。除了个别的异常的优先级被定死之外,其它的异常的优先级都是可编程的。有关具体的系统异常和外部中断可在标准库文件 stm32f4xx.h 这个头文件查询到。

F407系列的异常清单如下:
在这里插入图片描述

其中优先级的数值越低,代表的异常优先级越高。


二、NVIC简介

NVIC是嵌套向量中断控制器,控制着整个芯片中断相关的功能,是内核里面的一个外设。

1.NVIC 寄存器简介

1 typedef struct {
2 __IO uint32_t ISER[8]; // 中断使能寄存器
3 uint32_t RESERVED0[24];
4 __IO uint32_t ICER[8]; // 中断清除寄存器
5 uint32_t RSERVED1[24];
6 __IO uint32_t ISPR[8]; // 中断使能悬起寄存器
7 uint32_t RESERVED2[24];
8 __IO uint32_t ICPR[8]; // 中断清除悬起寄存器
9 uint32_t RESERVED3[24];
10 __IO uint32_t IABR[8]; // 中断有效位寄存器
11 uint32_t RESERVED4[56];
12 __IO uint8_t IP[240]; // 中断优先级寄存器 (8Bit wide)
13 uint32_t RESERVED5[644];
14 __O uint32_t STIR; // 软件触发中断寄存器
15 } NVIC_Type;

在配置中断的时候我们一般只用 ISER、ICER 和 IP 这三个寄存器,ISER 用来使能中断,ICER 用
来失能中断,IP 用来设置中断优先级。

2.NVIC中断配置固件库

在这里插入图片描述


三、优先级的定义

1.优先级定义

在NVIC中有一个专门的寄存器:中断优先寄存器NVIC_IPRx用来配置外部中断的优先级,在F407中,只使用到了寄存器的4bit来配置外部中断的优先级。

用于表达优先级的这 4bit,又被分组成抢占优先级和子优先级。如果有多个中断同时响应,抢占
优先级高的就会抢占抢占优先级低的优先得到执行,如果抢占优先级相同,就比较子优先级。如
果抢占优先级和子优先级都相同的话,就比较他们的硬件中断编号,编号越小,优先级越高。

2.优先级分组

优先级的分组由内核外设 SCB 的应用程序中断及复位控制寄存器 AIRCR 的 PRIGROUP[10:8] 位
决定。
在这里插入图片描述

设置优先级分组可调用库函数 NVIC_PriorityGroupConfig() 实现,有关 NVIC 中断相关的库函数都
在库文件 misc.c 和 misc.h 中。

1 /**
2 * 配置中断优先级分组:抢占优先级和子优先级
3 * 形参如下:
4 * @arg NVIC_PriorityGroup_0: 0bit for 抢占优先级
5 * 4 bits for 子优先级
6 * @arg NVIC_PriorityGroup_1: 1 bit for 抢占优先级
7 * 3 bits for 子优先级
8 * @arg NVIC_PriorityGroup_2: 2 bit for 抢占优先级
9 * 2 bits for 子优先级
10 * @arg NVIC_PriorityGroup_3: 3 bit for 抢占优先级
11 * 1 bits for 子优先级
12 * @arg NVIC_PriorityGroup_4: 4 bit for 抢占优先级
13 * 0 bits for 子优先级
14 * @ 注意 如果优先级分组为 0,则抢占优先级就不存在,优先级就全部由子优先级控制
15 */
16 void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
17 {
18 // 设置优先级分组
19 SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
20 }

四、中断编程

在对每个外设配置中断的过程中,有三个要点:

  1. 使能外设某个中断,这个具体由每个外设的相关中断使能位控制。比如串口有发送完成中断,
    接收完成中断,这两个中断都由串口控制寄存器的相关中断使能位控制。
  2. 初始化 NVIC_InitTypeDef 结构体,配置中断优先级分组,设置抢占优先级和子优先级,使能
    中断请求。
  3. 编写中断服务函数。

第一点不用多说,第二点在初始化NVIC_InitTypeDef结构体之前,我们要先了解一下它的结构体成员。

1 typedef struct {
2 uint8_t NVIC_IRQChannel; // 中断源
3 uint8_t NVIC_IRQChannelPreemptionPriority; // 抢占优先级
4 uint8_t NVIC_IRQChannelSubPriority; // 子优先级
5 FunctionalState NVIC_IRQChannelCmd; // 中断使能或者失能
6 } NVIC_InitTypeDef;

(1). NVIC_IROChannel:用来设置中断源,不同的中断中断源不一样,且不可写错,即使写错了程
序不会报错,只会导致不想要中断。具体的成员配置可参考 stm32f4xx.h 头文件里面的 IRQn_Type
结构体定义,这个结构体包含了所有的中断源。
(2). NVIC_IRQChannelPreemptionPriority:抢占优先级,具体的值要根据优先级分组来确定,具体
参考表格优先级分组真值表。
(3). NVIC_IRQChannelSubPriority:子优先级,具体的值要根据优先级分组来确定,具体参考表格
优先级分组真值表 。
(4). NVIC_IRQChannelCmd:中断使能(ENABLE)或者失能(DISABLE)。操作的是 NVIC_ISER和 NVIC_ICER 这两个寄存器。

至于第三点编写中断服务函数,在启动文件 startup_stm32f40xx.s 中我们预先为每个中断都写了一个中断服务函数,只是这些中断函数都是为空,为的只是初始化中断向量表。实际的中断服务函数都需要我们重新编写,中断服务函数我们统一写在 stm32f4xx_it.c 这个库文件中。

关于中断服务函数的函数名必须跟启动文件里面预先设置的一样,如果写错,系统就在中断向量
表中找不到中断服务函数的入口,直接跳转到启动文件里面预先写好的空函数,并且在里面无限
循环,实现不了中断。


五、EXTI 简介

掌握EXTI最重要的是掌握EXTI功能框图,对EXTI有一个整体的把握,在编程时的思路就非常清晰了。

EXTI功能框图如下:
在这里插入图片描述
EXTI 功能框图 中红色虚线指示的电路流程。它是一个产生中断的线路,最终信号流入到 NVIC 控制器内。绿色虚线指示的电路流程。它是一个产生事件的线路,最终输出一个脉冲信号。
另外,EXTI 是在 APB2 总线上的,在编程时候需要注意到这点。

六、中断/事件线

EXTI 有 23 个中断/事件线,每个 GPIO 都可以被设置为输入线,占用 EXTI0 至 EXTI15,还有另外七根用于特定的外设事件,见表 EXTI 中断/事件线。

表EXTI中断/事件线如下:
在这里插入图片描述

七、EXTI 初始化结构体详解

标准库函数对每个外设都建立了一个初始化结构体,比如 EXTI_InitTypeDef,结构体成员用于设置外设工作参数,并由外设初始化配置函数,比如 EXTI_Init() 调用。

初始化结构体定义在 stm32f4xx_exti.h 文件中,初始化库函数定义在 stm32f4xx_exti.c 文件中,编程时我们可以结合这两个文件内注释使用。

1 typedef struct {
2 uint32_t EXTI_Line; // 中断/事件线,可选EXTI0至EXTI22
3 EXTIMode_TypeDef EXTI_Mode; // EXTI 模式,可选为产生中断或者产生事件
4 EXTITrigger_TypeDef EXTI_Trigger; // 触发事件,可以选择上升沿触发或下降沿触发
5 FunctionalState EXTI_LineCmd; // EXTI 控制,控制是否使能EXTI线,可选使能EXTI线或禁用
6 } EXTI_InitTypeDef;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值