中断

中断

1、简介

  • 中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。

alt text

2、异常类型

3、中断操作方式

(1)LL库

  • 配置NVIC
void NVIC_Configuration(void)
{
	
	NVIC_InitTypeDef NVIC_InitStructure;//定义初始化的结构体
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_x);//选择优先级位数
	NVIC_InitStructure.NVIC_IRQChannel = Channel;//选择该中断的来源
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = uint8_t;//定义该中断的抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = uint8_t;//定义该中断的子优先级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//失能或使能该中断(此处为使能,失能为DISABLE)
	NVIC_Init(&NVIC_InitStructure);//将该结构体初始化
}
  • 相关代码

中断通道:中断的来源
抢占优先级:

/*-------------------初始化NVIC的结构体------------------------*/
typedef struct
{
  uint8_t NVIC_IRQChannel;//指定相应的中断通道                    

  uint8_t NVIC_IRQChannelPreemptionPriority; //指定相应的抢占优先级

  uint8_t NVIC_IRQChannelSubPriority; //指定该中断的子优先级

  FunctionalState NVIC_IRQChannelCmd; //失能或使能该中断(使能用ENABLE,失能用DISABLE)
} NVIC_InitTypeDef;
/*-------------初始化中断结构体的函数----------------*/
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
{
  uint8_t tmppriority = 0x00, tmppre = 0x00, tmpsub = 0x0F;
  
  /* Check the parameters */
  assert_param(IS_FUNCTIONAL_STATE(NVIC_InitStruct->NVIC_IRQChannelCmd));
  assert_param(IS_NVIC_PREEMPTION_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority));  
  assert_param(IS_NVIC_SUB_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelSubPriority));
    
  if (NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE)
  {
    /* Compute the Corresponding IRQ Priority --------------------------------*/    
    tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08;
    tmppre = (0x4 - tmppriority);
    tmpsub = tmpsub >> tmppriority;

    tmppriority = NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre;
    tmppriority |=  (uint8_t)(NVIC_InitStruct->NVIC_IRQChannelSubPriority & tmpsub);
        
    tmppriority = tmppriority << 0x04;
        
    NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel] = tmppriority;
    
    /* Enable the Selected IRQ Channels --------------------------------------*/
    NVIC->ISER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =
      (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);
  }
  else
  {
    /* Disable the Selected IRQ Channels -------------------------------------*/
    NVIC->ICER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =
      (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);
  }
}
posted @ 2025-08-25 10:34  奶龙大王  阅读(21)  评论(0)    收藏  举报