欢迎来到天天文库
浏览记录
ID:50189479
大小:127.85 KB
页数:6页
时间:2020-03-06
《stm32 NVIC中断管理实现.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、stm32NVIC中断管理实现[直接操作寄存器]cortex-m3支持256个中端,其中包含了16个内核中断,240个外部中断。stm32只有84个中断,包括16个内核中断和68个可屏蔽中断。stm32f103上只有60个中断,f107上才有68个中断。中断是stm32很基础的一个功能,学会使用中断,才可以更好的使用其他的外设。理解stm32的中断,必须要先从stm32的中断优先级分组是怎么回事。要理解优先级分组,就要先理解什么是先占优先级,和次占优先级。先占优先级的概念等同于51单片机中的中断。假设有两中断先后触发,已经在执行的中断先
2、占优先级如果没有后触发的中断先占优先级更高,就会先处理先占优先级高的中断。也就是说又有较高的先占优先级的中断可以打断先占优先级较低的中断。这是实现中断嵌套的基础。次占优先级只在同一先占优先级的中断同时触发时起作用,先占优先级相同,则优先执行次占优先级较高的中断。次占优先级不会造成中断嵌套。如果中断的两个优先级都一致,则优先执行位于中断向量表中位置较高的中断。还需要注意的一点是这里的中断优先级高是指是指是否更接近0级,0级优先级是最高的。那么最低的优先级可以是多少?这就涉及了优先级分组的概念。stm32通过一个中断向量控制器(NVIC),
3、来分配先占优先级和次占优先级的数量。armcortex-m3内核中拥有一个3位宽度的的PRIGROUP数据区,用来指示一个8位数据序列中的小数点的位置从而表示中断优先级的分组。举个例子可以更好的理解:如果PRIGROUP数据位000即为0说明8位数据序列中小数位置在第1位的左边为xxxxxxx.y用于表示中断优先级的分组的含义就是用7位的数据宽度来表示先占优先级的数量即为128用1位的数据宽度来表示次占优先级数量即为2所以armcortex-m3中有2的三次方即为8个优先级分组。但是stm32中只有5个优先级分组,表示方法略有不同,参照
4、下表:MDK中定义的中断相关的寄存器结构体为:typedefstruct{vu32ISER[2];u32RESERVED0[30];vu32ICER[2];u32RSERVED1[30];vu32ISPR[2];u32RESERVED2[30];vu32ICPR[2];u32RESERVED3[30];vu32IABR[2];u32RESERVED4[62];vu32IPR[15];}NVIC_TypeDef;ISER[2]:中断使能寄存器组stm32可屏蔽中断共有60个,这里用了两个32位的寄存器,可以表示64个中断。stm32只用了
5、前60位。若要使能某个中断,则必须设置相应的ISER位为1。具体每一位对应的中断关系如下:(参见MDK下的stm32f10x_nvic.h)01#defineWWDG_IRQChannel((u8)0x00)/*WindowWatchDogInterrupt*/02#definePVD_IRQChannel((u8)0x01)/*PVDthroughEXTILinedetectionInterrupt*/03#defineTAMPER_IRQChannel((u8)0x02)/*TamperInterrupt*/04#defineRTC
6、_IRQChannel((u8)0x03)/*RTCglobalInterrupt*/05#defineFLASH_IRQChannel((u8)0x04)/*FLASHglobalInterrupt*/06#defineRCC_IRQChannel((u8)0x05)/*RCCglobalInterrupt*/07#defineEXTI0_IRQChannel((u8)0x06)/*EXTILine0Interrupt*/08#defineEXTI1_IRQChannel((u8)0x07)/*EXTILine1Interrupt*/
7、09#defineEXTI2_IRQChannel((u8)0x08)/*EXTILine2Interrupt*/10#defineEXTI3_IRQChannel((u8)0x09)/*EXTILine3Interrupt*/11#defineEXTI4_IRQChannel((u8)0x0A)/*EXTILine4Interrupt*/12#defineDMA1_Channel1_IRQChannel((u8)0x0B)/*DMA1Channel1globalInterrupt*/13#defineDMA1_Channel2_IRQ
8、Channel((u8)0x0C)/*DMA1Channel2globalInterrupt*/14#defineDMA1_Channel3_IRQChannel((u8)0x0D)/*DMA1Channe
此文档下载收益归作者所有