中断的定义
为什么要有中断?
问题:闪烁灯 执行 同时 按键控制蜂鸣器?

问题: 按键的检测频率: 500ms
采样的速度太慢,导致按键的实时性很低。
如果有一个事务,CPU不知道它什么时候会触发;但是一旦触发,需要立即执行,对于这种事务,我们可以做成中断。
中断的概念
Cortex-M3响应中断的形式:

- 中断的作用:实时性
- 中断源:能够产生中断请求的。(固定的)
- 中断优先级:中断同时到来,谁先执行。--数字越小,优先级越高。
(1). 内核的NVIC--嵌套向量中断控制器
NVIC 分了两个部分
抢占(占先):高优先级 可打断低优先级
次级:同时到来先执行谁
中断优先级的分组:
优先级分组 分的是抢占 次级 在 优先级寄存器内所占的位数
(2). STM32F10x的 NVIC使用
16个可编程的优先级分组(使用了4位中断优先级)
![]()
xxxx 抢占:0-15
xxx.y 抢占:0-7 次级0-1
xx.yy 抢占:0-3 次级0-3
x.yyy 抢占:0-1 次级0-7
yyyy 次级0-15对于只使用了4位优先级寄存器的芯片, 分组时PRIGROUP[2:0]寄存器值0-3 的分组 只有抢占优先级。
一个芯片在写程序时 优先级分组 分几次???
只分一次,在程序的最开始分组,接下来所配置的中断优先级都按照上面的分组情况来分
例如 : 分组 5 抢占2 次级2
某中断: 01 01
01 01 5 就是这个中断的优先级 两个抢占 两个次级
取值范围: 0-3 0-3
取值:0 – 15( 4位优先级管理 )
0 0000 00 00
1 0001 00 01
2 0010 00 10
-
中断响应:中断事件发生,Cortex-M3内核准备执行该事件 -- 响应。
-
中断嵌套:内核
可嵌套的内核: 中断可以被其他中断打断。
不可嵌套的内核: 不可以打断。 -
中断挂起:中断事件发生了,但是Cortex-M3内核还没准备去执行。
-
中断服务函数:中断发生后,要执行的程序。(固定格式或则别人要求)
中断服务函数,需要有一个入口地址,而对于STM32来说,中断服务函数的入口地址(中断向量表),在
startup_stm32f10x_md.s
中。![]()
中断服务函数:执行的特点:
只进行一些 标志位的设置,一般是不允许有延时操作,中断服务函数可以称之为 “执行的速度很快”。
中断服务函数的书写方法:
stm32f10x_it.c
中是官方推荐我们将“中断服务函数”写在这一个文件夹中。函数的书写方法:
void xxx_Handler(void)
,当发生中断时,由于有中断服务函数向量表,所以CPU 会自动找到这个函数,并且执行这个函数中的操作。
STM32的 EXTI配置
寄存器配置
EXTI的寄存器

硬件中断选择
通过下面的过程来配置20个线路做为中断源:
● 配置20个中断线的屏蔽位(EXTI_IMR)
● 配置所选中断线的触发选择位(EXTI_RTSR和EXTI_FTSR);
● 配置对应到外部中断控制器(EXTI)的NVIC中断通道的使能和屏蔽位,使得20个中断线中的请求可以被正确地响应。
硬件事件选择
通过下面的过程,可以配置20个线路为事件源
● 配置20个事件线的屏蔽位(EXTI_EMR)
● 配置事件线的触发选择位(EXTI_RTSR和EXTI_FTSR)
软件中断/事件的选择
20个线路可以被配置成软件中断/事件线。下面是产生软件中断的过程:
● 配置20个中断/事件线屏蔽位(EXTI_IMR, EXTI_EMR)
● 设置软件中断寄存器的请求位(EXTI_SWIER)
外部中断/事件线路映像
外部中断通用I/O映像

通过AFIO_EXTICRx配置GPIO线上的外部中断/事件,必须先使能AFIO时钟。
外部中断(EXTI)的中断源

EXTI 寄存器描述
中断屏蔽寄存器(EXTI_IMR)
中断使能

事件屏蔽寄存器(EXTI_EMR)
当你配置为事件模式

上升沿触发选择寄存器(EXTI_RTSR)

下降沿触发选择寄存器(EXTI_FTSR)

软件中断事件寄存器(EXTI_SWIER)
软件触发中断,用软件的方式将对应位置1,可以触发中断的产生,进而转入中断服务函数,执行对应的服务函数。

挂起寄存器(EXTI_PR)
中断标志位

程序代码
void EXTI0_Config(void)
{
//配置AFIO时要打开时钟
RCC->APB2ENR |= (0x1<<0);
//EXTI0的中断源选择:默认是PA0
AFIO->EXTICR[0] |= (0x00<<0);
//EXTI的中断配置
EXTI->IMR |= (0x1<<0);
EXTI->FTSR |= (0x1<<0);
// EXTI->RTSR |= (0x1<<0);
EXTI->PR |= (0x1<<0);
//NVIC的配置
NVIC_SetPriority(EXTI0_IRQn, 0x00);
NVIC_EnableIRQ(EXTI0_IRQn);
}
//中断服务函数
void EXTI0_IRQHandler(void)
{
EXTI->PR |= (0x1<<0); //清除中断标志
Beep_Toggle(BEEP_PORT, BEEP_PIN);
}
内核的NVIC中断管理的函数
1、 4个常用的NVIC的配置函数(内核提供的配置函数);
2、这四个函数是使用 寄存器 来配置的函数,与 库函数 的四个NVIC函数不同。
3、寄存器配置是用的NVIC功能函数 在 core_cm3.h

EXTI的库函数配置
1、中断源的选择
包含文件:
![]()
![]()
开时钟,选择EXTI 中断的 中断源
![]()
中断源的选择函数:
GPIO_EXTILineConfig
/** * @brief Selects the GPIO pin used as EXTI Line. * @param GPIO_PortSource: selects the GPIO port to be used as source for EXTI lines. * This parameter can be GPIO_PortSourceGPIOx where x can be (A..G). * @param GPIO_PinSource: specifies the EXTI line to be configured. * This parameter can be GPIO_PinSourcex where x can be (0..15). * @retval None */ void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource) { uint32_t tmp = 0x00; /* Check the parameters */ assert_param(IS_GPIO_EXTI_PORT_SOURCE(GPIO_PortSource)); assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource)); tmp = ((uint32_t)0x0F) << (0x04 * (GPIO_PinSource & (uint8_t)0x03)); AFIO->EXTICR[GPIO_PinSource >> 0x02] &= ~tmp; AFIO->EXTICR[GPIO_PinSource >> 0x02] |= (((uint32_t)GPIO_PortSource) << (0x04 * (GPIO_PinSource & (uint8_t)0x03))); }
EXTI的配置
EXTI中断的配置函数:
EXTI_Init
![]()
外部中断触发方式
1、上升沿
2、下降沿
3、上升沿和下降沿
NVIC的配置
NVIC中断的分组:在程序的最开始就给NVIC(嵌套向量中断控制器)分好组
![]()
配置对应中断的NVIC的优先级和使能。
![]()
中断服务函数
中断向量:
XXX_Handler
![]()
中断服务函数的书写:
void EXTI0_IRQHandler(void)
![]()