当前位置:网站首页>单片机学习笔记6--中断系统(基于百问网STM32F103系列教程)
单片机学习笔记6--中断系统(基于百问网STM32F103系列教程)
2022-07-23 05:43:00 【山、】
第六章 中断
第一节 中断的概念
简单来说,就是他可以打断系统当前正在执行的任务,让CPU优先执行此任务,等这个任务结束,CPU才能回到刚才被打断的地方重新执行程序。
中断一般分为系统异常和外部中断。通常,把CPU内部产生的紧急事件叫做异常,比如非法指令(除零)、地址访问越界等;把来自CPU外部的片上外设产生的紧急事件叫做中断,比如GPIO引脚电平变化、定时器溢出等。
第二节 中断和优先级
2.1Cortex-M3的中断和优先级
Cortex-M3内核有共有0-255,共256个中断,其中编号015是系统异常**,**16255是外部中断。每个中断又有自己特定的触发条件,当满足他们的触发条件后,系统就会产生中断,CPU就会跳到对应的中断服务函数去执行。
系统异常的名称是确定好的,厂家不能修改。外部中断是可以自己定义中断函数名称的。优先级就是每个中断的地位、重要程度的高低,越重要的中断,他的优先级越高。当几个中断同时发生的时候,CPU会优先执行优先级更高的中断,优先级相对较低的中断只能等待优先级高的中断执行完毕才能执行。在Cortex-M3内核中优先级数值越小,他的优先级越高。详细信息可查阅2_官方资料\10.0_Cortex-M3权威指南。

