【【萌新的STM32学习-17 中断的基本概念2】】

萌新的STM32学习-17 中断的基本概念2

STM32中断优先级的基本概念
在这里插入图片描述
抢占优先级: 高抢占优先级可以打断正在执行的低抢占优先级中断
响应优先级: 这个也叫子优先级 抢占优先级相同,响应优先级高的中断不能打断响应优先级低的中断。还有一种情况就是当两个或者多个中断的抢占式优先级和响应优先级相同时,那么就遵循自然优先级,看中断向量表的中断排序,数值越小,优先级越高。

在 NVIC 中由寄存器 NVIC_IPR0-NVIC_IPR59 共 60 个寄存器控制中断优先级,每个寄存器的 8 位,所以就有了 240 个宽度为 8bit 的中断优先级控制寄存器,原则上每个外部中断可配置的优先级为 0~255,数值越小,优先级越高。但是实际上 M3 芯片为了精简设计,只使用了高四位[7:4],低四位取零,这样以至于最多只有 16 级中断嵌套,即 2^4=16。
对于 NVCI 的中断优先级分组:STM32F103 将中断分为 5 个组,组 0~4。该分组的设置是由 SCB->AIRCR 寄存器的 bit10~8 来定义的。
在这里插入图片描述
特别提示: 一个工程中,一般只设置一次中断优先级分组。
这到底是怎么一个说法和分配呢
我们拿STM32中断优先级2 举例 假设分组为2
那么一共4个 分为 2部分 前面2个被称为抢占优先级 后面2个位组成 响应优先级

抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高。
结合实例说明一下:假定设置中断优先级分组为 2,然后设置中断 3(RTC_WKUP 中断)的抢占优先级为 2,响应优先级为 1。中断 6(外部中断 0)的抢占优先级为 3,响应优先级为 0。中断 7(外部中断 1)的抢占优先级为 2,响应优先级为 0。那么这 3 个中断的优先级顺序为:中断 7>中断 3>中断 6。上面例子中的中断 3 和中断 7 都可以打断中断 6 的中断。而中断 7 和中断 3 却不可以相互打断!
在这里插入图片描述
关于STM32 NVIC的使用
1.设置中断 AIRCR[10:8]
HAL_NVIC_SetPriorityGrouping

2.设置中断优先级 IPRx bit [7:4]
HAL_NVIC_SetPriority

3.使能中断 ISERx
HAL_NVIC_EnablelRQ

ST 公司把 core_cm3.h 文件的 NVIC 相关函数封装到 stm32f1xx_hal_cortex.c 文件中,下面
列出我们较为常用的函数进行,想了解更多其他的函数请自行查阅。

  1. HAL_NVIC_SetPriorityGrouping 函数
    HAL_NVIC_SetPriorityGrouping 是设置中断优先级分组函数。其声明如下:
    void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup);
    ⚫ 函数描述:
    用于设置中断优先级分组。
    ⚫ 函数形参:
    形参 1 是中断优先级分组号,可以选择范围:NVIC_PRIORITYGROUP_0 到
    NVIC_PRIORITYGROUP_4(共 5 组)。
    ⚫ 函数返回值:

    ⚫ 注意事项:
    这个函数在一个工程里基本只调用一次,而且是在程序 HAL 库初始化函数里面已经被调
    用,后续就不会再调用了。因为当后续调用设置成不同的中断优先级分组时,有可能造成前面
    设置好的抢占优先级和响应优先级不匹配。
  2. HAL_NVIC_SetPriority 函数
    HAL_NVIC_SetPriority 是设置中断优先级函数。其声明如下:
    void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority,
    uint32_t SubPriority);
    ⚫ 函数描述:
    用于设置中断的抢占优先级和响应优先级(子优先级)。
    ⚫ 函数形参:
    形参 1 是中断号,可以选择范围:IRQn_Type 定义的枚举类型,定义在 stm32f103xe.h。
    形参 2 是抢占优先级,可以选择范围:0 到 15。
    形参 3 是响应优先级,可以选择范围:0 到 15。⚫ 函数返回值:无3. HAL_NVIC_EnableIRQ 函数HAL_NVIC_EnableIRQ 是中断使能函数。其声明如下:void HAL_NVIC_EnableIRQ(IRQn_Type IRQn);⚫ 函数描述:用于使能中断。⚫ 函数形参:形参 IRQn 是中断号,可以选择范围:IRQn_Type 定义的枚举类型,定义在 stm32f103xe.h。⚫ 函数返回值:无

