首页 > 其他分享 >中断解析

中断解析

时间:2023-04-05 21:33:25浏览次数:32  
标签:__ 中断 Register IO Offset interrupt 解析 uint32

NVIC_SetPriority函数解析

/**
 * @brief  Set the priority for an interrupt
 *
 * @param  IRQn      The number of the interrupt for set priority
 * @param  priority  The priority to set
 *
 * Set the priority for the specified interrupt. The interrupt 
 * number can be positive to specify an external (device specific) 
 * interrupt, or negative to specify an internal (core) interrupt.
 *
 * Note: The priority cannot be set for every core interrupt.
 */
static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
{
  if(IRQn < 0) {
    SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M3 System Interrupts */
  else {
    NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff);    }        /* set Priority for device specific Interrupts  */
}

NVIC_SetPriority函数的作用:

为中断号IRQn的中断,设置优先级。在这里分为两种情况:

1)internal interrupt,即内核里面的外设; IRQn < 0

2)external interrupt,即普通的外设;IRQn > 0

 

 

注意:

1.对Cortex-M3内核里面的一个外设,它的中断号是小于0的。systick的中断号为-1

2.在NVIC_SetPriority中,我们需要配置的是SCB->SHP寄存器。该寄存器是什么呢?

我们需要查看Cortex-M3内核的手册:

System control block(SCB)

SHP又是什么?

System Handler Priority registersx(SHPR),当我们设置内核里面的一个外设的中断优先级时,我们就要设置该寄存器。

typedef struct
{
  __I  uint32_t CPUID;                        /*!< Offset: 0x00  CPU ID Base Register                                  */
  __IO uint32_t ICSR;                         /*!< Offset: 0x04  Interrupt Control State Register                      */
  __IO uint32_t VTOR;                         /*!< Offset: 0x08  Vector Table Offset Register                          */
  __IO uint32_t AIRCR;                        /*!< Offset: 0x0C  Application Interrupt / Reset Control Register        */
  __IO uint32_t SCR;                          /*!< Offset: 0x10  System Control Register                               */
  __IO uint32_t CCR;                          /*!< Offset: 0x14  Configuration Control Register                        */
  __IO uint8_t  SHP[12];                      /*!< Offset: 0x18  System Handlers Priority Registers (4-7, 8-11, 12-15) */
  __IO uint32_t SHCSR;                        /*!< Offset: 0x24  System Handler Control and State Register             */
  __IO uint32_t CFSR;                         /*!< Offset: 0x28  Configurable Fault Status Register                    */
  __IO uint32_t HFSR;                         /*!< Offset: 0x2C  Hard Fault Status Register                            */
  __IO uint32_t DFSR;                         /*!< Offset: 0x30  Debug Fault Status Register                           */
  __IO uint32_t MMFAR;                        /*!< Offset: 0x34  Mem Manage Address Register                           */
  __IO uint32_t BFAR;                         /*!< Offset: 0x38  Bus Fault Address Register                            */
  __IO uint32_t AFSR;                         /*!< Offset: 0x3C  Auxiliary Fault Status Register                       */
  __I  uint32_t PFR[2];                       /*!< Offset: 0x40  Processor Feature Register                            */
  __I  uint32_t DFR;                          /*!< Offset: 0x48  Debug Feature Register                                */
  __I  uint32_t ADR;                          /*!< Offset: 0x4C  Auxiliary Feature Register                            */
  __I  uint32_t MMFR[4];                      /*!< Offset: 0x50  Memory Model Feature Register                         */
  __I  uint32_t ISAR[5];                      /*!< Offset: 0x60  ISA Feature Register                                  */
} SCB_Type;

 

标签:__,中断,Register,IO,Offset,interrupt,解析,uint32
From: https://www.cnblogs.com/-glb/p/17290976.html