上面提到当多个中断同时发生的时候,系统会优先执行优先级较高的中断,那么系统是如何管理判断每个中断的优先级的呢。
Cortex-M3内核有一个专门管理中断的外设NVIC (Nested Vectored Interrupt Controller,嵌套向量中断控制器)用于控制各种中断的优先级实现中断的嵌套和调度。
NVIC是一个总的中断控制器,无论是来在内核的异常还是外设的外部中断,都由NVIC统一进行管理。
除了Reset(复位)、NMI(Non Maskable Interrupt,不可屏蔽中断)、HardFault(硬件异常〉,他们的优先级是固定的,且优先级是负数,是最高的。剩下的异常或中断,都是可以通过修改NVIC的寄存器调整优先级(但不能设置为负数,最小值是0)。
同时在Cortex-M3中,将优先级拆分为抢占优先级(Preempt Priority)和子优先级(Subpriority) ,每个中断都需要指定这两级。
抢占优先级是决定抢占的。这个抢占是对于中断来说的,抢占优先级高的中断能把CPU抢过来。如果CPU正在执行一个中断函数,抢占优先级更高的中断可以打断正在运行的中断,让CPU运行优先级更高的中断。
子优先级是决定运行的先后顺序的,他没有抢占功能,当两个中断的抢占优先级一样,子优先级更高的中断先运行,但是如果在子优先级低的中断正在执行的时候,子优先级高的中断只能等待子优先级低的中断执行完毕才能去执行,因为子优先级没有抢占功能。
若两种优先级一样则看中断在中断异常表中的位置,越靠前越先响应。比如说上图编号16的IRQ_0和编号255的IRQ_239同时发生,编号16的IRQ_0优先执行。
通过这两个优先级,系统就可以实现中断嵌套。
两种优先级通过8个Bit来控制。高区位是抢占优先级的,低区位是子优先级的。

例如选择PRIGROUP = 4;则抢占优先级占7-5位,共2^3 = 8个优先级;子优先级占4-0位,共2^5 = 32个优先级。

要注意的是,对于优先级分组,在大多数情况下,分组一旦被设置了,在复位之前都不需要在重新设置这个寄存器了。也就是说在程序一开始就要将优先级分组设置好,以后就不要在改变了。
2.2STM32的中断和优先级
1、中断介绍
STM32是基于Cortex-M3内核的,所以STM32的中断、优先级设置以及他们的特性和Cortex-M3内核是一样的,只不过STM32将其进行了裁剪。因为Cortex-M3设计有256种中断,但大多数MCU都用不到这么多中断,比如STM32F103系列就只有70种异常和中断,其中前15个是系统异常(有5个预留),后面60个是外部中断。

STM32的中断没有太大的改动,只是去掉了一些可更改的外部中断,同时对所有中断的中断编号重新编排了。STM32中的Reset和NMI属于系统启动时的中断,所以没有设置中断号,然后从HardFault开始的中断号从-13开始向上递增。外部中断编号就从0开始递增了。
2、优先级介绍
STM32F103继承了Cortex-M3的中断优先级规则,也还用抢占优先级和子优先级对中断优先级进行控制。但是因为STM32F103的中断少了很多,所以中断优先级也用不了那么多,只使用了8个Bit中的4个来设置。

第三节 使用HAL库配置中断
3.1相关函数
在HAL库中,关于中断的的函数有以下几个。

HAL_NVIC_SetPriorityGrouping:设置中断优先级分组的,确定抢占优先级和子优先级的范围。
HAL_NVIC_SetPriority:设置某一具体中断的抢占优先级和子优先级。
HAL_NVIC_EnableIRQ:使能某一具体的中断。
HAL_NVIC_DisableIRQ:关闭某一具体的中断。
void XXX_IROHandler(void):某一具体的中断服务函数。
HAL_XXX_IROHandler(type para):HAL库中的中断服务函数,在XXX_IROHandler中被调用,里面执行的是对具体中断的标志的清除以及一些状态的获取,还会调用一个供用户使用的回调函数HAL_XXX_Callback。
HAL_XXX_Callback:HAL库中的中断服务函数中调用的回调函数,用户可以在这里处理一些额外的任务。
3.2使用流程
上面分析可知,要想使用中断实现自己的任务,只需要三步:
1、系统中断服务函数重定位,XXX_IROHandler(void)是系统内核设置的中断函数,当中断发生的时候就会调用这个函数。
可以看到他们都是有weak修饰,weak作用简单来说就是当你写了一个与这个函数名字一样的函数,系统就会优先调用你自己写的函数;如果不重新写这个函数,那么系统默认调用这个函数。

2、在重定位的系统中断处理函数中调用HAL库的对应的中断处理服务函数。这样当中断发生的时候,实际上执行的函数就是HAL库中的函数了。

3、在HAL库的中断服务函数中调用的回调函数中编写自己的代码,实现任务。可以看到HAL库中的中断函数在内部清除中断标志后会调用一个回调函数,这个回调函数就是HAL库为用户准备的。用户在里面编写自己的代码,实现所需功能。
所以当中断发生的时候,中断函数的流程就是来回调用,系统函数调用HAL库函数,HAL库函数调用回调函数。
注意HAL_XXX_Callback:这个回调函数也是用weak修饰的虚函数,所以可以直接自己写一个这个函数,也可以在文件中找到此函数具体位置,在里面添加具体代码。

边栏推荐
- Green data center: comprehensive analysis of air-cooled GPU server and water-cooled GPU server
- NVIDIA NVIDIA released H100 GPU, and the water-cooled server is adapted on the road
- In depth interpretation of Google or tools' complex scheduling program
- 笔记 | 百度飞浆AI达人创造营:让人拍案叫绝的创意都是如何诞生的?
- How to develop the computing power and AI intelligent chips in the data center of "digital computing in the East and digital computing in the west"?
- 液冷数据中心如何构建,蓝海大脑液冷技术保驾护航
- 2021信息科学Top10发展态势。深度学习?卷积神经网络?
- 知识图谱、图数据平台、图技术如何助力零售业飞速发展
- Analyze the pre integration of vio with less rigorous but logical mathematical theory
- 笔记|(b站)刘二大人:pytorch深度学习实践(代码详细笔记,适合零基础)
猜你喜欢

使用PyOD来进行异常值检测

论文解读:《基于注意力的多标签神经网络用于12种广泛存在的RNA修饰的综合预测和解释》

Introduction and use of Ninja

笔记 | 百度飞浆AI达人创造营:让人拍案叫绝的创意都是如何诞生的?

2021可信隐私计算高峰论坛暨数据安全产业峰会上百家争鸣

Gartner research: how is China's digital development compared with the world level? Can high-performance computing dominate?

从已有VOC2007数据集生成yolov3所需要的数据集,以及正式开始调试程序需要修改的地方

知识图谱、图数据平台、图技术如何助力零售业飞速发展

Gartner调查研究:中国的数字化发展较之世界水平如何?高性能计算能否占据主导地位?

硬件知识2--协议类(基于百问网硬件操作大全视频教程)
随机推荐
UE4 solves the problem that the WebBrowser cannot play H.264
Using Google or tools to solve logical problems: Zebra problem
Neo4j 知识图谱的图数据科学-如何助力数据科学家提升数据洞察力线上研讨会于6月8号举行
保存实质审查请求书出现Schema校验失败的解决方法
硬件知識1--原理圖和接口類型(基於百問網硬件操作大全視頻教程)
VIO---Boundle Adjustment求解过程
怎么建立数据分析思维
Static linked list
Maybe I can't escape class! How to use paddlex to point the head?
Eigen多版本库安装
线性规划之Google OR-Tools 简介与实战
Interpretation of yolov3 key code
Print right angle triangle, isosceles triangle, diamond
Find the sum of numbers between 1 and 100 that cannot be divided by 3
How to develop the liquid cooled GPU server in the data center under the "east to West calculation"?
Rondom summary
从已有VOC2007数据集生成yolov3所需要的数据集,以及正式开始调试程序需要修改的地方
硬件知识2--协议类(基于百问网硬件操作大全视频教程)
How to cast?
Eigen multi version library installation