【STM32+HAL+Proteus】系列学习教程---中断(NVIC、EXTI、按键)

实现目标

1、掌握STM32的中断知识

2、学会STM32CubeMX软件关于中断的配置

3、具体目标:1、外部中断检测按键,每按一次计一次数,满5次LED1状态取反。


一、中断概述

1.1、中断定义

        CPU执行程序时,由于发生了某种随机的事件(包括外部或内部),让CPU暂时停下正在运行的程序,转而去执行一段处理事件的程序(中断服务子程序或中断处理程序),当这段程序执行完时(事件处理完时),程序又返回被停下的程序继续执行,这一过程称为中断。引发中断的称为中断源。中断可分为外部中断内部中断

        中断程序执行中又出现了中断,那么这种情况又叫做中断嵌套

1.2、中断的作用和意义

        中断的最终目的是高效处理紧急程序,并且不会占用CPU资源。还有就是能实现程序的并行化,实现嵌入式系统进程之间的切换等。

  • 实时控制:在确定的时间内对相应事件做出相应;例如:温度控制;
  • 故障处理:检测到故障,需要第一时间进行处理;
  • 数据传输:不确定数据何时会来,利用中断进行控制;

1.3、STM32的中断

        STM32F10x芯片有84个中断通道,包括16个内核中断68 个可屏蔽中断,这些中断通道已按照不同优先级顺序固定分配给相应的外部设备。

具体可参考:STM32F103的中文参考手册(9.1.2中断和异常向量)

二、 NVIC(中断向量控制器)

2.1 NVIC基本概念

        NVIC英文全称是Nested Vectored Interrupt Controller,中文意思就是嵌套向量中断控制器,通俗的讲它就是一个开关与选择器。它属于M3内核的一个外设,控制着芯片的中断相关功能。M3 内核都是支持 256 个中断,其中包含了 16 个系统中断 240 个外部中断,并且具有 256 级的可编程中断设置。

2.2、中断处理机制

工作过程:

         对于外部产生的中断不管是串口、定时器、IIC还是EXTI ,GPIO都由做NVIC来管理,NVIC的主要功能可以概括为:1. 中断管理;2.支持异常及中断向量化处理;3.支持嵌套中断。

2.3、STM32中断优先级

        当多个中断同时到来时,CPU该执行那个中断呢?这个时候就需要用到中断优先级,给中断的执行顺序排个序,优先级高的可以比优先级低的先执行,甚至优先级高的可以打断正在执行的优先级低的中断程序。

        STM32F103芯片支持60个可屏蔽中断通道,每个中断通道都具备自己的中断优先级控制字节(8位,但是STM32F103中只使用4位,高4位有效),用于表达优先级的高4位又可以组成抢占式优先级响应优先级,通常也把响应优先级称为“亚优先级”或“副优先级”,每个中断源都需要被指定这两种优先级。

NVIC_PriorityGroup

抢占优先级

取值范围

响应优先级

取值范围

描述

NVIC_PriorityGroup_0

0

015

抢占优先级占0位,

响应优先级占4

NVIC_PriorityGroup_1

01

07

抢占优先级占1位,

响应优先级占3

NVIC_PriorityGroup_2

0123

0123

抢占优先级占2位,

响应优先级占2

NVIC_PriorityGroup_3

01234567

01

抢占优先级占3位,

响应优先级占1

NVIC_PriorityGroup_4

015

0

抢占优先级占4位,

响应优先级占0

优先级判断原则:

       中断优先级的数值越小,优先级级别越高。先判断抢占优先级的大小,如果抢占优先级相同,则比较响应优先级的大小,若抢占优先级和响应优先级均相同,则根据中断向量表中的顺序来决定。

        假定现在有三个中断源:中断1中断2中断3。设置中断优先级分组为 2,然后设置中断1的抢占优先级为 2,响应优先级为 1。中断2的抢占优先级为 3,响应优先级为0。 中断3的抢占优先级为 2,响应优先级为 0。那么这 3 个中断的优先级顺序为: 中断 3>中断 1>中断 2。 上面例子中的中断 1 和中断 3 都可以打断中断 2 的中断。而中断 3 和中断 1却不可以相互打断!

