【STM32】中断

news2024/11/15 7:24:13

 中断与GPIO一样是STM32中非常常用的东西,以我一个写上位机的人的理解,它相当于上位机程序中多线程的地位,因为多线程和中断都是为了提高某些响应的实时性。悄悄说一句,我觉得中断在一定程度上比多线程还好用。哈哈哈哈哈哈哈~

大部分图片来源:正点原子HAL库课程

目录

1    作用

2    意义

3    NVIC

3.1    优先级

3.2    NVIC的使用

3.3    相关的HAL库文件(可以去这里找用到的函数和宏定义)

4    EXTI

4.1    中断和事件

4.2    工作原理

4.3    外部中断配置

4.4    EXTI配置步骤

4.5    相关的HAL库文件(可以去这里找用到的函数和宏定义)

5    中断中几个重要概念的本质

5.1    __HAL_PPP_ENABLE_IT

5.2    HAL_NVIC_EnableIRQ

5.3    HAL_PPP_XXX_Start_IT


1    作用


2    意义

高效处理紧急程序,不会一直占用CPU资源。


3    NVIC

中断的总管家。

中断服务函数:位于启动文件中。

3.1    优先级

数字越小优先级越高!

优先级的分组:

        设置优先级分组大概意思就是在同样只有IPRx寄存器高四位时,使得项目有一定数量的抢占优先级和一定数量的响应优先级。而因为只有四位的空间,不同优先级分组之间就是把4位分别分给抢占和响应而已。具体怎么分就需要结合项目需要了,因为中断是抢占优先级和响应优先级共同作用的。

        但在一个工程中,一般只设置一次中断优先级的分组,避免程序的优先级混乱,多次设置时以最后一次为准。

3.2    NVIC的使用

注意⚠️:

在例程中stm32f1xx_hal.c已经在HAL_init()函数中设置过中断分组为2,就不需要额外设置了。分组为2中中间间,比较好用。

3.3    相关的HAL库文件(可以去这里找用到的函数和宏定义)

stm32f1xx_hal_cortex.c(找NVIC函数)

startup_stm32103xe.s(找中断服务函数名)


4    EXTI

外部中断事件控制器。

F1包含20(互联型)/19(非互联型)个产生事件/中断请求的边沿检测器,即总共20条EXTI线。

4.1    中断和事件

中断:要进入NVIC,有相应的中断服务函数,需要CPU处理

事件:不进入NVIC,仅用于内部硬件自动控制的,如:TIM、DMA、ADC

4.2    工作原理

最常用的寄存器:上升沿触发寄存器、下降沿触发寄存器、请求挂起寄存器、中断屏蔽寄存器。而一般不采用软件触发中断,也很少使用事件,都是使用中断。

4.3    外部中断配置

使用AFIO的AFIO_EXTICR1~4寄存器对EXTI中断线0-15对应哪个IO口进行配置。

配置前需要先使能AFIO时钟:__HAL_RCC_AFIO_CLK_ENABLE()

同一时间段内,一条EXTI线只能与一路IO相映射如下图时只能选PA0-PG0中的一个和EXTI0映射。

4.4    EXTI配置步骤

  • 理论上的全流程

     
  • 实际上的全流程(其中示例程序中第二步已经完成了第三步内容)

【其中6包含重写中断服务函数重写数据处理回调函数两步】

其中根据四步法的逻辑,可以分为:

1.    初始化

        (1)    时钟设置:使能串口时钟

        (2)    外设参数设置:HAL_GPIO_Init();

        (3)    IO设置:HAL_GPIO_Init();

        (4)    中断设置:使能中断,设置中断优先级;

2.    定义读函数:

3.    定义写函数:

4.    编写中断服务函数:

        重写EXTIx_IRQHandler及其内部的HAL_GPIO_EXTI_Callback函数;
 

  • 中断的回调机制为

     
  • 注意事项⚠️

        (1)    在使用GPIO作为中断输入时,GPIO的模式就应该配置为GPIO_MODE_IT_RISING(上升沿触发中断)、GPIO_MODE_IT_FALLING(下降沿触发中断)、GPIO_MODE_IT_RISING_FALLING(双边沿触发中断)中之一;

        (2)    设置中断优先级就是按照第三步(也就是第二步内部的第三步)设置的中断分组来设置抢占优先级和响应优先级;

        (3)    设置PINx的中断就是设置EXTIx的中断,x = 0~4时是这样,5及以后的可能就和剩下的两个EXTI线相关了,具体要查资料;

        (4)    第六步所谓的设置中断服务函数,就是在启动文件的中断向量中找到EXTIx对应的中断服务函数名,来重写。例如,EXTI4就是重写一个void EXTI4_IRQHandler(void)函数;而中断回调函数中说到的调用HAL库中断处理公用函数,就是在EXTI4_IRQHandler函数的具体实现上,调用GPIO的中断处理公用函数HAL_GPIO_EXTI_IRQHandler

        (正点原子的视频中其实还讲到了调用公共处理函数后还要接一句清除中断标志位的函数,如GPIO中为__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_X),但实际上我看公共处理函数内部中本来就有这一句,因此大概率是不需要的,因为像串口之类的外设课程中正点原子也没提到需要进行手动清除,反而说了公共处理函数已经清除了)

        拓展地来讲:对于非GPIO使用EXTIx的的情况,即x >= 16的情况,就要根据EXTIx对应的外设,去对应外设的HAL库文件中找其中断处理公用函数;

        (5)    中断回调函数中说到的HAL库数据处理回调函数,在HAL库中断处理公用函数可以看到它被调用,而去查其定义,可以看到这个函数(如使用GPIO中断时是HAL_GPIO_EXTI_Callback)是被__weak修饰的,且其内容为空,这意味这个函数可以并需要被用户文件重写,手动实现在中断发生时执行的回调函数;

        (6)    注意:中断处理公用函数HAL库数据处理回调函数在自己的BSP源文件内定义后,不需要再在对应的头文件中声明了,因为他们两个都已经声明过了,一个是在启动文件中,一个是在外设对应的HAL库文件中;

