基于STM32的嵌入式系统原理与应用-第6章中断原理及应用_第1页
基于STM32的嵌入式系统原理与应用-第6章中断原理及应用_第2页
基于STM32的嵌入式系统原理与应用-第6章中断原理及应用_第3页
基于STM32的嵌入式系统原理与应用-第6章中断原理及应用_第4页
基于STM32的嵌入式系统原理与应用-第6章中断原理及应用_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

第六章中断原理及应用基于STM32的嵌入式系统原理与应用主讲老师:xxxONTENTS目录C016.1中断概述026.2NVIC简介036.3EXTI简介046.4外部中断案例016.1中断概述TransitionPageTitle6.1中断概述单击此处输入你的正文,文字是您思想的提炼,为了最终演示发布的良好效果,请尽量言简意赅的阐述观点。122394关键词关键词关键词图6.1中断处理流程图图6.2程序代码存储模型图重点讲解1STM32有2个比较重要的中断:NVIC和EXTI,两个缩写分别是NestedVectorInterruptControl(嵌套中断向量控制器)和ExternalInterrupt(外部中断)。2Cortex内核具有强大的“异常响应”系统,它把能够打断当前代码执行流程的事件分为异常(exception)和中断(interrupt),并把它们用一个表管理起来,详细的STM32中断向量表见表6.1。3中断向量表由启动文件startup_stm32f10x_hd.s建立,在编写中断服务函数时,需要从启动文件中定义的中断向量表查找中断服务函数名。6.1中断概述026.2NVIC简介TransitionPageTitle6.2.1NVIC简介嵌套向量中断控制器(NVIC)是ARM公司提供的Cortex核心内的一个标准单元。所有基于Cortex的微控制器将有相同的中断结构。6.2.2NVIC中断优先级管理STM32F40xx/STM32F41xx的92个中断里面,包括10个内核中断和82个可屏蔽中断,具有16级可编程的中断优先级,而我们常用的就是这82个可屏蔽中断。几十个中断,怎么管理?中断管理方法:

首先,对STM32中断进行分组,组0~4。同时,对每个中断设置一个抢占优先级和一个响应优先级值。分组配置是在寄存器SCB->AIRCR中配置:组AIRCR[10:8]IPbit[7:4]分配情况分配结果01110:40位抢占优先级,4位响应优先级11101:31位抢占优先级,3位响应优先级21012:22位抢占优先级,2位响应优先级31003:13位抢占优先级,1位响应优先级40114:04位抢占优先级,0位响应优先级中断优先级分组假定设置中断优先级组为2,然后设置中断3(RTC中断)的抢占优先级为2,响应优先级为1。

中断6(外部中断0)的抢占优先级为3,响应优先级为0。中断7(外部中断1)的抢占优先级为2,响应优先级为0。那么这3个中断的优先级顺序为:中断7>中断3>中断6。

