STM32中断过程详解

发布者:幸福家庭最新更新时间:2023-06-06 来源: elecfans关键字:STM32  中断过程  外部中断 手机看文章 扫描二维码
随时随地手机看文章

对于 STM32 讲(还是以Timer2例),外部中断通道位置 28(35 号优先级)是给外部设备 TIME2 的,但 TIME2本身能够引起中断的中断源或事件有好多个,比如更新事件(上溢/下溢) 、输入捕获、输出匹配、DMA 申请等。所有TIME2 的中断事件都是通过一个 TIME2 的中断通道向 STM32 内核提出中断申请,那么 STM32 中如何处理和控制 TIME2 和它众多的、不同的、中断申请呢?


1.因为cortex_m3 内核对于每一个外部中断通道都有相应的控制字和控制位,用于单独的和总的控制该中断通道。它们包括有:

中断优先级控制字:PRI_n(前面有提到过)

中断允许设置位:在 ISER 寄存器

中断允许清除位:在 ICER 寄存器中

中断悬挂 Pending(排队等待)位置位:在 ISPR 寄存器中(类似于置中断通道标志位)

中断悬挂 Pending(排队等待)位清除:在 ICPR 寄存器中(用于清除中断通道标志位)

正在被服务(活动)的中断(Active)标志位:在 IABR 寄存器中, (只读,可以知道当前内核正在处理哪个中断通道)


2.作为外围设备 TIME2 本身也包括更具体的,管理自己不同中断的中断控制器(位) ,它们主要是自身各个不同类型中断的允许控制位, 和各自相应的中断标志位 (STM32 的手册中有详细的说明) 。

理解上面两点之后,我们可以全程、全面和综合的来了解 TIME2 的中断过程,以及如何控制的。

①初始化过程

首先要设置寄存器 AIRC 中 PRIGROUP 的值, 规定系统中的抢先优先级和子优先级的个数(在 4 个 bits 中占用的位数) ;

设置 TIME2 本身的寄存器,允许相应的中断,如允许 UIE(TIME2_DIER 的第[0]位)

设置 TIME2 中断通道的抢先优先级和子优先级(IP[28],在 NVIC 寄存器组中)

设置允许 TIME2 中断通道。在 NVIC 寄存器组的 ISER 寄存器中的一位。

②中断响应过程

当 TIME2 的 UIE 条件成立(更新,上溢或下溢) ,硬件将 TIME2 本身寄存器中 UIE 中断标志置位,然后通过 TIME2 中断通道向内核申请中断服务。

此时内核硬件将 TIME2 中断通道的 Pending 标志置位(相当与中断通道标志置位) ,表示 TIME2 有中断申请。

如果当前有中断在处理,TIME2 的中断级别不够高,那么就保持 Pending 标志,当然用户可以在软件中通过写 ICPR 寄存器中相应的位把本次中断清除掉。

当内核有空,开始响应 TIME2 的中断,进入 TIME2 的中断服务。此时硬件将 IABR 寄存器中相应的标志位置位, 表示 TIME2 中断正在被处理。 同时硬件清除 TIME2 的 Pending 标志位。

③ 执行 TIME2 的中断服务程序

所有 TIME2 的中断事件, 都是在一个 TIME2 中断服务程序中完成的, 所以进入中断程序后, 中断程序需要首先判断是哪个 TIME2 的具体事件的中断, 然后转移到相应的服务代码段去。

注意不要忘了把该具体中断事件的中断标志位清除掉, 硬件是不会自动清除 TIME2 寄存器中具体的中断标志位的。

如果 TIME2 本身的中断事件多于 2 个, 那么它们服务的先后次序就由用户编写的中断服务决定了。换句话说,对于 TIME2 本身的多个中断的优先级,系统是不能设置的。所以用户在编写服务程序时,应该根据实际的情况和要求,通过软件的方式,将重要的中断优先处理掉。

当然你也可以每次中断服务只处理其中的一个,然后再次进入中断,处理下一个。

④中断返回

内核执行完中断服务后,便进入中断返回过程,在这个过程中需要:

硬件将 IABR 寄存器中相应的标志位清另,表示该中断处理完成如果 TIME2 本身还有中断标志位置位,表示 TIME2 还有中断在申请,则重新将 TIME2的 Pending 标志置为 1,等待再次进入 TIME2 的中断服务。


以上中断过程在《ARM Cortex-M3 权威指南》中有详细描述,并配合时序图说明,可以参考。

然后,就可以在 ST 提供的函数库的帮助下,正确的设置和使用 STM32 的中断系统了。


关键字:STM32  中断过程  外部中断 引用地址:STM32中断过程详解

上一篇:STM32常用的一些开发工具汇总
下一篇:STM32芯片内部架构的详细介绍

推荐阅读最新更新时间:2024-11-09 10:21