4.5    相关的HAL库文件(可以去这里找用到的函数和宏定义)

stm32f1xx_hal_cortex.c(找NVIC相关函数)

stm32f103xe.h(找基地址)

startup-stm32f103xe.s(找中断服务函数名)

stm32f1xx_hal_gpio.h(为了找清除中断标志位的函数)

stm32f1xx_hal_gpio.c(为了找HAL库中断处理公用函数、数据处理回调函数)

其他外设的hal库.h(为了找清除中断标志位的函数)

其他外设的hal库.c(为了找HAL库中断处理公用函数、数据处理回调函数)


5    中断中几个重要概念的本质

5.1    __HAL_PPP_ENABLE_IT

启用外设PPP的某个中断,但并不意味着中断处理函数和回调就会执行。但是!!!哪怕不执行这个函数,中断标志位也会发生改变,别的外设我不知道,但是输入捕获中断的话,哪怕不用HAL_TIM_Base_Start_IT而直接用HAL_TIM_Base_Start(相当于没有启用IC的中断),其中断标志状态寄存器SR也会随着输入捕获的出现而置位。

5.2    HAL_NVIC_EnableIRQ

真正启用中断的函数,就是告诉芯片我启用了这个中断的服务函数和回调函数了,后面发生这个中断后你必须给我执行它的服务函数和回调函数。
这个函数要先执行__HAL_PPP_ENABLE_IT,再执行。

5.3    HAL_PPP_XXX_Start_IT

(注意:这里的XXX指的是功能,有可能没有。)

这个函数就是启用某个硬件,并且调用其__HAL_PPP_ENABLE_IT函数启用其中断。相当于HAL_PPP_XXX_Start_IT + __HAL_PPP_ENABLE_IT。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2069852.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

竖图秒变横屏壁纸!AI绘画SD最强控制插件ControlNet教程,一键实现图片的扩展式填充真的太强了!

大家好,我是画画的小强 经常用PhotoShop作图的人都知道,自从去年PS2023beta版的发布,引入了AI绘画给广大创作者带来了不小的惊喜,最主要的就是它的“创成式填充”,通过现有图片可以进行扩展和延展,其强大的…

Vue2 中 $set 用法详细讲解

给变量重复赋值,Vue 监测不到数据变化。这个时候,双向绑定就失效了。 1、为什么要用set? 在vue中,并不是任何时候数据都是双向绑定的。 在官方文档中,有这样一段话,如下: 从文档得知&#xff…

wpf 定制 个性圆角信息面板

先上图&#xff1a; 代码实现&#xff1a; <Canvas Grid.Column"1"><Border Background"#5665F4" BorderBrush"#5665F4" BorderThickness"0.5" CornerRadius"10,10,10,30"Width"180" Height"165&qu…

CSS背景与边框——WEB开发系列18

网页设计中&#xff0c;背景和边框是用于提升视觉效果的关键元素。CSS&#xff08;层叠样式表&#xff09;提供了丰富的功能来定制这些视觉效果&#xff0c;确保网页看起来既美观又符合设计需求。 一、背景样式 背景样式在网页设计中起着至关重要的作用。它们可以用来增加页面…

qt在ui上面给QWidget设置布局

如图所示&#xff0c;我们无法给QWidget设置布局 拖拽一个GridLayout进来&#xff0c;设置QWidget布局&#xff0c;然后删掉该GridLayout 结果QWidget设置网格布局

广州自闭症全托管学校-正规儿童康复中心

在繁华的广州城&#xff0c;有一个特殊的地方&#xff0c;那就是致力于自闭症儿童康复的星贝育园。星贝育园不仅在广州拥有校区&#xff0c;在浙江也有三个校区&#xff0c;它就像一盏明灯&#xff0c;照亮了自闭症儿童和他们家庭的前行之路。 走进星贝育园&#xff0c;你会感…

【CUDA编程笔记】thrust::device_vector<float> signal无法编译问题记录

