中止办理函数
在MDK内,与NVIC相关的寄存器,MDK为其界说了如下的结构体:
ISER[2]:Interrupt set enable registers中止使能寄存器组
ICER[2]:interrupt clear enable registers 中止除能寄存器组
ISPR[2]:interrupt set pending registers 中止挂起寄存器组
ICPR[2]: interrupt clear pending registers 中止解挂寄存器组
IABR[2]:interrupt active bit registers 中止激活标志寄存器组
首要剖析
IPR[15]:interrupt priority registers 中止优先级操控寄存器组
运用函数完成中止分组: 可选分组0–4
MY_NVIC_PriorityGroupConfig(u8 NVIC_Group)
{
u32 temp,temp1; //设置中转变量
temp1=(~NVIC_Group)&0x07; //取后3位
temp1<<=8; //左移8位
temp=SCB->AIRCR; //读取从前设置
temp&=0x0000F8FF; //清空从前设置
temp|=0x05FA0000; //刺进密钥
temp|=temp1; //分组设置赋值进
SCB->AIRCB=temp; //设置完的值赋值给中止分组寄存器
}
句子解读:
temp1=(~NVIC_Group)&0x07; 因为
所以组号取反与111 即得到分组所需寄存器值
temp|=0x05FA0000;
密钥
运用函数完成中止优先级设置:
void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)
{
u32 temp;
u8 IPRADDR=NVIC_Channel/4; //每组只能存4个得到组地址
u8 IPROFFSET=NVIC_Channel%4; //得到组内偏移地址
IPROFFSET=IPROFFSET*8+4; //得到切当地址
MY_NVIC_PriorityGroupConfig(NVIC_Group); //设置分组
temp=NVIC_Preemptionpriority<<(4-NVIC_Group); // 设置抢占优先级
temp|=NVIC_SubPriority&(0x0f>>NVIC_Group); //设置呼应优先级
temp&=0xf; //取低4位
if(NVIC_Channel<32) NVIC->ISER[0]|=1<
else
NVIC->ISER[1]|=1<<(NVIC_Channel-32);
NVIC->IPR[IPRADDR]|=temp<
句子解读:
u8 IPRADDR=NVIC_Channel/4; //ISER[2]组能够设置60个中止优先级,每组15个寄存器,每个寄存器32位 每个可中止8位,每个寄存器能够设置4个中止, 组地址=channel/4; //挑选中止号组(0–3)(4–7),,,(56—59)
u8 IPROFFSET=NVIC_Channel%4; 组内偏移地址 //挑选第几个中止号
IPROFFSET=IPROFFSET*8+4; //因为每个中止8位,只用了前4位,所以偏移4
temp=NVIC_Preemptionpriority<<(4-NVIC_Group); //抢占优先级在左面,依据抢占位多少进行左移
temp|=NVIC_SubPriority&(0x0f>>NV%&&&&&%_Group); //呼应优先级在右边,依据呼应位多少进行右移
temp&=0xf; //得到分组值
外部中止装备函数:
线16:连接到PVD输出。
PVD(Programmable Voltage Detector),即可编程电压监测器。应用于STM32ARM芯片中,作用是监督供电电压,在供电电压下降到给定的阀值以下时,发生一个中止,告诉软件做紧迫处理。当供电电压又康复到给定的阀值以上时,也会发生一个中止,告诉软件供电康复。