相关文章

  • ZooKeeper数据和集群特点,ZAB协议和选主过程解析
    前言本文讲述ZooKeeper集群架构特点、数据结构、事务ID、选主和ZAB协议具体执行过程。服务保证ZooKeeper非常快速且非常简单。由于它的目标是构建更复杂的服务(如同步)的基础,因此它提供了一组保证:【顺序一致性】来自客户端的更新将按发送顺序执行,因为只有唯一的主节点负责写......
  • redis主从同步、哨兵自动故障迁移具体过程解析
    前言本问阐述Redis主从同步、哨兵监控和故障迁移的过程,并通过各个服务日志加以验证。准备工作主从和哨兵安装见安装过程。为了方便通过日志观察同步过程,你可以在每个Redis和Sentinel配置文件中修改下面参数,实现前台运行并将日志输出到控制台。#这两个配置是为了实......
  • Redis持久化RDB和AOF原理解析、使用和优缺点对比
    前言本文讲述Redis两种持久化方式RDB和AOF优缺点以及原理。为何需要持久化?Redis是基于内存操作的,进程终止、服务器宕机后内存数据会丢失,但是在很多使用场景中我们希望数据不丢失,服务重启之后数据还能恢复到停机前的状态,特别是使用Redis做数据库的情况。Redis持久化......
  • Kafka原理解析
    前言从整体浅析Kafka集群结构、和Zookeeper之间的关系、长轮询机制、消息生产和消费以及顺序消费等。名词解释Broker(Kafka服务)Controller(唯一充当控制器的Kafka服务)Topic(消息主题,一个主题包含多个)Partition(消息分区),Replica(分区副本),Leader(主分区),Follower(从分区)Metadata(元数......
  • Kafka中ACKS LSO LEO LW HW AR ISR OSR解析
    前言Kafka中ACKS三种策略,LSO、LEO、LW、HW、AR、ISR、OSR解析。名称解释ACKS(Acknowledgments)确认、回执LW(Lowwatermark)低水位、LSO(Logstartoffset)起始偏移量HW(Highwatermark)高水位LEO(Logendoffset)日志末尾偏移量AR(Assignedreplica)分配的副本ISR(Insyncreplica)正常......
  • HJ74_参数解析_转义字符“”_split()与split(“ ”)
    细节注意:0、字符串的count()方法可计算字符个数,如  1、split()方法,以空格划分区别,如下图: 代码如下1importsys2a=sys.stdin.readline().strip()3a1=""4f=05foriina:#在第一个“前加入一个空格,在第二个“加入两个空格6ifi=="\""andf==0:......
  • Raft协议及伪码解析
    跟着Martin大神学习Raft协议,带上讲解和伪码确实给人深入浅出的感觉,英音听起来十分优雅,也是一种享受了~视频地址:DistributedSystems6.2:Raft整篇主要包括了十张Slide:节点的状态转换首先需要明确,节点只有三种状态:followercandidateleaderfollower当一个节点刚启动的......
  • Spring 源码解析 - xml解析封装BeanDefinition(1)
    -  XML解析封装BeanDefinition  断点在 DefaultListableBeanFacy,registerBeanDefinition()二 如果给属性赋值 三 各种postprocessor       ##2、Spring套路点-1、AbstractBeanDefinition看看何时给容器中注入了什么组件-2、BeanFactory让......
  • 单机最快的队列Disruptor解析和使用
    前言介绍高性能队列Disruptor原理以及使用例子。Disruptor是什么?Disruptor是外汇和加密货币交易所运营商LMAXgroup建立高性能的金融交易所的结果。用于解决生产者、消费者及其数据存储的设计问题的高性能队列实现。可以对标JDK中的ArrayBlockingQueue。是目前单机且基于内......
  • kubegres 源码解析(二) kubebuilder简介
    摘要Kubegres完全使用KubebuilderV3版本开发,在对Kubegres进行代码解析前,首先了解一下Kubebuilder,本文尝试理清几个问题:如何使用Kubebuilder生成Controller/Operator项目?项目结构是什么,每个文件的作用是什么?具体到最重要的几个文件,代码如何组织,功......