STM32---中断

一、STM32中断概述


处理器中的中断
       在处理器中,中断是一个过程,即CPU在正常执行程序的过程中,遇到外部/内部的紧急事件需要处理,暂时中止当前程序的执行,转而去为处理紧急的事件,待处理完毕后再返回被打断的程序处继续往下执行。中断在计算机多任务处理,尤其是即时系统中尤为重要。比如uCOS,FreeRTOS等。

意义
        中断能提高CPU的效率,同时能对突发事件做出实时处理。实现程序的并行化,实现嵌入式系统进程之间的切换

进入中断

处理器自动保存现场到堆栈里
{PC, xPSR, R0-R3, R12, LR}
一旦入栈结束,ISR便可开始执行
晚到的中断会重新取ISR地址,但无需再次保存现场

 

退出中断

中断前的现场被自动从堆栈中恢复
一旦出栈完成,继续执行被中断打断的指令
出栈的过程也可被打断,使得随时可以响应新的中断 , 而不再进行
现场保存

二、外部中断控制器EXTI

EXTI控制器配置步骤

1.指定外部中断源:EXTI0 ~ EXTI19

2.设置上升沿触发选择寄存器或者下降沿触发选择寄存器来指定触发方式

3.选择事件类型还是中断类型

4.设置中断屏蔽寄存器使能相关中断

5.将来中断到来,需要将请求挂起寄存器对应的位清除,否则中断一直产生

三、NVIC中断

中文意思就是嵌套向量中断控制器,它属于M3内核的一个外设,实现中断优先级分组,中断优先级的配置,读中断请求标志,清除中断请求标志,使能中断,清除中断等

NVIC中断优先级

优先级:抢夺CPU资源的能力,优先级越高,抢夺CPU资源能力越强,就能及早运行,优先级对应的数值越小,优先级越高

STM32F103芯片支持60个可屏蔽中断通道,每个中断通道都具备自己的中断优先级,中断优先级分:

        抢占式优先级

        响应优先级通常也把响应优先级称为"亚优先级"或"副优先级"或者"子优先级"

        每个中断源都需要被指定这两种优先级

两种优先级的执行顺序是:抢占式>响应式。
抢占式:即当中断来临时,可立马中断此时的操作而去执行抢占式优先级的任务。高抢占式优先级可以中断低抢占式优先级(抢占式优先级可以中断嵌套)。
响应式:即当两个相同抢占式优先级的中断而响应式优先级不同的的中断来临时,先执行高响应式优先级,再执行低响应式优先级的中断。
当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。
如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;
如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理那一个,越靠前的先执行。

四、外部EXTI配置

1.使能IO口时钟,配置IO口模式为输入

2.开始AFIO时钟,设置IO口与中断线的映射关系

3.选择触发方式,使能中断

4.配置中断分组(NVIC),使能中断

一旦CPU核接收到NVIC发送的中断信号,CPU核立马停止执行当前程序,CPU核立刻跳转到对应的外设中断的处理函数里去运行,而外设对应的中断处理函数名有ST公司帮我们定义好,我们直接编写好对应的中断处理函数即可,各个外设对应的中断处理函数名称位于:startup_stm32f10x_hd.s启动文件,将来一旦外设产生中断,CPU核立刻执行对应的函数

中断处理函数

void 中断处理函数(void){

        1.根据用户需求完成相关硬件操作:例如:扫描按键,开关灯

        2.最后清除中断挂起位、到来的标志位,否则中断一直触发

}

初始化函数
//exti.h
#ifndef _EXTI_H
#define _EXTI_H

#include "stm32f10x.h"
#include "system.h"

extern void My_Exti_Init(void);

#endif

//exti.c
#include "exti.h"

void My_Exti_Init(void){
	//定义EXTI结构体,用于配置EXTI控制器
	EXTI_InitTypeDef EXTI_Config;
	NVIC_InitTypeDef NVIC_Config;
	//使能AFIO时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	//将KEY0按键的引脚GPIOE4映射到EXTI4中断线
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
	//配置EXTI工作参数
	EXTI_Config.EXTI_Line = EXTI_Line4|EXTI_Line3;
	EXTI_Config.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_Config.EXTI_Trigger = EXTI_Trigger_Falling;
	EXTI_Config.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_Config);
	
	EXTI_Config.EXTI_Line = EXTI_Line0;
	EXTI_Config.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_Config.EXTI_Trigger = EXTI_Trigger_Rising;
	EXTI_Config.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_Config);
	
	//配置NVIC工作参数
	NVIC_Config.NVIC_IRQChannel = EXTI4_IRQn;
	NVIC_Config.NVIC_IRQChannelPreemptionPriority = 2;
	NVIC_Config.NVIC_IRQChannelSubPriority = 0;
	NVIC_Config.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_Config);
	
	NVIC_Config.NVIC_IRQChannel = EXTI3_IRQn;
	NVIC_Config.NVIC_IRQChannelPreemptionPriority = 2;
	NVIC_Config.NVIC_IRQChannelSubPriority = 1;
	NVIC_Config.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_Config);
	
	NVIC_Config.NVIC_IRQChannel = EXTI0_IRQn;
	NVIC_Config.NVIC_IRQChannelPreemptionPriority = 2;
	NVIC_Config.NVIC_IRQChannelSubPriority = 2;
	NVIC_Config.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_Config);
}

  • 15
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值