STM32之中断

STM32中断很强大,STM32中断可以嵌套,任何外设都可以产生中断,其中中断和异常是等价的.

中断概述

中断,在单片机中占有非常重要的地位。代码默认地从上向下执行,遇到条件或者其他语句,会按照指定的地方跳转。而在单片机执行代码的过程中,难免会有一些突发的情况需要处理,这样就会打断当前的代码,待处理完突发情况之后,程序会回到被打断的地方继续执行。

中断类型

  • 系统异常,体现在内核水平(10个)
  • 外部中断,体现在外设水平(60个)
    有关系统异常和外部中断的清单可查阅参考手册第9章的
    向量表部分。

NVIC简介

NVIC:嵌套向量中断控制器,属于内核外设,管理着包括内核和片上所有外设的中断相关的功能。
两个重要的库文件:
core_cm3.hmisc.h,NVIC的库函数定义全在misc.h
STM32之中断
在配置中断的时候我们一般只用ISER、ICER和IP这三个寄存器,ISER用来使能中断,ICER用来失能中断,IP用来设置中断优先级。

中断优先级定义

优先级设定:NVIC->IPRx
STM32之中断
通过NVIC_PriorityGroup函数。
STM32之中断

优先级分组:SCB->AIRCR:PRIGROUP[10:8]
STM32之中断

中断编程顺序

1、使能中断请求

如何使能,需要配置哪个寄存器?

注意:这里与NVIC中的中断使能寄存器不是等同概念,这个具体由每个外设的相关中断使能位控制。比如串口有发送完成中断,接收完成中断,这两个中断都由串口控制寄存器的相关中断使能位控制。

2、配置中断优先级分组

如何配置,需要配置哪个寄存器?

通过NVIC_PriorityGroup函数。
NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
//misc.c 96行

3、配置NVIC寄存器,初始化NVIC_InitTypeDef;(定义在misc.h中,成员如下)

1-NVIC_IRQChannel:指定中断源

2-NVIC_IRQChannelPreemptionPriority:抢占优先级

3-NVIC_IRQChannelSubPriority:子优先级

4-NVIC_IRQChannelCmd:使能或者失能

4、编写中断服务函数

在启动文件 startup_stm32f10x_hd.s 中我们预先为每个中断都写了一个中断服务函数,只是这些中断函数都是为空,为的只是初始化中断向量表。实际的中断服务函数都需要我们重新编写,为了方便管理我们把中断服务函数统一写在 stm32f10x_it.c 这个库文件中。关于中断服务函数的函数名必须跟启动文件里面预先设置的一样,如果写错,系统就在中断向量表中找不到中断服务函数的入口,直接跳转到启动文件里面预先写好的空函数,并且在里面无限循环,实现不了中断。