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()//中断函数
{
    函数执行体;
}
相关推荐
嵌入式仿真实验教学平台16 分钟前
嵌入式仿真实验教学平台的核心优势再解析:对比Proteus的技术与教学价值突破
人工智能·单片机·嵌入式硬件·学习·proteus·嵌入式实时数据库
阿波c麻了3 小时前
第十五届单片机模拟考试III
单片机·嵌入式硬件
天天爱吃肉82186 小时前
【国产工具链发展,生态链分析,TSMaster VS Zcanpro的技术对比】
单片机·嵌入式硬件·汽车·学习方法
charlie1145141919 小时前
从0开始的构建的天气预报小时钟(基于STM32F407ZGT6,ESP8266 + SSD1309)——第2章——构建简单的ESP8266驱动
stm32·单片机·物联网·学习·c·esp8266
zhmc10 小时前
Cortex-M系列MCU的位带操作
单片机·嵌入式硬件
旅行的橘子汽水11 小时前
【嵌入式-stm32电位器控制以及旋转编码器控制LED亮暗】
stm32·单片机·嵌入式硬件
Zevalin爱灰灰12 小时前
面试可能会遇到的问题&回答(嵌入式软件开发部分)
stm32·单片机·面试·操作系统·嵌入式·ucos
【云轩】12 小时前
《信号革命:从模拟到数字的通信进化史诗》
人工智能·嵌入式硬件·语音识别
lzb75913 小时前
积分赛——读取实时时间
单片机
基极向上的三极管14 小时前
【51单片机】2-5【I/O口】433无线收发模块控制继电器
单片机·51单片机