Keil STM32调试,使用ST-Link下载程序时提示“flash timeout.reset the target and try it again”
参考: 很郁闷,买来没多久的 STM32F4-DISCOVERY 就挂了? STM32F103RB Jlink调试的时候出现flash timeout.reset the target and try it again 看完以上网友的方案后本人使用FlyMcu读芯片,内容提示芯片被锁。遂想下载一个程序试试,不想程序可以下载,然后再读芯片时已正常。 返回Keil使用ST-Link也可正常使用。 从网友结论及本人测试,些次出现“flash timeout.reset the target and try it again”是由芯片被锁导至。 以下方法未试 问题已经解决了。是keil的环境没有设置好。导致程序进步去。应该是没有Re
[单片机]
Keil <font color='red'>STM32</font>调试,使用ST-Link下载程序时提示“flash timeout.reset the target and try it again”
无线节水滴灌自动控制系统的设计方案
  为实现实时适量的精准滴灌,本文提出了一种基于S3C6410和STM32的无线节水滴灌自动控制系统的设计方案。该方案利用ZigBee无线传感器网络的自组网特点,采用星型网络拓扑结构,实时监控多块田地的土壤温湿度变化,通过反馈传感信号,对滴灌动作进行精准判断和控制。田间试验期间测得土壤湿度最小值为30%,最大值为70%,处于理想范围内。实验结果表明,该方案所设计的系统能够实现滴灌自动控制,且性能良好,具有灵活性强、安全可靠、低功耗、低成本。   0 引言   随着人口的增长和农业的发展,随着全球变暖造成的干旱问题日益严重,世界水资源的需求量越来越大,水资源紧缺已成为全世界人民共同关注的问题。滴灌技术是通过干管、支管和毛管上的滴
[单片机]
无线节水滴灌自动控制系统的设计方案
分析一个关于STM32 芯片异常复位的经典案例!
前言 本篇主要是介绍一种处理问题的思路,即当我们在做STM32应用开发过程中,遇到芯片异常复位,或者进入了异常处理时,如何通过集成开发环境,如IAR,KEIL等查看相应的ARM内核寄存器,定位出应用软件产生异常的地方! 问题描述 某STM32用户反馈,当使用STM32L4芯片的时候,程序运行一段时间后,会忽然复位。复位后程序继续运行,但是还会继续复位,原因不详! 问题分析 针对于此类问题,我们可以按照一个统一的思路去处理。分析本案例的大致步骤如下: 1、初步确定复位的原因,是硬件复位,如外部NRST被拉低,还是软件复位,包括软件直接调用复位,或者看门狗复位,还是低功耗模式如standby模式被唤醒时产生中断; 2、查看复位
[单片机]
分析一个关于<font color='red'>STM32</font> 芯片异常复位的经典案例!
STM32的HAL与LL库能共同使用(混用)吗?
这是一位读者问的问题,我觉得很多人应该都有这种疑惑,所以特地写篇文章分享给大家。 一、标准外设库停更了 很多学习STM32的朋友都比较依赖之前的标准外设库(StdPeriph_Lib),我想告诉大家一个事实,那就是标准外设库已经停更很久了。 支持标准外设库的STM32,只有相对较老的系列:F0、 F1、F2、F3、F4、L1. 我特地看了下,STM32标准外设库最后一次更新时间是2016年11月的F4系列。 标准外设库地址: https://www.st.com/en/embedded-software/stm32-standard-peripheral-libraries.html 这后面出来的L0、 L4、 L5、 F
[单片机]
<font color='red'>STM32</font>的HAL与LL库能共同使用(混用)吗?
simulink开发STM32串口函数的步骤
配置环境:MATLAB2018b,STM32CubeMX-5.4.0,STM32MatTarget_5.4.0,Keil MDK5 单片机:STM32F103ZET6 CK_1****功能:单片机发送任意长度数组给上位机。 注意数组的输出数据类型要选择为uint8。不要删除两个getBuffPtr文件, 生成代码后将getBuffPtr的头文件和源文件分别复制到生成的Inc和Src文件夹中,先将源文件getBuffPtr添加到Keil的Application/User中,然后再编译下载。 注意:如果找不到getBuffPtr文件,请在STM32MatTarget的安装位置拷贝,默认的安装路径为:C:MATLABSTM32-MAT
[单片机]
simulink开发<font color='red'>STM32</font>串口函数的步骤
STM32外部中断
68个可屏蔽中断通道,包括EXTI,TIM,ADC,USART,SPI,I²C,RTC等多个外设(F1系列最多的数量,以型号为主); 使用NVIC统一管理中断,每个中断通道都拥有16个可编程优先等级,可以对优先级进行分组,进一步设置抢占优先级和响应优先级。 AFIO内部图 EXTI内部图 中断和事件的区别 NVIC的中断优先级由优先级寄存器的4位(0-15)决定,这四位可以进行切分,分为高N位的抢占优先级, 和4-n位的响应优先级; 抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队,抢占优先级和响应优先级均相同的话, 按照中断号排队。 操作的是NVIC- IPRx寄存器 中断示例 mai
[单片机]
<font color='red'>STM32</font><font color='red'>外部中断</font>
关于STM32复位的那些事
1. 硬件复位 硬件复位电路如下图,直接将RESET引脚拉低即可,如下: 2. 软件复位 软件复位库函数: NVIC_SystemReset(); STM32F1XX系列中,复位函数在core_cm3.h文件中: /** * @brief Initiate a system reset request. * * Initiate a system reset request to reset the MCU */static __INLINE void NVIC_SystemReset(void){ SCB- AIRCR = ((0x5FA SCB_AIRCR_VECTKEY_Po
[单片机]
关于<font color='red'>STM32</font>复位的那些事
STM32之如何封装自己的lib库
似乎stm32刚开始出来的时候就是用的l.ib库,后来就开源了。 网上看了一些网友做的lib库,自己也弄了一下,其实也挺简单。 以下封装lib库都是基于stm32的3.0固件库 1、打开一个工程,将除固件库以外的其他文件删掉,如下: 2、在option下进行设置,如下: 来个特写: 3、将编译好的lib库拷贝到另外一个工程,添加进去,并将工程下库的c文件全部删除(h文件必须保留) 4、编译,如下: 注意,只需将stm32_lib_30.lib文件add进去就可以了,没必要在主文件里面include之类的。 否则编译的时候就会出错(重复包含),如下:
[单片机]
<font color='red'>STM32</font>之如何封装自己的lib库
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved