第5章 向量中断控制器_第1页
第5章 向量中断控制器_第2页
第5章 向量中断控制器_第3页
第5章 向量中断控制器_第4页
第5章 向量中断控制器_第5页
已阅读5页,还剩32页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章

向量中断控制器5.1异常类型、优先级5.1.1异常类型

Cortex-M3的每一个异常都有一个编号,编号0对应正常工作模式,编号1~255对应各种异常;每一个异常都可分配一个优先级,优先级值越小,优先级别越高,优先级可以为负。其中1~15号异常为系统异常,16~255都是外部中断异常;在大部分情况下,开发应用中很少涉及到1-15号异常的编程处理,我们更关注的是16-255号的外部异常。编号类型优先级描述1复位-3复位,具有最高优先级2NMI-2不可屏蔽中断(来自外部NMI输入脚)3硬件出错-1如果相应的异常没有被启用,那么都将触发该异常4存储管理异常可编程存储器管理异常,MPU访问违规或访问位置出错均会触发5总线异常可编程总线系统出错,如取指,或取数据异常6使用异常可编程程序错误导致的异常7-10保留N/AN/A11SVCall可编程执行系统服务调用指令引发的异常12调试监视器可编程调试监控器异常,如断点,数据观察点,外部调试请求等13保留N/AN/A14PendSV可编程为系统设备开发的可悬挂请求15SysTick可编程系统时基定时器16~255IRQ0~239可编程外部中断0~239对于编程开发来说,我们涉及最多的异常就是IRQ,0~15号异常是系统级的异常,比较少用;另外,每一种异常都有一个编号和一个异常优先级,异常的编号是固定的,但是异常的优先级是可以编程的,当然优先级为负的例外。优先级数值越小,优先级别越高。5.1.2异常优先级及优先级分组寄存器Cortex-M3的优先级包括抢占优先级和子优先级。抢占优先级高的中断可以打断抢占优先级低的中断,抢占优先级相同时,优先执行子优先级高的中断,但是不会打断正在执行的同级别抢占优先级中断。优先级的数值越小,优先级别越高。应用程序中断及复位控制寄存器SCB_AIRCR中PRIGROUP位段用来控制优先级的分组;应用程序中断及复位控制寄存器SCB_AIRCR:位段名称类型复位值描述31:16VECTKEYR/W-访问钥匙:任何对该寄存器的写操作,都必须同时把0x05FA写入此段,否则写操作被忽略。若读取此半字,则0xFA0515ENDIANESSR-端模式设置。1=大端(BE8),0=小端。此值是在复位时确定的,不能更改。10:8PRIGROUPR/W0优先级分组2SYSRESETREQW-请求芯片控制逻辑产生一次复位1VECTCLRACTIVEW-清零所有异常的活动状态信息。通常只在调试时用,或者在OS从错误中恢复时用。0VECTRESETW-复位CM3处理器内核(调试逻辑除外),但是此复位不影响芯片上在内核以外的电路PRIGROUP共占3位,值的范围是0-7,假如PRIGROUP值为5,则每一个中断对应的优先级寄存器的6、7三位表示对应中断的抢占优先级,其他位表示子优先级;每一个中断优先级寄存器占8位。Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0抢占优先级子优先级以16级优先级为例,优先级之所以会只有16级,是因为在M3单片机设计时,只使用了优先级寄存器NVIC_IPRx的高4位;如果此时PRIGROUP值为5,则优先级分组如下:此时0-3位虽然没有使用,但是PRIGROUP的值可以设为0-3之间的值,如果PRIGROUP设为1,则优先级分组如下:此时16级优先级都是抢占优先级,高优先级能打断所有低优先级。Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0抢占优先级子优先级未使用子优先级Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0实际使用抢占优先级[7:4]未使用抢占优先级未使用子优先级5.2中断向量表当有异常发生时,处理器需要确定对应异常的函数起始地址,各个异常的函数起始地址都存储在一个向量表中,每个地址占4字节,系统找到函数入口地址后就可调到异常代码处执行对应中断函数;为了可以动态重新分配中断,CM3允许可编程设置向量表基址,通过设置向量表偏移寄存器存器VTOR即可设置向量表起始地址,当设置在RAM范围内时,即可实现动态修改中断函数地址。VTOR寄存器:在应用开发中,每一个工程都有一个汇编的启动代码,这个启动代码里面已经包含了向量表,我们需要做的就是把自己用到的中断函数写出实现即可;中断函数的名字必须和汇编里面的名字一致;汇编内的中断函数入口顺序不能随意修改或者删除。位段名称类型复位值描述29TBLBASER/W0向量表所在区域标志0:ROM1:RAM28:7TBLOFFR/W0相对ROM或者RAM起始地址的偏移量5.3NVIC寄存器描述5.3.1中断使能寄存器NVIC_ISER0/1STM32F103系列小、中、大容量单片机有60个可屏蔽中断,NVIC_ISER[0]和NVIC_ISER[1]两个32位寄存器,可控制64个可屏蔽中断的使能,NVIC_ISER[0]的0~31位对应0~31号中断,NVIC_ISER[1]的0~31位对应32~63号中断;1使能中断,0失能中断。NVIC_ISER寄存器只能写1,写0无效;若要清除指定位为0,需要使用NVIC_ICER寄存器;STM32F103系列小、中、大容量单片机0~59号IRQ可屏蔽中断如下表:中断位置可屏蔽中断描述中断位置可屏蔽中断描述0WWDG_IRQChannel30TIM4_IRQChannel1PVD_IRQChannel31I2C1_EV_IRQChannel2TAMPER_IRQChannel32I2C1_ER_IRQChannel3RTC_IRQChannel33I2C2_EV_IRQChannel4FLASH_IRQChannel34I2C2_ER_IRQChannel5RCC_IRQChannel35SPI1_IRQChannel6EXTI0_IRQChannel36SPI2_IRQChannel7EXTI1_IRQChannel37USART1_IRQChannel8EXTI2_IRQChannel38USART2_IRQChannel9EXTI3_IRQChannel39USART3_IRQChannel10EXTI4_IRQChannel40EXTI15_10_IRQChannel11DMA1_Channel1_IRQChannel41RTCAlarm_IRQChannel12DMA1_Channel2_IRQChannel42USBWakeUp_IRQChannel13DMA1_Channel3_IRQChannel43TIM8_BRK_IRQChannel14DMA1_Channel4_IRQChannel44TIM8_UP_IRQChannel15DMA1_Channel5_IRQChannel45TIM8_TRG_COM_IRQChannel16DMA1_Channel6_IRQChannel46TIM8_CC_IRQChannel17DMA1_Channel7_IRQChannel47ADC3_IRQChannel18ADC1_2_IRQChannel48FSMC_IRQChannel19USB_HP_CAN_TX_IRQChannel49SDIO_IRQChannel20USB_LP_CAN_RX0_IRQChannel50TIM5_IRQChannel21CAN_RX1_IRQChannel51SPI3_IRQChannel22CAN_SCE_IRQChannel52UART4_IRQChannel23EXTI9_5_IRQChannel53UART5_IRQChannel24TIM1_BRK_IRQChannel54TIM6_IRQChannel25TIM1_UP_IRQChannel55TIM7_IRQChannel26TIM1_TRG_COM_IRQChannel56DMA2_Channel1_IRQChannel27TIM1_CC_IRQChannel57DMA2_Channel2_IRQChannel28TIM2_IRQChannel58DMA2_Channel3_IRQChannel29TIM3_IRQChannel59DMA2_Channel4_5_IRQChannel5.3.2中断清除寄存器NVIC_ICER0/1在NVIC_ICER[0]和NVIC_ICER[1]寄存器中的位写入1,则NVIC_ISER[0]和NVIC_ISER[1]的对应的位被清除为0,从而屏蔽中断。NVIC_ICER[0]和NVIC_ICER[1]各位写1有效,写0无效。5.3.3中断挂起寄存器NVIC_ISPR0/1NVIC_ISPR[0]的0~31位对应0~31号中断,NVIC_ISPR[1]的0~31位对应32~63号中断;当设置NVIC_ISPR的位为1时,对应中断被挂起,CPU不执行中断处理任务,当用NVIC_ICPR清除对应位时,CPU恢复执行中断处理任务;写1有效,写0无效。5.3.4中断挂起清除寄存器NVIC_ICPR0/1在NVIC_ICPR[0]和NVIC_ICPR[1]寄存器的位写入1,则NVIC_ISPR[0]和NVIC_ISPR[1]的对应位被清除为0,从而取消中断挂起,恢复中断任务;写1有效,写0无效。5.3.5中断激活标志寄存器NVIC_IABR0/1NVIC_IABR[0]的0~31位对应0~31号中断,NVIC_IABR[1]的0~31位对应32~63号中断;NVIC_IABR[0]和NVIC_IABR[1]标记当前正在执行的中断,当中断执行完毕后,对应位由硬件自动清0;5.3.6中断优先级控制寄存器组NVIC_IPRx(x=0...14)NVIC_IPR[x](x=0...14)是一个32位寄存器,每一个寄存器分4个8位寄存器,每一个8位寄存器标记一个对应编号的可屏蔽中断的优先级,STM32F103系列单片机有60个可屏蔽中断;NVIC_IPR[0]按地址由低到高的顺序,内部4个字节依次对应0~3号可屏蔽中断的优先级,依次类推,NVIC_IPR[14]按地址由低到高的顺序,内部4个字节依次对应56~59号可屏蔽中断的优先级。5.4NVIC库函数NVIC寄存器结构,NVIC_TypeDeff,在文件“stm32f10x_map.h”中定义如下:typedefstruct{vu32Enable[2];u32RESERVED0[30];vu32Disable[2];u32RSERVED1[30];vu32Set[2];u32RESERVED2[30];vu32Clear[2];u32RESERVED3[30];vu32Active[2];u32RESERVED4[62];vu32Priority[11];}NVIC_TypeDef;/*NVICStructure*/typedefstruct{vu32CPUID;vu32IRQControlState;vu32ExceptionTableOffset;vu32AIRC;vu32SysCtrl;vu32ConfigCtrl;vu32SystemPriority[3];vu32SysHandlerCtrl;vu32ConfigFaultStatus;vu32HardFaultStatus;vu32DebugFaultStatus;vu32MemoryManageFaultAddr;vu32BusFaultAddr;}SCB_TypeDef;/*SystemControlBlockStructure*/主要NVIC库函数,如下:1函数NVIC_DeInit功能描述:将外设NVIC寄存器重设为缺省值例:NVIC_DeInit();2函数NVIC_SCBDeInit功能描述:将外设SCB寄存器重设为缺省值例:NVIC_SCBDeInit();3函数NVIC_PriorityGroupConfig功能描述:设置优先级分组:先占优先级和从优先级例:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);NVIC_PriorityGroup该参数设置优先级分组位长度NVIC_PriorityGroup描述NVIC_PriorityGroup_0先占优先级0位,从优先级4位NVIC_PriorityGroup_1先占优先级1位,从优先级3位NVIC_PriorityGroup_2先占优先级2位,从优先级2位NVIC_PriorityGroup_3先占优先级3位,从优先级1位NVIC_PriorityGroup_4先占优先级4位,从优先级0位4函数NVIC_Init功能描述:根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器NVIC_InitStruct:指向结构NVIC_InitTypeDef的指针,包含了外设GPIO的配置信息NVIC_InitTypeDefstructureNVIC_InitTypeDef定义于文件“stm32f10x_nvic.h”:typedefstruct{u8NVIC_IRQChannel;u8NVIC_IRQChannelPreemptionPriority;u8NVIC_IRQChannelSubPriority;FunctionalStateNVIC_IRQChannelCmd;}NVIC_InitTypeDef;NVIC_IRQChannel该参数用以使能或者失能指定的IRQ通道。NVIC_IRQChannel描述1WWDG_IRQChannel窗口看门狗中断23CAN_SCE_IRQChannel2PVD_IRQChannelPVD通过EXTI探测中断24EXTI9_5_IRQChannel3TAMPER_IRQChannel篡改中断25TIM1_BRK_IRQChannel4RTC_IRQChannelRTC全局中断26TIM1_UP_IRQChannel5Flash_IRQChannelFLASH全局中断27TIM1_TRG_COM_IRQChannel6RCC_IRQChannelRCC全局中断28TIM1_CC_IRQChannel7EXTI0_IRQChannel外部中断线0中断29TIM2_IRQChannel8EXTI1_IRQChannel外部中断线1中断30TIM3_IRQChannel9EXTI2_IRQChannel外部中断线2中断31TIM4_IRQChannel10EXTI3_IRQChannel外部中断线3中断32I2C1_EV_IRQChannel11EXTI4_IRQChannel外部中断线4中断33I2C1_ER_IRQChannel12DMA1_Channel1_IRQChannelDMA通道1中断34I2C2_EV_IRQChannel13DMA1_Channel2_IRQChannelDMA通道2中断35I2C2_ER_IRQChannel14DMA1_Channel3_IRQChannelDMA通道3中断36SPI1_IRQChannel15DMA1_Channel4_IRQChannelDMA通道4中断37SPI2_IRQChannel16DMA1_Channel5_IRQChannelDMA通道5中断38USART1_IRQChannel17DMA1_Channel6_IRQChannelDMA通道6中断39USART2_IRQChannel18DMA1_Channel7_IRQChannelDMA通道7中断40USART3_IRQChannel19ADC1_2_IRQChannelADC全局中断41EXTI15_10_IRQChannel20USB_HP_CANTX_IRQChannelUSB高优先级或者CAN发送中断42RTCAlarm_IRQChannel21USB_LP_CAN_RX0_IRQChannelUSB低优先级或者CAN接收0中断43USBWakeUp_IRQChannel22CAN_RX1_IRQChannelCAN接收1中断NVIC_IRQChannelPreemptionPriority该参数设置了成员NVIC_IRQChannel中的先占优先级NVIC_IRQChannelSubPriority该参数设置了成员NVIC_IRQChannel中的从优先级5函数NVIC_StructInit功能描述:把NVIC_InitStruct中的每一个参数按缺省值填入NVIC_InitStruct:指向结构NVIC_InitTypeDef的指针,待初始化,例:NVIC_InitTypeDefNVIC_InitStructure;NVIC_StructInit(&NVIC_InitStructure);NVIC_InitStruct缺省值NVIC_IRQChannel:0x0NVIC_IRQChannelPreemptionPriority:0NVIC_IRQChannelSubPriority:0NVIC_IRQChannelCmd:DISABLE6函数NVIC_SETPRIMASK功能描述:使能PRIMASK优先级:提升执行优先级至01).该函数由汇编语言书写。2).该函数只影响组优先级,不影响从优先级。3).在设置PRIMASK寄存器前,建议在从为了使能一个例外中另一个例外返回时,清除该寄存器例:NVIC_SETPRIMASK();7函数NVIC_RESETPRIMASK功能描述:失能PRIMASK优先级例:NVIC_RESETPRIMASK();8函数NVIC_SETFAULTMASK功能描述:使能FAULTMASK优先级:提升执行优先级至-11).该函数由汇编语言书写。2).该函数只影响组优先级,不影响从优先级。3).FAULTMASK只有在执行优先级值小于-1的情况下才能被设置,设置FAULTMASK将它的执行优先级提升到HardFAULT的级别。每当从除NMI之外的例外中返回,FAULTMASK会被自动清除。9函数NVIC_RESETFAULTMASK功能描述:失能FAULTMASK优先级1).该函数由汇编语言书写。例:NVIC_RESETPRIMASK();10函数NVIC_BASEPRICONFIG功能描述:改变执行优先级从N(最低可设置优先级)提升至11).该函数由汇编语言书写。2).该函数只影响组优先级,不影响从优先级。3).可以改变执行优先级,从N(最低可设置优先级)提升至1。将该寄存器清除至0不会影响当前的优先级,它的非零值起到优先级屏蔽的作用,执行后当BASEPRI定义的优先级高于当前优先级时,该操作将起作用。例:NVIC__BASEPRICONFIG(10);11函数NVIC_GetBASEPRI功能描述:返回BASEPRI屏蔽值,例:u32BASEPRI_Mask=0;BASEPRI_Mask=NVIC_GetBASEPRI();12函数NVIC_GetCurrentPendingIRQChannel功能描述:返回当前待处理IRQ标识符,例:u16CurrentPendingIRQChannel;CurrentPendingIRQChannel=NVIC_GetCurrentPendingIRQChannel();13函数NVIC_GetIRQChannelPendingBitStatus功能描述:检查指定的IRQ通道待处理位设置与否,例:ITStatusIRQChannelPendingBitStatus;IRQChannelPendingBitStatus=NVIC_GetIRQChannelPendingBitStatus(ADC_IRQChannel);14函数NVIC_SetIRQChannelPendingBit功能描述:设置指定的IRQ通道待处理位,例:NVIC_SetI

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论