07:【stm32】中断一:NVIC的配置

中断

1、中断的简介

1.1、什么是中断

正在进行的事务被突发事件打断,转而处理这个突发事件,突发事件处理完成后回到

被打断的事务继续执行,这一处理突发事件的过程叫做中断。

【注】

中断结束后,回来执行的事件不再是从头开启,而是接着继续执行。

体现在程序中就是,CPU在执行主函数里面的程序,然后突然有一个中断源触发,CPU检测到中断触发后就会跳出主函数,进而去执行中断函数里面的程序。当中断函数里面的程序执行完后,在回到主函数里面接着执行没有执行完的程序。

1.2、为什么需要中断

有突发性的,紧急性的事件就需要使用中断来处理,比如:主函数中里面拥有大量的循环程序,进而执行起来需要耗费大量的时间,而有一个事件是突发性的,比如按钮控制灯亮灭,当检测到按钮按下时,CPU才执行灯的动作,所以我们不能够将这个事件放在主程序里面,如果放在主程序里面时,当CPU还在执行循环程序,当按下按钮,程序还没有执行到判断按钮的程序,所以灯的状态不会改变。

2、中断的优先级

中断优先级:中断处理的紧急程度叫做中断优先级。

  • 中断排队:在中断响应的过程中又有新的中断到来,新到来的中断需要排队,根据中断优先级决定排队的顺序
  • 中断嵌套:中断处理过程被更紧急的中断源打断

2.1、中断优先级的表示方法

中断优先级分为2个,抢占优先级和子优先级,下图为2位表示一个优先级。我们可以自己划分位数。

例如下面的几种情况:

中断嵌套

中断排队

3、NVIC

3.1、什么的NVIC

NVIC其实就是中断控制器,它不属于片上外设,它在CPU中的内部,复制管理中断。

3.2、NVIC的内部结构

中断的模型是:片上外设产生中断源-->中断信号传递给NVIC-->去查中断向量表,匹配中断函数。

NVIC主要负责中断源的开关,优先级的配置,然后中断仲裁。

中断优先级可以分组的。如下图所示:

3.3、中断向量表

中断向量表:Flash存储器内部从地址0开始的一段区域,按照中断号排列,每4个字节存

储一个中断响应函数的地址(在使用手册的9)


3.4、程序实现

我们以USART1中断为例

①开启中断源

我们在USART.h里面找到ITconfig函数,这是配置中断是函数

然后我们右键点击go to,然后我们查看这个函数里面的形式参数里面取值

复制代码
 //打开USART的某个中断源
 USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);

②配置NVIC

我们在杂项miss.h里面找到这2个函数,分别是中断优先级的分组,初始化NVIC的某一路中断开关

1、优先级分组

然后我们右键点击go to,然后我们查看这个函数里面的形式参数里面取值

复制代码
//分为2位
NVIC_PriorityGroupConfig(NVIC_priorityGroup_2);

2、初始化NVIC的某一路中断开关

然后我们右键点击go to,然后我们查看这个函数里面的形式参数里面取值

我们通过翻译得出NVIC_InitStruct是结构体指针变量,这个变量里面有很多的元素需要我们去配置。我们打开这个结构体的定义去看看。

2.1、 我们看看中断源选择这个元素

复制代码
NVIC_InitTypeDef NVICInitStruct;//创建一个结构体变量
NVICInitStruct.NVIC_IRQChannel = USART1_IRQn;

2.2、中断分组数值这个元素

复制代码
NVICInitStruct.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级数值配置为0
NVICInitStruct.NVIC_IRQChannelSubPriority= 0;//子优先级数值配置为0

2.3、开关

复制代码
NVICInitStruct.NVIC_IRQChannelCmd = ENABLE;

所以配置NVIC的最终代码如下:

复制代码
NVIC_PriorityGroupConfig(NVIC_priorityGroup_2);   

NVIC_InitTypeDef NVICInitStruct;//创建一个结构体变量
NVICInitStruct.NVIC_IRQChannel = USART1_IRQn;   
NVICInitStruct.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级数值配置为0
NVICInitStruct.NVIC_IRQChannelSubPriority= 0;//子优先级数值配置为0
NVICInitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVICInitStruct);

③中断响应函数

通过weak方法进行同名的覆盖

复制代码
  void USART1_IRQHandler()//中断函数
  {
  		函数执行体;
  }

最终完整的代码如下:

c 复制代码
int main()
{
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//打开USART1的中断源
	NVIC_PriorityGroupConfig(NVIC_priorityGroup_2);   
	
	NVIC_InitTypeDef NVICInitStruct;//创建一个结构体变量
	NVICInitStruct.NVIC_IRQChannel = USART1_IRQn;   
	NVICInitStruct.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级数值配置为0
	NVICInitStruct.NVIC_IRQChannelSubPriority= 0;//子优先级数值配置为0
	NVICInitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVICInitStruct);
}
void USART1_IRQHandler()//中断函数
{
    函数执行体;
}
相关推荐
嗯嗯=23 分钟前
STM32单片机学习篇9
stm32·单片机·学习
小范馆5 小时前
ESP各模组的引脚图-小智接线图
stm32
松涛和鸣5 小时前
DAY63 IMX6ULL ADC Driver Development
linux·运维·arm开发·单片机·嵌入式硬件·ubuntu
想放学的刺客8 小时前
单片机嵌入式试题(第23期)嵌入式系统电源管理策略设计、嵌入式系统通信协议栈实现要点两个全新主题。
c语言·stm32·单片机·嵌入式硬件·物联网
猫猫的小茶馆8 小时前
【Linux 驱动开发】五. 设备树
linux·arm开发·驱动开发·stm32·嵌入式硬件·mcu·硬件工程
YouEmbedded9 小时前
解码内部集成电路(IIC)与OLED屏
stm32·0.96寸oled·硬件iic·软件模拟iic·图片取模·汉字取模
jghhh0110 小时前
基于上海钜泉科技HT7017单相计量芯片的参考例程实现
科技·单片机·嵌入式硬件
恶魔泡泡糖10 小时前
51单片机外部中断
c语言·单片机·嵌入式硬件·51单片机
意法半导体STM3210 小时前
【官方原创】如何基于DevelopPackage开启安全启动(MP15x) LAT6036
javascript·stm32·单片机·嵌入式硬件·mcu·安全·stm32开发
v_for_van10 小时前
STM32低频函数信号发生器(四通道纯软件生成)
驱动开发·vscode·stm32·单片机·嵌入式硬件·mcu·硬件工程