中断组别配置,NVIC中断函数在misc.c文件中?
NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
?NVIC_PriorityGroup有5个有效参数,对应0~4五个中断组
#define IS_NVIC_PRIORITY_GROUP(GROUP) (((GROUP) == NVIC_PriorityGroup_0) || \
((GROUP) == NVIC_PriorityGroup_1) || \
((GROUP) == NVIC_PriorityGroup_2) || \
((GROUP) == NVIC_PriorityGroup_3) || \
((GROUP) == NVIC_PriorityGroup_4))
五个组别的抢占优先级(PreemptPriority)和响应优先级(或称子优先级SubPriority)的位数不同
0 | 0位抢占优先级4位子优先级 | 1 | 1:3 | 2 | 2:2 | 3 | 3:1 | 4 | 4:0 |
中断发生顺序
- 高抢占优先级可以打断低抢占优先级
- 抢占优先级相同时,高响应优先级的中断先发生
- 抢占和响应优先级都相同时,进入先发生的中断函数
?单个中断的初始化配置
NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);//单个中断配置
typedef struct
{
uint8_t NVIC_IRQChannel; //中断通道
uint8_t NVIC_IRQChannelPreemptionPriority; //抢占优先级
uint8_t NVIC_IRQChannelSubPriority; //响应优先级/子优先级
FunctionalState NVIC_IRQChannelCmd; //中断通道使能
} NVIC_InitTypeDef;
其他相关函数:
以下是部分定义在core_cm3.h中的函数
(挂起指中断处于暂停处理中断,转而优先处理优先级更高的中断)
uint32_t NVIC_GetActive(IRQn_Type IRQn);//判断是否进入相应中断程序
uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn);//获取挂起状态
void NVIC_SetPendingIRQ(IRQn_Type IRQn);//设置中断挂起
void NVIC_ClearPendingIRQ(IRQn_Type IRQn);//清除挂起
|