中断
中断
1、简介
- 中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。
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);
}
}


浙公网安备 33010602011771号