thrust::device_vector signal无法编译问题记录 CUDA编程笔记 一、问题记录 正常编译时&#xff0c;无法编译 二、源码 #include <thrust/host_vector.h> #include <thrust/device_vector.h> #include <thrust/generate.h> #include <thrust/sort.…

22:【stm32】定时器三:输出比较

输出比较 1、简介2、标准库编程 1、简介 通过CCR里面的值和计数器CNT里面的值进行比较&#xff0c;然后输出高电平/单片机&#xff0c;进而产生需要的信号。 如上图所示&#xff0c;预分频器71&#xff0c;则最小单元为1us&#xff0c;自动重装器为999&#xff0c;则周期为1ms…

InternLM + LlamaIndex RAG 实践

1. 环境配置 首先创建一个虚拟环境 conda create -n llamaindex python3.10 为虚拟环境安装以下安装包 conda activate llamaindex conda install pytorch2.0.1 torchvision0.15.2 torchaudio2.0.2 pytorch-cuda11.7 -c pytorch -c nvidia pip install einops pip install …

Midjourney提示词-动物系列-65

A super cute little anthropomorphic,sheep of the Chinese Zodiac, wearing berets ,in a Hanfu in red style,standing, eyes,cute tail,super realistic,super detail,luxurious,elegant,Unreal Engine,octane render, 8K,VRAY super realistic Pixar Style, Tiny cute…

百数功能插件技术解析:审批流程设置与数据填写便捷性探讨

低代码平台作为一种创新的开发工具&#xff0c;正逐渐受到企业的青睐。为了进一步提升用户体验&#xff0c;满足用户多样化的需求&#xff0c;百数低代码平台开通了“有问必答”板块。 问题1&#xff1a;功能插件到底有什么用&#xff1f;都用在哪些位置&#xff1f; 功能插件…

【大模型系列】Flash-VStream(2024.06)

● Paper&#xff1a;https://arxiv.org/pdf/2406.08085v1 ● Github&#xff1a;https://github.com/IVG-SZ/Flash-VStream?tabreadme-ov-file#structure ● HuggingFace&#xff1a;https://huggingface.co/spaces/IVGSZ/Flash-VStream-demo ● Author&#xff1a;Haoji Zha…

line-height的使用场景

line-height:字面含义为行高&#xff0c;行高有三部分组成&#xff0c;分为内容高度&#xff0c;上间距&#xff0c;下间距。 可以看到文本在div盒子中的默认位置是左上角。此时文字部分的行高只有内容高度在支撑&#xff0c;上间距和下间距都是0。鼠标在字体上滑动时的蓝色部…

【重点】人工智能大语言模型技术发展研究报告2024|附下载

人工智能作为引领新一轮科技产业革命的战略性技术和新质生产力重要驱动力&#xff0c;正在引发经济、社会、文化等领域的变革和重塑。 2023 年以来&#xff0c;以ChatGPT、GPT-4 为代表的大模型技术的出台&#xff0c;因其强大的内容生成及多轮对话能力&#xff0c;引发全球新…

第2章-06-Cookie在网站回话中的作用

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年CSDN全站百大博主。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 🏆本文已收录于专栏:Web爬虫入门与实战精讲,后续完整更新内容如下。 文章…

3.5mm耳机插头制作手机内录线电路图

1.背景 无人直播或录屏直播手机mic会对外界声音的录入&#xff0c;而且很嘈杂。 2.实现功能 手机酷狗播放音频&#xff0c;同时手机内打开录音软件录音&#xff0c;同一台手机操作。 3.电路图 接线分为2种&#xff0c;国标和美标&#xff0c;自己尝试&#xff0c;肯定有一…

链表OJ题——链表的中间节点

文章目录 一、题目链接二、解题思路三、解题代码 一、题目链接 链表的中间节点 二、解题思路 三、解题代码

Python优化算法09——黏菌优化算法(SMA)

科研里面优化算法都用的多&#xff0c;尤其是各种动物园里面的智能仿生优化算法&#xff0c;但是目前都是MATLAB的代码多&#xff0c;python几乎没有什么包&#xff0c;这次把优化算法系列的代码都从底层手写开始。 需要看以前的文章可以参考&#xff1a;Python优化算法_阡之尘…

护眼台灯有辐射吗?三大劣质护眼台灯危害曝光!

护眼台灯有辐射吗&#xff1f;护眼台灯旨在提供便利、健康的光线环境&#xff0c;但作为光学测评师&#xff0c;我注意到一些低品质的护眼台灯可能存在严重问题。这些台灯如果使用劣质材料制造&#xff0c;在使用过程中可能会释放有害辐射&#xff0c;长期接触甚至可能引发黄斑…

AI副业:用百度文库AI,我也能轻松创建漫画、画本?

前言 作为一种受众广泛的艺术形式&#xff0c;漫画的影响力应该不需要我多说什么。 强烈的视觉化和叙事性&#xff0c;让漫画成为无数年轻读者的阅读启蒙&#xff0c;也让无数二十一世纪青年拥有了自己的「漫画梦」。可是要制作出一份能拿得出手的漫画谈何容易&#xff0c;先…