一.中断简介
1.嵌套向量中断控制器NVIC:属于内核部分
2.中断结构体
typedef struct
{
__IO uint32_t ISER[8]; //中断使能寄存器
uint32_t RESERVED0[24];
__IO uint32_t ICER[8]; //中断清除寄存器
uint32_t RSERVED1[24];
__IO uint32_t ISPR[8]; //中断使能悬起寄存器
uint32_t RESERVED2[24];
__IO uint32_t ICPR[8]; //中断断开悬起寄存器
uint32_t RESERVED3[24];
__IO uint32_t IABR[8]; //中断有效位寄存器
uint32_t RESERVED4[56];
__IO uint8_t IP[240]; //中断优先级寄存器
uint32_t RESERVED5[644];
__O uint32_t STIR; //软件触发中断寄存器
} NVIC_Type;
悬起:同时来的中断,优先级低的中断被悬起,不被处理
3.中断优先级
优先级:每组的优先级有效值0-255,数字越低,逻辑优先级越高。
优先级设定时,低四位未使用,设定优先级分组时,NVIC_Priority_Group0中0表示主优先级为0,子优先级有四位表示,为0-15,bit7,bit6,bit5,bit4用来表示子优先级。NVIC_Priority_Group1中1表示主优先级为1,子优先级为0-7,用bit6,bit5,bit4表示。在比较中断优先级时,先比较主优先级,再比较子优先级,若主,子优先级相同,则比较向量表中的硬件编号(越小优先级越高)。
二.中断编程
1.中断编程顺序
使能中断请求:
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
{
assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
}
中断初始化:
NVIC_InitTypeDef
typedef struct
{
uint8_t NVIC_IRQChannel; //中断源
uint8_t NVIC_IRQChannelPreemptionPriority; //抢占优先级
uint8_t NVIC_IRQChannelSubPriority; //子优先级
FunctionalState NVIC_IRQChannelCmd; //使能或者失能
} NVIC_InitTypeDef;
中断函数名必须和中断向量表中已经初始化的函数名相同,写错了只会执行已经定义好的初始化函数名,但是中断基本没起作用。
本文是参考野火视频学习总结文章