EXIT
基本概念
简介是外部(扩展)中断事件控制器
包含20个产生事件/中断请求的边沿检测器 ,即总共: 20条EXTI线(F1)
EXTI 即是外部中断和事件控制器,它是由 20 个产生事件/中断请求的边沿检测器组成。每一条输入线都可以独立地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以独立地被屏蔽。挂起寄存器保持着状态线的中断请求。
中断和事件的
中断: 要进入NVIC,有相应的中断服务区函数,需要CPU 处理
事件: 不进入NVIC,仅用于内部硬件自动控制的,如: TIM DMA ADC
在这里插入图片描述
这里19根因为在设计的时候就没设计成互联型 互联型的是带上以太网的所以是20根

每条EXTI线都可以单独配置:选择类型(中断或者事件) ,触发方式(上升沿,下降沿,或者双边沿触发) ,支持软件触发,开启/屏蔽,有挂起状态位

EXTI的工作原理
在这里插入图片描述
标号①是一个边沿检测电路,包括边沿检测电路,上升沿触发选择寄存器(EXTI_RTSR)和下降沿触发选择寄存器(EXTI_FTSR)。边沿检测电路以输入线作为信号输入端,如果检测到有边沿跳变就输出有效信号‘1’,就输出有效信号‘1’到标号②部分电路,否则输入无效信号‘0’。边沿跳变的标准在于开始的时候对于上升沿触发选择寄存器或下降沿触发选择寄存器对应位的设置,对应位的设置可以参照一下表 16.1.2.1。标号②是一个或门电路,它的两个信号输入端分别是软件中断事件寄存器(EXTI_SWIER)和边沿检测电路的输入信号。或门电路只要输入端有信号‘1’,就会输出‘1’,所以就会输出‘1’到标号③电路和标号④电路。通过对软件中断事件寄存器的读写操作就可以启动中断/事件线,即相当于输出有效信号‘1’到或门电路输入端。标号③是一个与门电路,它的两个信号输入端分别是中断屏蔽寄存器(EXTI_IMR)和标号②电路输出信号。与门电路要求输入都为‘1’才输出‘1’,这样子的情况下,如果中断屏蔽寄存器(EXTI_IMR)设置为 0 时,不管从标号②电路输出的信号特性如何,最终标号③电路输出的信号都是 0;假如中断屏蔽寄存器(EXTI_IMR)设置为 1 时,最终标号③电路输出的信号才由标号②电路输出信号决定,这样子就可以简单控制 EXTI_IMR 来实现中断的目的。标号④电路输出‘1’就会把请求挂起寄存器(EXTI_PR)对应位置 1。最后,请求挂起寄存器(EXTI_PR)的内容就输出到 NVIC 内,实现系统中断事件的控制。接下来我们看看 EXTI 功能框图的产生事件的线路。产生事件线路是从标号②之后与中断线路有所不用,之前的线路都是共用的。标号④是一个与门,输入端来自标号②电路以及来自于事件屏蔽寄存器(EXTI_EMR)。如果 EXTI_EMR 寄存器设置为 0,那不管标号②电路输出的信号是‘0’还是‘1’,最终标号④输出的是‘0’;如果 EXTI_EMR 寄存器设置为 1,最终标号④电路输出信号就由标号③电路输出的信号决定,这
样子就可以简单的控制 EXTI_EMR 来实现是否产生事件的目的。
标号④电路输出有效信号 1 就会使脉冲发生器电路产生一个脉冲,而无效信号就不会使其
产生脉冲信号。脉冲信号产生可以给其他外设电路使用,例如定时器,模拟数字转换器等,这
样的脉冲信号一般用来触发 TIM 或者 ADC 开始转换。
产生中断线路目的使把输入信号输入到 NVIC,进一步运行中断服务函数,实现功能。而产
生事件线路目的是传输一个脉冲信号给其他外设使用,属于硬件级功能。

