一、简介
CM3内核支持256个中断,16个内核中断,240个外部中断,并且拥有256级的可编程中断设置。
但是STM32只用到了CM3内核的一部分,STM32有84个中断,包括16个内核中断和68个可屏蔽中断,具有16级可编程中断优先级。
STM32F103系列只有60个可屏蔽中断。
二、中断管理
1.对STM32进行中断分组,组0-4,同时对每个中断设置一个抢占优先级和一个响应优先级。组分配好后抢占位和响应位就已经确定。
组 |
bit[7-4](共4位) |
分配结果 |
0 |
0:4 |
0位抢占优先级,4位响应优先级 |
1 |
1:3 |
1位抢占优先级,3位响应优先级 |
2 |
2:2 |
2位抢占优先级,2位响应优先级 |
3 |
3:1 |
3位抢占优先级,1位响应优先级 |
4 |
4:0 |
4位抢占优先级,0位响应优先级 |
2.抢占优先级和响应优先级的区别
(1)高优先级的抢占优先级可以打断低抢占优先级的中断。
(2)抢占优先级相同的中断,高响应优先级不能打断低响应优先级。
(3)抢占优先级相同的中断,当中断同时发生时,响应级高的先执行。
(4)抢占和响应优先级都一样则哪个中断先发生,则执行哪个。
注意:一般优先级分组只设置一次,否则会出现中断管理混乱。
3.优先级配置
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//只设置一次
//在引脚配置中设置
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //串口1
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //响应优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能通道
NVIC_Init(&NVIC_InitStructure); //初始化
4.中断优先级的挂起解挂,查看当前激活状态
NVIC_GetPendingIRQ(IRQn_Type IRQn)
NVIC_SetPendingIRQ(IRQn_Type IRQn)
NVIC_ClearPendingIRQ(IRQn_Type IRQn)