嵌入式设计应用
stm32的Cortex内核具有强大的异常响应系统,它把能够打断当前代码执行流程的事件分为异常( exception)和中断( terryp),并把它们用二个表管理起来,编号为0~15的称为内核异常,而16以上的则称为外部中断(外,相对内核而言),这个表就称为中断向量表。
而STM32对这个表重新进行了编排,把编号从-3至6的中断向量定义为系统异常,编号为负的内核异常不能被设置优先级,如复位( Reset)、不可屏蔽中断(NMI)、硬错误( Hardfault)。从编号7开始的为外部中断,这些中断的优先级都是可以自行设置的。
STM32的中断如此之多,配置起来并不容易,因此,我们需要一个强大而方便的中断控制器NVIC,NVIC是属于 Cortex内核的器件。
配置STM32的中断只需要理解2个内容,配置4个变量即可。
4个变量:
NV|IC_ IRQChannel中断向量
NVIC_ IRQChannelCmd使能/禁止
NVIC_ IRQChannelPreemption Priority抢占优先级
NVIC_IRQChannelSub Priority响应优先级
两个内容:抢占优先级和响应优先级
抢占优先级
抢占是指打断其他中断的属性,即因为具有这个属性,会出现嵌套中断(在执行中断服务函数A的过程中被中断B打断,先执行完中断服务B再继续执行中断服务A)。其属性编号越小,优先级别越高。
响应优先级
响应属性则应用在抢占属性相同的情况下,如果两个中断同时到达,则先处理响应优先级高的中断,再处理响应优先级低的中断。其属性编号越小,优先级别越高。
若内核正在执行c的中断服务函数,则它能被抢占优先级更高的中断A打断,由于B和C的抢占优先级相同,所以C不能被B打断。但如果B和C中断是同时到达的,内核就会首先响应响应优先级别更高的B中断
抢占优先级和响应优先级的数量由一个4位的数字来决定。
第0组:所有4位用来配置抢占优先级,即NVIC配置的24=16种中断向量都是只有抢占属性,没有响应属性。
第1组:最高1位用来配置抢占优先级,低3位用来配置响应优先级。抢占优先级(0级,1级)响应优先级分别为0~7。
第2组:2位用来配置抢占优先级,2位用来配置响应优先级。即22=4种抢占优先级,22=4种响应优先级。
第3组:高3位用来配置抢占优先级,最低1位用来配置响应优先级。即有8种抢占优先级,2种响应2优先级。
第4组:所有4位用来配置响应优先级。即6种中断向量具有都不相同的响应优先级。
第一步定义一个中断配置结构体变量
NVIC_Init TypeDef NVIC_IinitStructure;
第二步建立中断优先级配置组
NVIC_Ppriority Group Config (NVIC_Priority Group_1);
第三步对结构体变量初始化
NVIC_IRQChannel中断向量
NVIC_IRQChannelCmd使能/禁止
NVIC_IRQChannel Preemption Priority抢占优先级
NVIC_IRQChannelSubPriority响应优先级
第四步 NVIC_Init (& NVIC_InitStructure)
全部0条评论
快来发表一下你的评论吧 !