中断及EXTI的配置


中断的定义

为什么要有中断?

问题:闪烁灯 执行 同时 按键控制蜂鸣器?

image-20201116192712830

问题: 按键的检测频率: 500ms

​ 采样的速度太慢,导致按键的实时性很低。

如果有一个事务,CPU不知道它什么时候会触发;但是一旦触发,需要立即执行,对于这种事务,我们可以做成中断。

中断的概念

Cortex-M3响应中断的形式:

image-20201116195413273
  1. 中断的作用:实时性
  2. 中断源:能够产生中断请求的。(固定的)
  3. 中断优先级:中断同时到来,谁先执行。--数字越小,优先级越高。

(1). 内核的NVIC--嵌套向量中断控制器

NVIC 分了两个部分

抢占(占先):高优先级 可打断低优先级

次级:同时到来先执行谁

中断优先级的分组:

image-20201116193441344

优先级分组 分的是抢占 次级 在 优先级寄存器内所占的位数

(2). STM32F10x的 NVIC使用

16个可编程的优先级分组(使用了4位中断优先级)

image-20201116193811784

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

  1. 中断响应:中断事件发生,Cortex-M3内核准备执行该事件 -- 响应。

  2. 中断嵌套:内核

    可嵌套的内核: 中断可以被其他中断打断。
    不可嵌套的内核: 不可以打断。

  3. 中断挂起:中断事件发生了,但是Cortex-M3内核还没准备去执行。

  4. 中断服务函数:中断发生后,要执行的程序。(固定格式或则别人要求)

中断服务函数,需要有一个入口地址,而对于STM32来说,中断服务函数的入口地址(中断向量表),在startup_stm32f10x_md.s中。

image-20201116194721785

中断服务函数:执行的特点:

只进行一些 标志位的设置,一般是不允许有延时操作,中断服务函数可以称之为 “执行的速度很快”。

中断服务函数的书写方法:

stm32f10x_it.c 中是官方推荐我们将“中断服务函数”写在这一个文件夹中。

函数的书写方法:void xxx_Handler(void),当发生中断时,由于有中断服务函数向量表,所以CPU 会自动找到这个函数,并且执行这个函数中的操作。

image-20201116195010682

STM32的 EXTI配置

寄存器配置

EXTI的寄存器

image-20201116195755013

硬件中断选择

通过下面的过程来配置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映像

image-20201116200114254

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

外部中断(EXTI)的中断源

image-20201116200459294

EXTI 寄存器描述

中断屏蔽寄存器(EXTI_IMR)

中断使能

image-20201116200607099

事件屏蔽寄存器(EXTI_EMR)

当你配置为事件模式

image-20201116200705190

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

image-20201116200905969

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

image-20201116200928096

软件中断事件寄存器(EXTI_SWIER)

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

image-20201116201123960

挂起寄存器(EXTI_PR)

中断标志位

image-20201116201209547

程序代码

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的配置函数(内核提供的配置函数);

image-20201116205042541

image-20201116205109251

2、这四个函数是使用 寄存器 来配置的函数,与 库函数 的四个NVIC函数不同。

3、寄存器配置是用的NVIC功能函数 在 core_cm3.h

image-20201116205509687
image-20201118222235978 image-20201118222319553

EXTI的库函数配置

1、中断源的选择

包含文件:

image-20201116210249582 image-20201116210408964

开时钟,选择EXTI 中断的 中断源

image-20201116210504454

中断源的选择函数: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

image-20201116210821164

外部中断触发方式

1、上升沿

2、下降沿

3、上升沿和下降沿

NVIC的配置

NVIC中断的分组:在程序的最开始就给NVIC(嵌套向量中断控制器)分好组

image-20201116211152741

配置对应中断的NVIC的优先级和使能。

image-20201116211103263

中断服务函数

中断向量:XXX_Handler

image-20201116211544012

中断服务函数的书写:void EXTI0_IRQHandler(void)

image-20201116212227115


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM