




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
五、中断编程ARM Coetex-M3内核共支持256个中断,其中16个内部中断,240个外部中断和可编程的256级中断优先级的设置。对于STM32F10xxx产品(小容量、中容量和大容量)产品,支持76个中断(16个内部+60个外部),互联型产品支持的中断共84个(16个内部+68个外部)。有16级可编程的中断优先级的设置,仅使用中断优先级设置8bit中的高4位。4bit的中断优先级可以分成2组,从高位看,前面定义的是抢占式优先级,后面是响应优先级。按照这种分组,4bit一共可以分成5组第0组:所有4bit用于指定响应优先级;第1组:最高1位用于指定抢占式优先级,后面3位用于指定响应优先级;第2组:最高2位用于指定抢占式优先级,后面2位用于指定响应优先级;第3组:最高3位用于指定抢占式优先级,后面1位用于指定响应优先级;第4组:所有4位用于指定抢占式优先级。所谓抢占式优先级和响应优先级,他们之间的关系是:具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套。当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。每一个中断源都必须定义2个优先级。在sys.c文件中定义了几个关于中断的函数:void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group);/设置中断其中,NVIC_Channel参数定义在stm32f10x_nvic.h文件中。中断函数入口名(Handle)定义在startup_stm32f10x_md.s文件中。在Cortex-M3 权威指南中,“7.2优先级的定义”中说明了抢占优先级和子优先级概念:NVIC中有一个寄存器是“应用程序中断及复位控制寄存器”(AIRCR,地址0xE000_ED00),它里面有一个位段名为“优先级组”。该位段的值对每一个优先级配置为2个位段:MSB所在的位段(左边的)对应抢占优先级,而LSB所在的位段(右边的)对应子优先级。AIRCR如下图。NVIC的访问地址是0xE000_E000. NVIC下的寄存器包括:l 使能和除能寄存器SETENAs: 0xE000_E100 0xE000_E11C ; CLRENAs: 0xE000E180 - 0xE000_E19Cl 悬起与解悬寄存器SETPENDs: 0xE000_E200 0xE000_E21C ; CLRPENDs: 0xE000E280 - 0xE000_E29Cl 活动状态寄存器 0xE000_E300_0xE000_E31Cl 优先级寄存器0xE000_E400 0xE000_E4EF在stm32f10x_map.h中,有定义如下nvic相关内容:typedef struct vu32 ISER2; u32 RESERVED030; vu32 ICER2; u32 RSERVED130; vu32 ISPR2; u32 RESERVED230; vu32 ICPR2; u32 RESERVED330; vu32 IABR2; u32 RESERVED462; vu32 IPR15; NVIC_TypeDef; /与NVIC的访问地址对应/* System Control Space memory map */#define SCS_BASE (u32)0xE000E000)#define SysTick_BASE (SCS_BASE + 0x0010)#define NVIC_BASE (SCS_BASE + 0x0100)#define SCB_BASE (SCS_BASE + 0x0D00)#ifdef _NVIC / 定义在stm32f10x_conf.h文件中,在stm32f10x_map.h包含 #define NVIC (NVIC_TypeDef *) NVIC_BASE) #define SCB (SCB_TypeDef *) SCB_BASE) #endif /*_NVIC */typedef struct vuc32 CPUID; vu32 ICSR; /中断控制及状态寄存器 vu32 VTOR; /向量表偏移量寄存器 vu32 AIRCR; /应用程序中断及复位控制寄存器 vu32 SCR; vu32 CCR; vu32 SHPR3; vu32 SHCSR; vu32 CFSR; vu32 HFSR; vu32 DFSR; vu32 MMFAR; vu32 BFAR; vu32 AFSR; SCB_TypeDef;ISER2:ISER是Interrupt Set-Enable Registers,这是一个中断使能寄存器组。STM32的可屏蔽中断只有60个,这里用了2个32位的寄存器,总共可以表示64个中断。而STM32只用了其中的前60位。ISER0的bit0bit31 分别对应中断031。ISER1的bit027对应中断3259;这样总共60个中断就分别对应上了。要使能某个中断,必须设置相应的ISER位为1,使该中断被使能(这里仅仅是使能,还要配合中断分组、屏蔽、IO口映射等设置才算是一个完整的中断设置)。 ICER2:ICER是Interrupt Clear-Enable Registers,是一个中断除能寄存器组。该寄存器组与ISER的作用恰好相反,是用来清除某个中断的使能的。其对应位的功能,也和ISER一样。这里要专门设置一个ICER来清除中断位,而不是向ISER写0来清除,是因为NVIC的这些寄存器都是写1有效的,写0是无效的。ISPR2:ISPR是Interrupt Set-Pending Registers,是一个中断挂起控制寄存器组。每个位对应的中断和ISER 是一样的。通过置1,可以将正在进行的中断挂起,而执行同级或更高级别的中断。写0是无效的。ICPR2:ICPR是Interrupt Clear-Pending Registers,是一个中断解挂控制寄存器组。其作用与ISPR相反,对应位也和ISER是一样的。通过设置1,可以将挂起的中断接挂。写0无效。 IABR2:IABR是Active Bit Registers,是一个中断激活标志位寄存器组。对应位所代表的中断和ISER一样,如果为1,则表示该位所对应的中断正在被执行。这是一个只读寄存器,通过它可以知道当前在执行的中断是哪一个。在中断执行完了由硬件自动清零。 IPR15:IPR是Interrupt Priority Registers,是一个中断优先级控制的寄存器组。这个寄存器组相当重要!STM32的中断分组与这个寄存器组密切相关。IPR寄存器组由15个32bit的寄存器组成,每个可屏蔽中断占用8bit,这样总共可以表示15*4=60个可屏蔽中断。刚好和STM32的可屏蔽中断数相等。IPR0的3124,2316,158,70分别对应中断30,依次类推,总共对应60个外部中断。而每个可屏蔽中断占用的8bit并没有全部使用,而是只用了高4位。这4位,又分为抢占优先级和子优先级。抢占优先级在前,子优先级在后。而这两个优先级各占几个位又要根据SCB-AIRCR中中断分组的设置来决定。STM32的中断分组,设置是由SCB-AIRCR寄存器的bit108 来定义的。组AIRCR10:8Bit7:4分配结果01110:40位抢占优先级,4位相应优先级11101:31位抢占优先级,3位相应优先级21012:22位抢占优先级,2位相应优先级31003:13位抢占优先级,1位相应优先级40114:04位抢占优先级,0位相应优先级在sys.c文件中定义了几个关于中断的函数,重要的有3个:void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group);/设置中断,NVIC_Channel参数定义在stm32f10x_nvic.h文件中。void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group); /设置NVIC分组void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM); /外部中断配置函数(只对GPIOAG)/GPIOx:06,代表GPIOAG; /BITx:需要使能的位; /TRIM:触发模式,1-下降沿;2-上升沿;3-任意电平触发/中断函数入口名定义在startup_stm32f10x_md.s文件中。STM32 的EXTI控制器支持19个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。STM32的19个外部中断为:线 015:对应外部IO口的输入中断。 线 16:连接到PVD 输出。 线 17:连接到RTC 闹钟事件。 线 18:连接到USB 唤醒事件。STM32中,每一个GPIO都可以触发一个外部中断,但是,GPIO的中断是以组为一个单位的,同组间的外部中断同一时间只能使用一个。比如说,PA0,PB0,PC0,PD0,PE0,PF0,PG0这些为1组,如果我们使用PA0作为外部中断源,那么别的就不能够再使用了,在此情况下,我们只能使用类似于PB1,PC2这种末端序号不同的外部中断源。每一组使用一个中断标志EXTIx。EXTI0 EXTI4这5个外部中断有着自己的单独的中断响应函数,EXTI5-9共用一个中断响应函数,EXTI10-15共用一个中断响应函数。对于外部中断 EXTI控制,MDK定义了如下结构体: typedef struct vu32 IMR; /中断屏蔽寄存器vu32 EMR; /事件屏蔽寄存器vu32 RTSR; /上升沿触发选择寄存器vu32 FTSR; /下降沿触发选择寄存器 vu32 SWIER; /软件中断事件寄存器vu32 PR; /挂起寄存器 EXTI_TypeDef;外部IO口的中断,还需要一个寄存器配置,就是IO复用里的外部中断配置寄存器EXTICR。这是因为STM32任何一个IO口都可以配置成中断输入口,但是IO口的数目远大于中断线数(16个)。于是STM32 就这样设计,GPIOAGPIOG 的15:0分别对应中断线150。这样每个中断线对应了最多7个IO 口,以线0为例:它对应了GPIOA.0、PIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。而中断线每次只能连接到1个IO口上,这样就需要EXTICR来决定对应的中断线配置到哪个GPIO上了。 EXTICR 在AFIO 的结构体中定义如下:typedef struct vu32 EVCR; vu32 MAPR; vu32 EXTICR4; AFIO_TypeDef;EXTICR0即AFIO_EXTICR1的配置如下位31:16保留。位15:0位15:0 EXTIx3:0:EXTIx配置(x = 0 3) (EXTI x configuration) 这些位可由软件读写,用于选择EXTIx外部中断的输入源。 0000:PAx引脚 0100:PEx引脚 0001:PBx引脚 0101:PFx引脚 0010:PCx引脚 0110:PGx引脚 0011:PDx引脚IO中断寄存器编程IO口时钟使能将IO口用于IO外部中断时,首先需打开该IO口的时钟例,RCC-APB2ENR|=1CRH &= 0xff0fffff;GPIOA-CRH |= 0x00800000;/上拉-下拉输入模式GPIOA-ODR |= 1APB2ENR|=0x01;/使能io复用时钟配置IO中断分组(NVIC)调用void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)设置抢占式优先级、子优先级、中断编号、中断分组例,MY_NVIC_Init(1,6,EXTI15_10_IRQChannel,1); 注:在该函数中使能了NVIC_Channel中断编写中断服务函数中断服务函数句柄定义在startup_stm32f10x_md.s文件中中断库函数编程初始化IO的状态RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);/使能PORTA时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; /PA13GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; /上拉输入GPIO_Init(GPIOA, &GPIO_InitStructure); /初始化GPIOA13开启IO口复用时钟,设置IO口与中断线的映射关系RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);/使能复用功能时钟GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource13);初始化线上中断,设置触发条件EXTI_InitStructure.EXTI_Line=EXTI_Line13;/KEY2EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);配置中断分组(NVIC),并使能中断NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /设置NVIC中断分组2NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;/在stm32f10x.h文件定义NVIC_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年志愿者服务试题及答案
- 2025年飞机维修人员考试题库及答案
- 水力学考试真题及答案
- 2025年轻微型无人机考试题库及答案详解(历年真题)
- 高铁招标中标合同模板(3篇)
- zhejiang教师招聘考试试题及答案
- 合伙人共同经营平台信息保密及竞业禁止合同
- 国际贸易担保欠款合同范本示例
- 2025广西公务员面试题及答案
- 智能家居泥工班组分包施工与环保节能合同-@-1
- 暴聋(突发性耳聋)中医临床路径及入院标准2020版
- 部编高教版2023·职业模块 中职语文 2.《宁夏闽宁镇:昔日干沙滩今日金沙滩》 课件
- 风电安全培训
- 2024-2030年全球及中国电子笔行业竞争现状及投资盈利预测报告
- Unit 1 Lesson1 Hello!教学设计 2024-2025学年冀教版英语七年级上册
- 2024年省食品生产监管能力大比武理论备赛试题库(含答案)
- 接收预备党员表决票(样式)
- 品牌合作协议书合同范本
- 50000t天污水厂课程设计
- DL∕T 5767-2018 电网技术改造工程工程量清单计价规范
- 人音版 (五线谱)一年级上册音乐-1 《玩具兵进行曲》教案
评论
0/150
提交评论