三、EXTI(外部中断)

3.1EXTI的简介

        EXTI(External interrupt/event controller)—外部中断/事件控制器,管理了控制器的 20 个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测下降沿检测。 EXTI 可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。

3.2EXTI功能框图

斜杠20,表示在控制器内部类似的信号线路有20个, EXTI总共有20个中断/事件线。

红色代表产生中断,绿色代表产生事件

产生中断线路目的是把输入信号输入到NVIC,进一步会运行中断服务函数,实现功能,这样是软件级的。而产生事件线路目的就是传输一个脉冲信号给其他外设使用, 并且是电路级别的信号传输,属于硬件级的。

3.3EXIT线与IO映射关系

        EXTI有20个中断/事件线,每个GPIO都可以被设置为输入线,占用EXTI0至EXTI15, 还有另外七根用于特定的外设事件,见表 EXTI中断_事件线 。

        EXTI0至EXTI15用于GPIO,通过编程控制可以实现任意一个GPIO作为EXTI的输入源。由表 EXTI中断_事件线 可知, EXTI0可以通过AFIO的外部中断配置寄存器1(AFIO_EXTICR1)的EXTI0[3:0]位选择配置为PA0、 PB0、PC0、PD0、PE0、PF0、PG0、PH0或者PI0 。

四、原理图设计

        按键默认接得有上拉电阻,未按下时单片机检测管脚为高电平,当按键按下,电平由高电平变为低电平。也就是一个下降沿信号

五、STM32CubeMX 配置

配置1:LED1/PB9设置为推挽输出;  K1设置为外部中断模式,NVIC组别默认,抢占优先级,响应优先级默认为0,使能外部中断。

配置2:外部中断设置为下降沿触发

六、程序设计

1、定义一个全局变量,用于统计按键按下次数

/* USER CODE BEGIN PV */

 int cnt = 0;//计数变量
 
/* USER CODE END PV */

2、中断回调函数对按键进行处理,次数到达5次,LED1状态取反。

/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == GPIO_PIN_11)  //按键K1按下
	{
	    cnt++;
		if(cnt == 5)//按键次数到5次
		{
			cnt = 0;
			HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin); //LED1电平翻转
		}		
	}	
		
	__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_11);            //清除中断标志
}

/* USER CODE END 4 */

七、实验效果

八、仿真实现

按键按下5次后,LED1的状态取反,亮灭交替。


总结

相关推荐

  1. 62、ARM/STM32开发板按键中断相关学习20240416

    2024-05-09 07:12:08       13 阅读
  2. 关于基于STM32使用外部中断控制按键

    2024-05-09 07:12:08       46 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-09 07:12:08       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-09 07:12:08       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-09 07:12:08       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-09 07:12:08       20 阅读

热门阅读

  1. 培养逻辑思考力的7大基本方法笔记

    2024-05-09 07:12:08       8 阅读
  2. Android调用C++函数

    2024-05-09 07:12:08       9 阅读
  3. WordPress如何判断当前页是否属于文章页或页面?

    2024-05-09 07:12:08       13 阅读
  4. python字典

    2024-05-09 07:12:08       12 阅读
  5. 个人消息22222222222222

    2024-05-09 07:12:08       11 阅读
  6. Linux(Ubuntu)安装CGAL(非root)

    2024-05-09 07:12:08       15 阅读
  7. element-ui select 下拉框做成下拉加载更多

    2024-05-09 07:12:08       13 阅读
  8. ubuntu arm64 阿里云源

    2024-05-09 07:12:08       13 阅读
  9. Ubuntu 22.04 下 Pycharm 卸载

    2024-05-09 07:12:08       9 阅读