STM32 NVIC 中断优先级管理
STM32 有 84 个中断,包括 16 个内核中断和 68 个可屏蔽中断,具有 16 级可编程的中断优先级。
而我们常用的就是这 68 个可屏蔽中断,在 STM32F103 系列上面,又只有 60 个。
中断分组:STM32 将中断分为 5 个组,组 0~4。该分组的设置是由 SCB->AIRCR 寄存器的 bit10~8 来定义的。
组0 111 0:4 0 位抢占优先级,4 位响应优先级
组1 110 1:3 1 位抢占优先级,3 位响应优先级
组2 101 2:2 2 位抢占优先级,2 位响应优先级
组3 100 3:1 3 位抢占优先级,1 位响应优先级
组4 011 4:0 4 位抢占优先级,0 位响应优先级
抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高。高优先级的抢占优先级可以打断低优先级的,而响应优先级不可以打断低级别的响应优先级。一共是四位,16级中断优先级。
中断优先分组函数:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_x); //设置中断分组
typedef struct //定义初始化结构体变量
{
uint8_t NVIC_IRQC; //中断名
uint8_t NVIC_IRQChannelPreemptionPriority; //抢占优先级别
uint8_t NVIC_IRQChannelSubPriority; //优先级别
FunctionalState NVIC_IRQChannelCmd; //该中断是否使能
} NVIC_InitTypeDef;
NVIC_Init(&NVIC_InitStructure); //初始化函数
MDK地址映射
MDK 采用的方式是通过结构体来将寄存器组织在一起。GPIOA 的寄存器的地址=GPIOA 基地址+寄存器相对 GPIOA 基地址的偏移值,同时GPIO的基地址相对于所挂载的总线的地址是偏移的。
GPIOA_BASE 的地址为(APB2PERIPH_BASE + 0x0800)相对的GPIOA的BRR寄存器的偏移地址0x14,所以地址为GPIOA>BRR=GPIOA_BASE=0x40000000+0x10000+0x0800+0x014=0x40010814。