void NVIC_EnableIRQ (IRQn_Type IRQn); // Enables an interrupt
void NVIC_DisableIRQ (IRQn_Type IRQn); // Disables an interrupt
中断挂起、解挂寄存器
NVIC->ISPR[0] ~ NVIC->ISPR[15]
NVIC->ICPR[0] ~ NVIC->ICPR[15]
c复制代码
void NVIC_SetPendingIRQ(IRQn_Type IRQn); // Sets the pending status of an interrupt
void NVIC_ClearPendingIRQ(IRQn_Type IRQn); // Clears the pending status of an interrupt
uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn); // Reads the pending status of a interrupt
uint32_t NVIC_SetTargetState(IRQn_Type IRQn); // Sets interrupt as Non-secure
uint32_t NVIC_ClearTargetState(IRQn_Type IRQn); // Sets interrupt as Secure
uint32_t NVIC_GetTargetState(IRQn_Type IRQn); // Reads the target security state
优先级寄存器
NVIC->IPR[0] ~ NVIC->IPR[495]
c复制代码
void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority); // Sets the priority level of an IRQ/ exception
uint32_t NVIC_GetPriority(IRQn_Type IRQn); // Obtains the priority level of an interrupt or exception
软件触发中断寄存器(ArmV8-M 独有)
NVIC->STIR
c复制代码
NVIC->STIR = 3; // Triggers IRQ #3
系统异常相关SCB寄存器
1~15系统异常
相关寄存器
中断控制和状态寄存器
SCB->ICSR
设置和清除系统异常的挂起状态
通过读取 VECTACTIVE 字段决定当前执行的异常/中断号
配置SysTick的安全状态
系统中断优先级寄存器
SCB->SHP[0] ~ SCB->[11]
只有SVC,PendSV,SysTick异常的优先级能编程
应用中断和复位控制寄存器
SCB->AIRCR
10:8 PRIGROUP: 控制优先级分组
c复制代码
//Set Priority Group
void NVIC_SetPriorityGrouping (uint32_t PriorityGroup);
//Get Priority Group
uint32_t NVIC_GetPriorityGrouping (uint32_t PriorityGroup);
//Encodes the priority for an interrupt with the given priority group
uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority,
uint32_t Subpriority);
//Decodes an interrupt priority value with a given priority group to\
preemptive priority value and subpriority value.
void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t*
const pPreemptPriority, uint32_t* const pSubPriority);
系统处理控制和状态寄存器
SCB->SHCSR
配置错误异常的使能和挂起
指示系统异常是否在活跃的状态
异常或中断屏蔽寄存器
PRIMASK
使能后,所有优先级大于等于0的中断都会被屏蔽(除了NMI, HardFault)
c复制代码
void __enable_irq(); // Clears PRIMASK
void __disable_irq(); // Sets PRIMASK
void __set_PRIMASK(uint32_t priMask); // Sets PRIMASK to value
uint32_t __get_PRIMASK(void); // Reads the PRIMASK value