一般情况下,系统代码执行过程中,只设置一次中断优先级分组,比如分组2,设置好分组之后一般不会再改变分组。随意改变分组会导致中断管理混乱,程序出现意想不到的执行结果。特别说明举例中断优先级分组函数:voidNVIC_PriorityGroupConfig(uint32_tNVIC_PriorityGroup);voidNVIC_PriorityGroupConfig(uint32_tNVIC_PriorityGroup){assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));SCB->AIRCR=AIRCR_VECTKEY_MASK|NVIC_PriorityGroup;}NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);中断参数初始化函数voidNVIC_Init(NVIC_InitTypeDef*NVIC_InitStruct);typedefstruct{uint8_tNVIC_IRQChannel;//设置中断通道uint8_tNVIC_IRQChannelPreemptionPriority;//设置响应优先级uint8_tNVIC_IRQChannelSubPriority;//设置抢占优先级FunctionalStateNVIC_IRQChannelCmd;//使能/使能}NVIC_InitTypeDef;NVIC_InitTypeDefNVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;//串口1中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级为1NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;//子优先级位2NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//IRQ通道使能NVIC_Init(&NVIC_InitStructure); //根据上面指定的参数初始化NVIC寄存器123系统运行后先设置中断优先级分组。调用函数:voidNVIC_PriorityGroupConfig(uint32_tNVIC_PriorityGroup);整个系统执行过程中,只设置一次中断分组。1针对每个中断,设置对应的抢占优先级和响应优先级:voidNVIC_Init(NVIC_InitTypeDef*NVIC_InitStruct);2如果需要挂起/解挂,查看中断当前激活状态,分别调用相关函数即可。3中断优先级设置步骤036.3EXTI简介TransitionPageTitle6.3.1EXTI简介STM32F4的每个IO都可以作为外部中断输入。EXTI线0~15:对应外部IO口的输入中断。EXTI线16:连接到PVD输出。EXTI线17:连接到RTC闹钟事件。EXTI线18:连接到USBOTGFS唤醒事件。EXTI线19:连接到以太网唤醒事件。EXTI线20:连接到USBOTGHS(在FS中配置)唤醒事件。EXTI线21:连接到RTC入侵和时间戳事件。EXTI线22:连接到RTC唤醒事件。每个外部中断线可以独立的配置触发方式(上升沿,下降沿或者双边沿触发),触发/屏蔽,专用的状态位。6.3.2EXTI中断/事件线STM32F4供IO使用的中断线只有16个,但是STM32F4xx系列的IO口多达上百个,STM32F103ZGT6(112),那么中断线怎么跟io口对应呢?GPIOx.0映射到EXTI0GPIOx.1映射到EXTI1…GPIOx.15映射到EXTI156.3.2EXTI中断/事件线对于每个中断线,我们可以设置相应的触发方式(上升沿触发,下降沿触发,边沿触发)以及使能。从表中可以看出,外部中断线5~9分配一个中断向量,共用一个服务函数

外部中断线10~15分配一个中断向量,共用一个中断服务函数。IO口外部中断在中断向量表中只分配了7个中断向量,也就是

16个中断线只能使用7个中断服务函数

中断服务函数列表:EXTI0_IRQHandlerEXTI1_IRQHandlerEXTI2_IRQHandlerEXTI3_IRQHandlerEXTI4_IRQHandlerEXTI9_5_IRQHandlerEXTI15_10_IRQHandler外部中断常用库函数①voidSYSCFG_EXTILineConfig(uint8_tEXTI_PortSourceGPIOx,uint8_tEXTI_PinSourcex);//设置IO口与中断线的映射关系exp:SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource2);//区别M3②voidEXTI_Init(EXTI_InitTypeDef*EXTI_InitStruct);//初始化中断线:触发方式等③ITStatusEXTI_GetITStatus(uint32_tEXTI_Line);//判断中断线中断状态,是否发生④voidEXTI_ClearITPendingBit(uint32_tEXTI_Line);//清除中断线上的中断标志位⑤RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);//使能SYSCFG时钟//这个函数非常重要,在使用外部中断的时候一定要先使能SYSCFG时钟外部中断常用库函数voidEXTI_Init(EXTI_InitTypeDef*EXTI_InitStruct);typedefstruct{uint32_tEXTI_Line;//指定要配置的中断线

EXTIMode_TypeDefEXTI_Mode;//模式:事件OR中断EXTITrigger_TypeDefEXTI_Trigger;//触发方式:上升沿/下降沿/双沿触发FunctionalStateEXTI_LineCmd;//使能OR失能}EXTI_InitTypeDef;EXTI_InitStructure.EXTI_Line=EXTI_Line2; EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_Init(&EXTI_InitStructure); EXTI_Init函数6.3.3配置外部中断的步骤使能SYSCFG时钟:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);②初始化IO口为输入。GPIO_Init();设置IO口与中断线的映射关系。

voidSYSCFG_EXTILineConfig();初始化线上中断,设置触发条件等。

EXTI_Init();配置中断分组(NVIC),并使能中断。

NVIC_Init();⑥编写中断服务函数。

EXTIx_IRQHandler();清除中断标志位EXTI_ClearITPendingBit();046.4外部中断案例TransitionPageTi

温馨提示

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

评论

0/150

提交评论