首页 > 其他分享 >学习Cortex-M:三种关中断方式

学习Cortex-M:三种关中断方式

时间:2022-11-20 19:33:58浏览次数:80  
标签:优先级 中断 BASEPRI NVIC 三种 Cortex 寄存器 外设


1、关闭整个CPU的所有中断;2、关闭特定外设的所有中断;3、关闭特定外设的特定中断源。

mingdu.zheng at gmail dot com

1、总开关

每个CPU有一个中断总开关。通过CPU中断控制寄存器实现。Cortex-M的中断控制寄存器包括:FAULTMASK、PRIMASK、BASEPRI、BASEPRI_MAX。总开关的本质是变更当前执行优先级,根据Cortex-M的架构设计,只有优先级高于当前执行优先级的中断或异常才能抢占CPU。

FAULTMASK

设置为1后关闭所有中断和异常,包括HardFault异常,只有NMI和Reset可以得到响应。

PRIMASK

设置为1后关闭所有中断和除了HardFault异常外的所有其他异常,只有NMI、Reset和HardFault可以得到响应。

BASEPRI

设置为n后,屏蔽所有优先级数值大于等于n的中断和异常。Cortex-M的优先级数值越大其优先级越低。

BASEPRI_MAX

和BASEPRI类似,但有个限制,即后写入的优先级数值要比当前的BASEPRI值小才会起作用,否则不起作用。

影响范围最广,影响CPU内的所有中断源。

疑问:线程模式下,当前优先级和中断优先级的抢占优先级相同,但中断的子优先级比当前子优先级高,会怎么样?当前优先级也分抢占优先级和子优先级吗?

2、分开关

Cortex-M包括一个嵌套向量中断控制器NVIC,每个外设在NVIC中都有一个对应的位,用来控制该外设的中断。

  • 写NVIC->ISER寄存器中外设对应位为1打开中断。
  • 写NVIC->ICER寄存器中外设对应位为1关闭中断。

分开关只影响特定外设的中断。

3、源开关

外设通常有多个中断源,如接收到数据、发送完成、接收超时等等。外设通常提供中断使能寄存器控制哪些中断源产生时要向上汇报(向分开关汇报)。源开关与特定的外设相关,不同的外设会有不同的中断,有不同的中断控制寄存器。有些外设本身有总开关,该总开关控制该外设的所有中断。

源开关影响范围最窄,仅影响外设的某一种中断源。

号外

STM32 HAL库采用外设寄存器关中断的方式。这种方式不依赖于外设在NVIC中的中断编号,更具有可移植性。如果采用NVIC寄存器关中断,那么需要知道外设关联的中断号,外设中断号可随着MCU的不同而不同,或者MCU内有多个同样的外设,每个外设实例的中断号都不是不同的。


标签:优先级,中断,BASEPRI,NVIC,三种,Cortex,寄存器,外设
From: https://blog.51cto.com/zoomdy/5871670

相关文章

  • 学习Cortex-M:结构体 vs 分散变量
    学习Cortex-M:结构体vs分散变量静态变量使用结构体表示的代码无论在space上还是speed上都要优于分散变量,应当尽量使用结构体。对于局部变量采用结构体还是分散变量并没有什......
  • c++中参数传递的三种方式
    一、值传递通过值传递传递的形参实际上是对实参的一个拷贝,对形参进行修改操作,不会影响到实参的值。【实例】#include<iostream>usingnamespacestd;voidchange(i......
  • 三种回归损失函数
    详细介绍这里,清楚的介绍了三种损失函数。我这里重点记录一下他们的异同,方便自己消化理解。1、对于回归损失函数,通常主要有MSE(均方误差),MAE(平均绝对误差),HuberLoss。其中,Hub......
  • redis三种新的数据结构
    redis新数据类型bitmaps操作Ascii码的数据类型,能够有效的提高内存使用效率和开发效率setbit:设置初始值gebit:取值bitcount:统计数据被设置为1饿数量bitmaps和set数......
  • SpringBoot提供的三种配置文件格式
    1、application.properties(传统格式/默认格式)e.g.server.port=80 2、application.yml(主流格式、推荐使用)e.g.server:  port:81 3、application.yamle.g.ser......
  • 二叉树的三种遍历
    #include<stdio.h>#include<stdlib.h>#include<string.h>chara[55];inti;structnode{intdata;structnode*ls,*rs;};structnode*cr(){structnode*r......
  • 创建线程的三种方式,第一种继承Thread类
    【1】在学习多线程一章之前,以前的代码是单线程的吗?不是,以前也是有三个县城同时执行的。 【2】现在自己想制造多线程---》创建线程??先有线程类---》再有线程对象  ......
  • Day14.3:数组的三种初始化理解
    数组的三种初始化静态初始化即数组的声明和赋值一起完成int[]arrays={1,2,3,4,5};动态初始化-——手动赋值(包含默认初始化)声明数组的但不赋以确切的值,没有赋值......
  • 35:列表_元素删除的三种方式_删除本质是数组元素拷贝
    ###列表元素的删除###del删除删除列表指定位置的元素。>>>a=[100,200,888,300,400]>>>dela[1]>>>a[100,200,300,400]###pop()方法pop()删除并返回指定位置......
  • pictureBox1.Image的获得图片路径的三种方法
    1.绝对路径: this.pictureBox2.Image=Image.FromFile("D://1.jpg"); 2.相对路径: Application.Startup......