对于第一部分就是说 我使得上升沿置1 那么我通过边沿检测器进来一个上升沿 就允许传输到第二部分 如果是置为0 那么即使上升沿来了也不会
然后来到第二部分 第二部分是一个或门 因为我们收到的一部分内容是来自于前者通过边沿检测电路的(1)
因为上面连接的是软件中断事件寄存器 意思就是这一部分和块1的是并列的 大家都通过或门只要是1 都能传入下一级
这就是属于我们在选择触发上 可以选择硬件触发还是软件触发

接下来进入第三部分模块
硬件触发得到的1到了之后还得进入一个请求挂起寄存器 (因为对我们来说想要完成一次触发 不仅要保证 时序上的正确 还要保证 系统层面上 允许中断存在,不然真就随便一个中断就打断我现在做的事情吗) 1 来了之后回自动的使得请求挂起寄存器对应位置为1,然后和中断屏蔽寄存器共同连接至一个与门上 (所以中断屏蔽寄存器必须为1才能一起通过与门传输到NVIC中断控制器上)

上升沿触发选择寄存器(EXTI_RTSR)
在这里插入图片描述
我们只用到了0到19 但是第19位是只适用于互联型的所以只用到了0到18 因为板子正好只有19根中断线 当寄存器输入1时才会允许 输入线上的上升沿触发

同理下降沿也是类似的

中断屏蔽也是同理19根线
挂机EXTI_PR也是同理
假设EXTI-8发生了选择的边沿事件, 该为被置入1 那么我们可以通过在该位写入‘1’ 来清除它

EXTI_FTSR 下降沿触发
EXTI_RTSR 上升沿触发
EXTI_IMR 中断屏蔽寄存器
EXTI_PR 请求挂起寄存器

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
外部中断STM32单片机中的一种事件触发机制,它可以让外部设备向单片机发送一个中断信号,从而使单片机在正常执行的过程中立即转移到中断服务程序中执行相应的代码。中断可以用于实现实时性要求较的功能,例如按键检测、传感器数据采集等。 在STM32单片机中配置外部中断需要经过以下几个步骤: 1. 设置中断系统的优先级分组。这是一个系统级的设置,可以通过寄存器配置来实现。该设置决定了不同中断源之间的优先级关系。 2. 配置外部中断引脚。首先需要将对应的GPIO口配置为输入模式,然后将外部中断引脚与GPIO口连接起来。具体的配置过程包括设置引脚模式、引脚速度、上下拉电阻等。 3. 配置外部中断触发方式。根据具体的需求,可以选择边沿触发或电平触发。边沿触发可以进一步分为上升沿触发、下降沿触发和双边沿触发。 4. 编写中断服务程序。中断服务程序是在中断发生时执行的代码段,用于处理中断事件。在中断服务程序中可以编写相应的逻辑,例如读取按键状态、处理传感器数据等。 5. 配置中断优先级和使能中断。通过中断控制器的设置,可以决定中断优先级和是否允许中断优先级中断会在多个中断同时发生时优先得到处理。 6. 清除中断挂起位。在中断服务程序中,需要手动清除中断挂起位,表示该中断已经被处理。 总的来说,配置外部中断需要进行引脚配置、触发方式设置、中断服务程序编写和中断优先级设置等步骤。这样,当外部中断事件发生时,单片机会立即转移到中断服务程序中执行相应的代码,从而实现相应的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [STM32单片机--外部中断详解](https://blog.csdn.net/WYFDMW/article/details/107847097)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [【STM32】HAL库-睡眠模式-外部中断唤醒demo](https://download.csdn.net/download/qq_45607873/85319880)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值