外部中断和中断控制器_第1页
外部中断和中断控制器_第2页
外部中断和中断控制器_第3页
外部中断和中断控制器_第4页
外部中断和中断控制器_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

第六章:外部中断和中断控制器向量中断控制器,简称 NVIC,是 CortexM3 不可分离的一部分,它与Cortex-M3 内核的逻辑紧密耦合,有一部分甚至水乳交融在一起。NVIC与 Cortex-M3 内核,相辅相成,里应外合,共同完成对中断的响应。NVIC 的寄存器以存储器映射的方式来访问, 除了包含控制寄存器和中断处理的控制逻辑之外, NVIC还包含了MPU的控制寄存器、SysTick定时器以及调试控制。6.1 嵌套向量中断控制器 6.1.1 概述嵌套向量中断控制器(NVIC)和处理器核的接口紧密相连,可以实现低延迟的中断处理和有效处理地处理晚到的中断。嵌套向量中断控制器管理着包括核异常等中断。有下述特点:1. 60个可屏蔽中断通道(不包含16个Cortex-M3的中断线); 2. 16个可编程的优先等级(使用了4位中断优先级); 3. 低延迟的异常和中断处理; 4. 电源管理控制; 5. 系统控制寄存器的实现; 6.1.2 中断和异常向量 表 6-1-1 STM32F10xxx产品的向量表 位置 优先级 优先级 类型 名称 说明 地址 - - - 保留 0x0000_0000 -3固定 Reset 复位 0x0000_0004 -2 固定 NMI 不可屏蔽中断 RCC时钟安全系统(CSS)联接到NMI向量 0x0000_0008 -1 固定 硬件失效 所有类型的失效 0x0000_000C 0 可设置 存储管理 存储器管理 0x0000_0010 1可设置 总线错误 预取指失败,存储器访问失败 0x0000_0014 2可设置 错误应用 未定义的指令或非法状态 0x0000_0018 - - 保留 0x0000_001C0x0000_002B 3 可设置 SVCall 通过SWI指令的系统服务调用 0x0000_002C 4 可设置 调试监控 调试监控器 0x0000_0030 - - 保留 0x0000_0034 5 可设置 PendSV 可挂起的系统服务 0x0000_0038 6可设置 SysTick 系统嘀嗒定时器 0x0000_003C0 7 可设置 WWDG 窗口定时器中断 0x0000_00401 8 可设置 PVD 联到EXTI的电源电压检测(PVD)中断 0x0000_00442 9 可设置 TAMPER 侵入检测中断 0x0000_00483 10 可设置 RTC 实时时钟(RTC)全局中断 0x0000_004C4 11 可设置 FLASH 闪存全局中断 0x0000_00505 12 可设置 RCC 复位和时钟控制(RCC)中断 0x0000_00546 13 可设置 EXTI0 EXTI线0中断 0x0000_00587 14 可设置 EXTI1 EXTI线1中断 0x0000_005C8 15 可设置 EXTI2 EXTI线2中断 0x0000_00609 16 可设置 EXTI3 EXTI线3中断 0x0000_006410 17 可设置 EXTI4 EXTI线4中断 0x0000_006811 18 可设置 DMA1通道1 DMA1通道1全局中断 0x0000_006C12 19 可设置 DMA1通道2 DMA1通道2全局中断 0x0000_007013 20 可设置 DMA1通道3 DMA1通道3全局中断 0x0000_007414 21 可设置 DMA1通道4 DMA1通道4全局中断 0x0000_007815 22 可设置 DMA1通道5 DMA1通道5全局中断 0x0000_007C16 23 可设置 DMA1通道6 DMA1通道6全局中断 0x0000_008017 24 可设置 DMA1通道7 DMA1通道7全局中断 0x0000_008418 25 可设置 ADC ADC全局中断 0x0000_008819 26 可设置 USB_HP_CAN_TX USB高优先级或CAN发送中断 0x0000_008C20 27 可设置 USB_LP_CAN_RX0USB低优先级或CAN接收0中断 0x0000_009021 28 可设置 CAN_RX1 CAN接收1中断 0x0000_009422 29 可设置 CAN_SCE CAN SCE中断 0x0000_009823 30 可设置 EXTI9_5 EXTI线9:5中断 0x0000_009C24 31 可设置 TIM1_BRK TIM1断开中断 0x0000_00A025 32 可设置 TIM1_UP TIM1更新中断 0x0000_00A426 33 可设置 TIM1_TRG_COM TIM1触发和通信中断 0x0000_00A827 34 可设置 TIM1_CC TIM1捕获比较中断 0x0000_00AC28 35 可设置 TIM2 TIM2全局中断 0x0000_00B029 36 可设置 TIM3 TIM3全局中断 0x0000_00B430 37 可设置 TIM4 TIM4全局中断 0x0000_00B831 38 可设置 I2C1_EV I2C1事件中断 0x0000_00BC32 39 可设置 I2C1_ER I2C1错误中断 0x0000_00C033 40 可设置 I2C2_EV I2C2事件中断 0x0000_00C434 41 可设置 I2C2_ER I2C2错误中断 0x0000_00C835 42 可设置 SPI1 SPI1全局中断 0x0000_00CC36 43 可设置 SPI2 SPI2全局中断 0x0000_00D037 44 可设置 USART1 USART1全局中断 0x0000_00D438 45 可设置 USART2 USART2全局中断 0x0000_00D839 46 可设置 USART3 USART3全局中断 0x0000_00DC40 47 可设置 EXTI15_10 EXTI线15:10中断 0x0000_00E041 48 可设置 RTCAlarm 联到EXTI的RTC闹钟中断 0x0000_00E442 49 可设置 USB唤醒 联到EXTI的从USB待机唤醒中断 0x0000_00E84350可设置 TIM8_BRK TIM8断开中断 0x0000_00EC4451可设置 TIM8_UP TIM8更新中断 0x0000_00F04552可设置 TIM8_TRG_COM TIM8触发和通信中断 0x0000_00F44653可设置 TIM8_CC TIM8捕获比较中断 0x0000_00F84754可设置 ADC3 ADC3全局中断 0x0000_00FC4855可设置 FSMC FSMC全局中断 0x0000_01004956可设置 SDIO SDIO全局中断 0x0000_01045057可设置 TIM5 TIM5全局中断 0x0000_01085158可设置 SPI3 SPI3全局中断 0x0000_010C5259可设置 UART4 UART4全局中断 0x0000_01105360可设置 UART5 UART5全局中断 0x0000_01145461可设置 TIM6 TIM6全局中断 0x0000_01185562可设置 TIM7 TIM7全局中断 0x0000_011C5663可设置 DMA2通道1 DMA2通道1全局中断 0x0000_01205764可设置 DMA2通道2 DMA2通道2全局中断 0x0000_01245865可设置 DMA2通道3 DMA2通道3全局中断 0x0000_01285966可设置 DMA2通道4_5 DMA2通道4和DMA2通道5全局中断 0x0000_012C6.1.3 中断优先级介绍STM32(Cortex-M3)中有两个优先级的概念抢占式优先级和响应优先级,有人把响应优先级称作亚优先级或副优先级,每个中断源都需要被指定这两种优先级。 具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。 当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。 既然每个中断源都需要被指定这两种优先级,就需要有相应的寄存器位记录每个中断的优先级;在Cortex-M3中定义了8个比特位用于设置中断源的优先级,这8个比特位可以有8种分配方式,如下:所有8位用于指定响应优先级最高1位用于指定抢占式优先级,最低7位用于指定响应优先级最高2位用于指定抢占式优先级,最低6位用于指定响应优先级最高3位用于指定抢占式优先级,最低5位用于指定响应优先级最高4位用于指定抢占式优先级,最低4位用于指定响应优先级最高5位用于指定抢占式优先级,最低3位用于指定响应优先级最高6位用于指定抢占式优先级,最低2位用于指定响应优先级最高7位用于指定抢占式优先级,最低1位用于指定响应优先级这就是优先级分组的概念。Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位,这4个寄存器位的分组方式如下: 第0组:所有4位用于指定响应优先级 第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级 第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级 第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级 第4组:所有4位用于指定抢占式优先级 可以通过调用STM32的固件库中的函数NVIC_PriorityGroupConfig()选择使用哪种优先级分组方式,这个函数的参数有下列5种: NVIC_PriorityGroup_0 = 选择第0组 NVIC_PriorityGroup_1 = 选择第1组 NVIC_PriorityGroup_2 = 选择第2组 NVIC_PriorityGroup_3 = 选择第3组 NVIC_PriorityGroup_4 = 选择第4组 接下来就是指定中断源的优先级,下面以一个简单的例子说明如何指定中断源的抢占式优先级和响应优先级:/ 选择使用优先级分组第1组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); / 使能EXTI0中断NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; / 指定抢占式优先级别1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; / 指定响应优先级别0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure); / 使能EXTI9_5中断NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; / 指定抢占式优先级别0NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; / 指定响应优先级别1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);要注意的几点是:1)如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想 不到的结果;2)抢占式优先级别相同的中断源之间没有嵌套关系;3)如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。6.2 外部中断/事件控制器(EXTI) 外部中断/事件控制器由19个产生事件/中断要求的边沿检测器组成。每个输入线可以独立地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以被独立的屏蔽。挂起寄存器保持着状态线的中断要求。 6.2.1 特征EXTI控制器的主要特性如下: 1. 每个中断/事件都有独立的触发和屏蔽 2. 每个中断线都有专用的状态位 3. 支持多达19个中断/事件请求 检测脉冲宽度低于APB2时种宽度的外部信号。参见数据手册中电气特性部分的相关参数。 6.2.2 唤醒事件管理 STM32F10xxx可以处理外部或内部事件来唤醒内核(WFE)。唤醒事件可以通过下述配置产生: 1. 在外设的控制寄存器使能一个中断,但不在NVIC中使能,同时在Cortex-M3的系统控制寄存器中使能SEVONPEND位。当MCU从WFE恢复后,需要清除相应外设的中断挂起位和外设NVIC中断通道挂起位(在NVIC中断清除挂起寄存器中)。 2. 配置一个外部或内部EXTI线为事件模式,当MCU从WFE恢复后,因为对应事件线的挂起位没有被置位,不必清除相应外设的中断挂起位或NVIC中断通道挂起位。 使用外部I/O端口作为唤醒事件,请参见6.2.3节的功能说明 6.2.3 功能说明 如果要产生中断,必须事先配置好并使能中断线。根据所需的边沿检测条件,设置2个触发寄存器,同时在中断屏蔽寄存器的相应位写1 允许中断请求。当外部中断线上发生了需要的边沿时,将产生一个中断请求,对应的挂起位也随之被置1。在挂起寄存器的对应位写1,可以清除该中断请求。 如果要为产生事件,必须事先配置好并使能事件线。根据所需的边沿检测条件,通过设置2个触发寄存器,同时在事件屏蔽寄存器的相应位写1允许事件请求。当事件线上发生了需要的边沿时,将产生一个事件请求脉冲,对应的挂起位不被置1。 通过在软件中断/事件寄存器写1,也可以通过软件产生中断/事件请求。 6.2.3.1硬件中断选择通过下面的过程来配置19个线路做为中断源: 1. 配置19个中断线的屏蔽位(EXTI_IMR) 2. 配置所选中断线的触发选择位(EXTI_RTSR和EXTI_FTSR); 3. 配置那些控制映像到外部中断控制器(EXTI)的NVIC中断通道的使能和屏蔽位,使得19个中断线中的请求可以被正确地响应。 6.2.3.2硬件事件选择通过下面的过程,可以配置19个线路为事件源 1. 配置19个事件线的屏蔽位(EXTI_EMR) 。2. 配置事件线的触发选择位(EXTI_RTSR和EXTI_FTSR) 。6.2.3.3 软件中断/事件的选择19个线路可以被配置成软件中断/事件线。下面是产生软件中断的过程: 1. 配置19个中断/事件线屏蔽位(EXTI_IMR, EXTI_EMR) 。2. 设置软件中断寄存器的请求位(EXTI_SWIER 。6.2.4 外部中断/事件线路映像112通用I/O端口以图6-2-1的方式连接到16个外部中断/事件线上: 图 6-2-1 外部中断I/O映像另外三种其他的外部中断/事件控制器的连接如下: 1. EXTI线16连接到PVD输出 2. EXTI线17连接到RTC闹钟事件 3. EXTI线18连接到USB唤醒事件 6.3 NVIC库函数介绍NVIC 驱动有多种用途:例如使能或者失能 IRQ中断,使能或者失能单独的 IRQ通道,改变 IRQ通道的优先级等等。 6.3.1 函数NVIC_DeInit 表 6-3-1. 描述了函数NVIC_DeInit 表 6-3-1. NVIC_DeInit 函数名NVIC_DeInit函数原形void NVIC_DeInit(void) 功能描述将外设NVIC寄存器重设为缺省值输入参数1无输出参数无返回值无先决条件无被调用函数无例: 复位NVIC寄存器的值NVIC_DeInit(); 6.3.2 函数NVIC_PriorityGroupConfig 表 6-3-2 描述了函数NVIC_PriorityGroupConfig表 6-3-2 NVIC_PriorityGroupConfig函数名NVIC_PriorityGroupConfig 函数原形void NVIC_PriorityGroupConfig(u32 NVIC_PriorityGroup) 功能描述设置优先级分组:先占优先级和从优先级输入参数NVIC_PriorityGroup:优先级分组位长度 输出参数无返回值无先决条件优先级分组只能设置一次被调用函数无 NVIC_PriorityGroup 该参数设置优先级分组位长度(见表6-3-3.) 表6-3-3 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位例: 定义先占优先级1位,从优先级3位NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); 6.3.3 函数NVIC_Init 表 6-3-4 描述了函数NVIC_Init 表 6-3-4 NVIC_Init 函数名NVIC_Init函数原形void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)功能描述根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器输入参数NVIC_InitStruct:指向结构NVIC_InitTypeDef的指针,包含了外设GPIO的配置信息输出参数无返回值RCC_FLAG的新状态(SET或者RESET先决条件无被调用函数无 NVIC_InitTypeDef structure 结构体typedef struct u8 NVIC_IRQChannel; u8 NVIC_IRQChannelPreemptionPriority; u8 NVIC_IRQChannelSubPriority; FunctionalState NVIC_IRQChannelCmd; NVIC_InitTypeDef; NVIC_IRQChannel :该参数用以使能或者失能指定的IRQ通道。表6-3-5给出了该参数可取的值 表 6-3-5 NVIC_IRQChannel值 NVIC_IRQChannel 描述 WWDG_IRQChannel 窗口看门狗中断PVD_IRQChannel PVD通过EXTI探测中断TAMPER_IRQChannel 篡改中断RTC_IRQChannel RTC全局中断 FlashItf_IRQChannel FLASH全局中断 RCC_IRQChannel RCC全局中断 EXTI0_IRQChannel 外部中断线0中断EXTI1_IRQChannel 外部中断线1中断 EXTI2_IRQChannel 外部中断线2中断EXTI3_IRQChannel 外部中断线3中断EXTI4_IRQChannel 外部中断线4中断 DMAChannel1_IRQChannel DMA通道1中断 DMAChannel2_IRQChannelDMA通道2中断DMAChannel3_IRQChannel DMA通道3中断DMAChannel4_IRQChannelDMA通道4中断DMAChannel5_IRQChannelDMA通道5中断DMAChannel6_IRQChannelDMA通道6中断DMAChannel7_IRQChannelDMA通道7中断ADC_IRQChannel ADC全局中断USB_HP_CANTX_IRQChannel USB高优先级或者CAN发送中断USB_LP_CAN_RX0_IRQChannelUSB低优先级或者CAN接收0中断CAN_RX1_IRQChannelCAN接收1中断CAN_SCE_IRQChannel CAN SCE中断EXTI9_5_IRQChannel外部中断线9-5中断TIM1_BRK_IRQChannel TIM1暂停中断 TIM1_UP_IRQChannelTIM1刷新中断TIM1_TRG_COM_IRQChannelTIM1触发和通讯中断TIM1_CC_IRQChannel TIM1捕获比较中断TIM2_IRQChannel TIM2全局中断TIM3_IRQChannel TIM3全局中断 TIM4_IRQChannelTIM4全局中断 I2C1_EV_IRQChannel I2C1事件中断 I2C1_ER_IRQChannel I2C1错误中断 I2C2_EV_IRQChannel I2C2事件中断 I2C2_ER_IRQChannel I2C2错误中断 SPI1_IRQChannel SPI1全局中断SPI2_IRQChannel SPI2全局中断 USART1_IRQChannel USART1全局中断 USART2_IRQChannelUSART2全局中断 USART3_IRQChannel USART3全局中断 EXTI15_10_IRQChannel外部中断线15-10中断 RTCAlarm_IRQChannel RTC闹钟通过EXTI线中断USBWakeUp_IRQChannel USB通过EXTI线从悬挂唤醒中断TIM8_BRK_IRQChannelTIM8暂停中断 TIM8_UP_IRQChannel TIM8刷新中断TIM8_TRG_COM_IRQChannel TIM8触发和通讯中断TIM8_CC_IRQChannel TIM8捕获比较中断ADC3_IRQChannel ADC3全局中断FSMC_IRQChannel FSMC全局中断SDIO_IRQChannel SDIO 全局中断TIM5_IRQChannel TIM5 全局中断SPI3_IRQChannel SPI3 全局中断UART4_IRQChannelUART4全局中断UART5_IRQChannel UART5全局中断TIM6_IRQChannel TIM6 全局中断TIM7_IRQChannel TIM7 全局中断DMA2_Channel1_IRQChannel DMA2 Channel 1 全局中断DMA2_Channel2_IRQChannel DMA2 Channel 2 全局中断DMA2_Channel3_IRQChannel DMA2 Channel 3 全局中断NVIC_IRQChannelPreemptionPriority :该参数设置了成员NVIC_IRQChannel中的先占优先级,表6-3-6 列举了该参数的取值。 NVIC_IRQChannelSubPriority :该参数设置了成员NVIC_IRQChannel中的从优先级,表6-3-6列举了该参数的取值。 表6-3-6给出函数NVIC_PriorityGroupConfig设置的先占优先级和从优先级可取的值。表6-3-6先级和从优先级值(1)(2) NVIC_PriorityGroupNVIC_IRQChannel的先占优先级NVIC_IRQChannel的从优先级 描 述NVIC_PriorityGroup_0 00-15先占优先级0位从优先级4位 NVIC_PriorityGroup_10-10-7先占优先级1位从优先级3位 NVIC_PriorityGroup_20-30-3先占优先级2位 从优先级2位NVIC_PriorityGroup_30-70-1先占优先级3位 从优先级1位 NVIC_PriorityGroup_4 0-150先占优先级4位 从优先级0位 1. 选中NVIC_PriorityGroup_0,则参数NVIC_IRQChannelPreemptionPriority对中断通道的设置不产生影响。 2. 选中NVIC_PriorityGroup_4,则参数NVIC_IRQChannelSubPriority对中断通道的设置不产生影响。 NVIC_IRQChannelCmd :该参数指定了在成员NVIC_IRQChannel中定义的IRQ通道被使能还是失能。这个参数取值为ENABLE或者DISABLE。 例: NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); /先占优先级用1位,从优先级用3位。/定义TIM3中断的优先级,先占优先级为0,从优先级为2NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStructure(&NVIC_InitStructure); /定义USART1串口中断的优先级,先占优先级为1,从优先级为5NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 5; NVIC_InitStructure(&NVIC_InitStructure); /定义RTC中断先占优先级为1,从优先级为7 NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 7; NVIC_InitStructure(&NVIC_InitStructure); 6.3.4 函数NVIC_SetVectorTable 表 6-3-7描述了函数NVIC_SetVectorTable表 6-3-7 NVIC_SetVectorTable函数名NVIC_SetVectorTable函数原形void NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset) 功能描述设置向量表的位置和偏移 输入参数1NVIC_VectTab:指定向量表位置在RAM还是在程序存储器 输入参数2Offset:向量表基地址的偏移量对FLASH,该参数值必须高于0x08000100;对RAM必须高于0x100。它同时必须是256(644)的整数倍 输出参数无返回值指定中断活动位的新状态(SET或者RESET)先决条件优先级分组只能设置一次被调用函数无 NVIC_VectTab :该参数设置向量表基地址(见 表6-3-8) 表 6-3-8 NVIC_ VectTab值 NVIC_ VectTab描述NVIC_VectTab_FLASH 向量表位于FLASH NVIC_VectTab_RAM向量表位于RAM 例:指定向量表基地址偏移量对FLASH NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); 6.4 外部中断控制器库函数6.4.1 函数EXTI_DeInit 表 6-4-1 描述了函数EXTI_DeInit 表 6-4-1 EXTI_DeInit 函数名EXTI_DeInit函数原形void EXTI_DeInit(void)功能描述将外设EXTI寄存器重设为缺省值输入参数CAN_FLAG:待检查的CAN标志位输出参数无返回值无先决条件无被调用函数无例:重设外部中断寄存器 EXTI_DeInit(); 6.4.2 函数EXTI_Init 表6-4-2 描述了函数EXTI_Init表6-4-2 函数EXTI_Init 函数名EXTI_Init函数原形void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct)功能描述根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器输入参数EXTI_InitStruct:指向结构EXTI_InitTypeDef的指针,包含了外设EXTI的配置信息输出参数无返回值无先决条件无被调用函数无EXTI_InitTypeDef structure结构体如下 typedef struct u32 EXTI_Line; EXTIMode_TypeDef EXTI_Mode; EXTIrigger_TypeDef EXTI_Trigger; FunctionalState EXTI_LineCmd; EXTI_InitTypeDef; EXTI_Line:选择了待使能或者失能的外部线路。表 6-4-3给出了该参数可取的值 表 6-4-3 EXTI_Line值 EXTI_Line 描述EXTI_Line0外部中断线0EXTI_Line1外部中断线1EXTI_Line2外部中断线2EXTI_Line3外部中断线3EXTI_Line4外部中断线4EXTI_Line5外部中断线5EXTI_Line6外部中断线6EXTI_Line7外部中断线7EXTI_Line8外部中断线8EXTI_Line9外部中断线9EXTI_Line10外部中断线10EXTI_Line11外部中断线11EXTI_Line12外部中断线12EXTI_Line13外部中断线13EXTI_Line14外部中断线14EXTI_Line15外部中断线15EXTI_Line16外部中断线16EXTI_Line17外部中断线17EXTI_Line18外部中断线18EXTI_Mode:设置了被使能线路的模式。表6-4-4 给出了该参数可取的值 表6-4-4. EXTI_Mode值 EXTI_Mode描述EXTI_Mode_Event设置EXTI线路为事件请求EXTI_Mode_Interrupt设置EXTI线路为中断请求EXTI_Trigger :设置了被使能线路的触发边沿。表6-4-5. 给出了该参数可取的值 表 6-4-5 EXTI_Trigger值 EXTI_Trigger描述EXTI_Trigger_Falling设置输入线路下降沿为中断请求EXTI_Trigger_Rising设置输入线路上升沿为中断请求EXTI_Trigger_Rising_Falling设置输入线路上升沿和下降沿为中断请求EXTI_LineCmd :用来定义选中线路的新状态。它可以被设为ENABLE或者DISABLE。 例: 使能外部中断12和14 EXTI_InitTypeDef EXTI_InitStructure; EXTI_InitStructure.EXTI_Line = EXTI_Line12 | EXTI_Line14; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); 6.4.3 函数EXTI_GenerateSWInterrupt 表 6-4-6. 描述了函数EXTI_GenerateSWInterrupt 函数名EXTI_GenerateSWInterrupt函数原形void EXTI_GenerateSWInterrupt(u32 EXTI_Line)功能描述产生一个软件中断输入参数EXTI_Line:待使能或者失能的EXTI线路输出参数无返回值无先决条件无被调用函数无例:产生一个软件中断 EXTI_GenerateSWInterrupt(EXTI_Line6); 6.4.4 函数EXTI_GetFlagStatus 表 6-4-7. 描述了函数EXTI_GetFlagStatus 函数名EXTI_GetFlagStatus函数原形FlagStatus EXTI_GetFlagStatus(u32 EXTI_Line)功能描述检查指定的EXTI线路标志位设置与否输入参数EXTI_Line:待检查的EXTI线路标志位输出参数无返回值EXTI_Line的新状态(SET或者RESET)先决条件无被调用函数无例: 检查外部中断线8状态位 FlagStatus EXTIStatus; EXTIStatus = EXTI_GetFlagStatus(EXTI_Line8); 6.4.5 函数EXTI_ClearFlag 表6-4-8描述了函数EXTI_ClearFlag 函数名EXTI_ClearFlag函数原形void EXTI_ClearFlag(u32 EXTI_Line)功能描述清除EXTI线路挂起标志位输入参数EXTI_Line:待清除标志位的EXTI线路输出参数无返回值无先决条件无被调用函数无例: 清除外部中断2挂起标志EXTI_ClearFlag(EXTI_Line2); 6.4.6 函数EXTI_GetITStatus 表 6-4-9. 描述了函数EXTI_GetITStatus 函数名EXTI_GetITStatus函数原形ITStatus EXTI_GetITStatus(u32 EXTI_Line)功能描述检查指定的EXTI线路触发请求发生与否输入参数EXTI_Line:待检查EXTI线路的挂起位输出参数无返回值EXTI_Line的新状态(SET或者RESET)先决条件无被调用函数无例:检查外部中断8是否有中断触发 ITStatus EXTIStatus; EXTIStatus = EXTI_GetITStatus(EXTI_Line8); 6.5 外部中断实验6.5.1 实验目的 实验目的是如何使用外部中断。具体内容包括使用库函数来定义外部中断口,如何设置中断的优先级顺序,如何验证中断函数进入和执行。 6.5.2 实验要求STM32F10x系列芯片的每一个I/O口,都可以设为外部中断口,最多有16个外部中断。设定PE0和PE1为外部中断口,外部中断0下降沿触发中断,外部中断1上升沿触发中断。在中断函数中跳变LED灯,以标记进入中断函数,同时向串口发送一数据。进入外部中断0,跳变LED1灯,向串口发送0X61;进入外部中断1,LED2跳变,向串口发送0X62数据。6.5.3 硬件基础图6-5-1是外部中断引脚的硬件电路图,K1按键, PE0引脚为外部中断0,K2按键,PE1引脚为外部中断1。由图中可以看出,常态下PE0引脚电平为高,按键K1按下时为低;常态下PE1引脚为高,按键K2按下后为低。也就是对于外部中断0,按下K1按键时有一个下降沿,松开按键时,有一个上升沿。对于外部中断1 ,同样,按下K2按键时有一个下降沿,松开按键时有一个上升沿。 图 6-5-1 按键原理图6.5.4 软件结构前面介绍了外部中断控制器和嵌套向量中断控制器的库函数,通过使用这些库函数,可以初始化外部中断和定义这些外部中断的优先级。当然只有前面简单的介绍这些枯燥的库函数的定义和作用,您可能还是不会完整的初始化外部中断。回忆一下使用外设GPIO的情况,总结出,要使用一个外设,需要有几个方面要注意到。要使用外部中断外设,需要在处理这几个方面,现列出来如下:1. 在工程中要加入外部中断库文件stm32f10x_exti.c(加入FWLIB文件组);直接在项目工程中,从librarysrc文件夹中添加stm32f10x_exti.c文件到项目工程的FWLIB文件组即可完成;2. 在项目工程中,打开头文件stm32f10x_conf.h,找到“/ #define _EXTI”所在的行,在这个头文件中删去注释符即可变成“ #define _EXTI”即可;3. 根据系统对该功能的需求,初始化该功能外设;初始化I/O口为外部中断口。初始化外部中断口,相对比较简单。首先定义PE0和PE1作外部中断用,可用如下代码设置:GPIO_EXTILineConfig(GPIO_PortSource_GPIOE, GPIO_PinSource0);GPIO_EXTILineConfig(GPIO_PortSource_GPIOE, GPIO_PinSource1);随后定义使用外部中断号,中断触发沿,和使能中断,可以如下设置:EXTI_InitTypeDef EXTI_InitStructure; EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.

温馨提示

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

评论

0/150

提交评论