欢迎来到天天文库
浏览记录
ID:33635025
大小:490.63 KB
页数:12页
时间:2019-02-27
《4.stm32 nvic嵌套向量中断控制器》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、stm32NVIC中断管理实现(直接操作寄存器) cortex-m3支持256个中断,其中包含了16个内核中断,240个外部中断。stm32只有84个中断,包括16个内核中断和68个可屏蔽中断(stm32f103上只有60个可屏蔽中断,f107上才有68个中断) 中断是stm32很基础的一个功能,学会使用中断,才可以更好的使用其他的外设。理解stm32的中断,必须要先从stm32的中断优先级分组是怎么回事。要理解优先级分组,就要先理解什么是先占优先级和次占优先级。 先占优先级的概念等同于51
2、单片机中的中断。假设有两中断先后触发,已经在执行的中断的先占优先级如果没有后触发的中断的先占优先级高,就会处理先占优先级高的中断。也就是说又有较高的先占优先级的中断可以打断先占优先级较低的中断。这是实现中断嵌套的基础。 次占优先级只在同一先占优先级的中断同时触发时起作用,先占优先级相同,则优先执行次占优先级较高的中断。次占优先级不会造成中断嵌套(但是可以在挂起等待时插队)。如果中断的两个优先级都一致,则优先执行位于中断向量表中位置较高的中断。还需要注意的一点是:这里的中断优先级高是指谁更接近0级,0级
3、优先级是最高的。 那么最低的优先级可以是多少?这就涉及了优先级分组的概念。stm32通过一个嵌套中断向量控制器(NVIC)来分配先占优先级和次占优先级的数量。cortex-m3内核中拥有一个3位宽度的的PRIGROUP数据区,用来指示一个8位数据序列中的小数点的位置从而表示中断优先级的分组。 举个例子可以更好的理解:如果PRIGROUP数据位000(即为0组),说明8位数据序列中小数位置在第1位的左边为xxxxxxx.y用于表示中断优先级的分组的含义就是用7位的数据宽度来表示先占优先级的数量即为128,用1
4、位的数据宽度来表示次占优先级数量即为2。(上述是指cortex-m3内核的情况,而实际的stm32则只用到8位中的高四位) 所以cortex-m3中有2的三次方即为8个优先级分组。但是stm32中只有5个优先级分组(0000~0100),表示方法略有不同。 一、NVIC寄存器组在MDK内,与NVIC相关的寄存器,MDK为其定义了如下的结构体: typedef struct { vu32 ISER[2]; //2个32位中断使能寄存器,分别对应到60个可屏蔽中断 u32 RESERVED0[3
5、0]; (预留或者保留的意思)vu32 ICER[2]; //2个32位中断除能寄存器,分别对应到60个可屏蔽中断 u32 RSERVED1[30]; vu32 ISPR[2]; //2个32位中断挂起寄存器,分别对应到60个可屏蔽中断,可挂起正在执行的中断 u32 RESERVED2[30]; vu32 ICPR[2]; //2个32位中断解挂寄存器分别对应到60个可屏蔽中断,可解除被挂起的中断 u32 RESERVED3[30];vu32 IABR[2];
6、 //2个32位中断激活标志寄存器,可读取该寄存器判断当前执行的中断是u32 RESERVED4[62];哪个,中断执行完硬件清零,只读 vu32 IPR[15]; //15个32位中断优先级分组寄存器,每个中断分配8个bit,对应到4*15=60个中断} NVIC_TypeDef; 它们对应ARM手册中的名称为:ISER=InterruptSet-EnableRegistersICER=InterruptClear-EnableRegistersISPR=InterruptSet-Pending
7、RegisterICPR=InterruptClear-PendingRegisterIABR=InterruptActiveBitRegisterIPR=InterruptPriorityRegisters每个寄存器有32位,以InterruptSet-EnableRegisters说明,ISER[0]对应中断源0~31,ISER[1]对应中断源32~63,STM32只有60个中断源,所以没有ISER[2:7](因为cortex-m3支持256个中断,即需要256个使能位),转为RESERVED(保留)。
8、首先分析为什么定义。这是因为ISER的地址是从E000E100开始的,ICER是从E000E180开始的,依次类推;可见从0xE000E100到0xE000E180间隔128个8位,也就是32个32位的数据;这就是vu32XXX[2]+u32RESERVED0[30]总的位数。 1) ISER包括ISER[0]和ISER[1],它们的每个位的值依次对应一个中断的开启和关闭。例如ISER[0]中的第0位对应WW
此文档下载收益归作者所有