您的位置 首页 IC

STM32 NVIC嵌套向量中止控制器函数剖析

中断管理函数CM3内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。但STM32并没有使用CM3内核的

中止办理函数

CM3内核支撑256个中止,其间包含了16个内核中止和240个外部中止,而且具有256级的可编程中止设置。但STM32并没有运用CM3内核的悉数东西,而是只用了它的一部分。STM32有76个中止,包含16个内核中止和60个可屏蔽中止,具有16级可编程的中止优先级。而咱们常用的便是这60个可屏蔽中止,所以咱们就只针对这60个可屏蔽中止进行介绍。

在MDK内,与NVIC相关的寄存器,MDK为其界说了如下的结构体:

typedef struct
{
vu32 ISER[2];
u32 RESERVED0[30];
vu32 ICER[2];
u32 RSERVED1[30];
vu32 ISPR[2];
u32 RESERVED2[30];
vu32 ICPR[2];
u32 RESERVED3[30];
vu32 IABR[2];
u32 RESERVED4[62];
vu32 IPR[15];
} NVIC_TypeDef;

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<IC_Channel; //使能中止位
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; //得到分组值

外部中止装备函数:

STM32的EXTI操控器支撑19个外部中止/事情恳求。每个中止设有状况位,每个中止/事情都有独立的触发和屏蔽设置。STM32的19个外部中止为:
线0~15:对应外部IO口的输入中止。
线16:连接到PVD输出。
PVD(Programmable Voltage Detector),即可编程电压监测器。应用于STM32ARM芯片中,作用是监督供电电压,在供电电压下降到给定的阀值以下时,发生一个中止,告诉软件做紧迫处理。当供电电压又康复到给定的阀值以上时,也会发生一个中止,告诉软件供电康复。
线17:连接到RTC闹钟事情。 RTC是多种名词的缩写,如:实时时钟(Real-Time Clock)
线18:连接到USB唤醒事情。
关于外部中止EXTI操控MDK界说了如下结构体:
typedef struct
{
vu32 IMR;
vu32 EMR;
vu32 RTSR;
vu32 FTSR;
vu32 SWIER;
vu32 PR;
} EXTI_TypeDef;

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/318396.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部