版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章
中断系统与基本应用作者:黄克亚2025年5月本章概要CONTENTS掌握中断的基本概念项目实例——利用外部中断调节时间掌握STM32F103中断系统中断相关库函数NVIC和EXTI外部中断/事件控制器EXTI8.1.中断的基本概念现实生活中和计算机系统中均有中断的概念,且二者原理上是相通的。8.1中断的基本概念8.1中断的基本概念8.1.1中断的定义生活举例:假设你正在看书,这时接到快递员电话叫你下楼取快递只等5分钟,这就是中断请求。然后你回答:“好的,我现在就来”这就是中断响应。接着你停止看书下楼去取快递,这就是中断处理。取完快递,你再回来接着看书,这就叫做中断返回。中断定义:CPU暂时中止其正在执行的程序,转去执行请求中断的那个外设或事件的服务程序,等处理完毕后再返回执行原来中止的程序,叫做中断。8.1中断的基本概念8.1.2为什么要设置中断提高CPU工作效率:例如高速CPU和低速打印机之间协同工作。具有实时处理功能:例如导弹拦截系统,发现目标立即启动。具有故障处理功能:例如电源突然掉电、硬件自检出错、运算溢出等。实现分时操作:例如定时产生中断,在中断服务程序中控制外设工作。010203048.1中断的基本概念8.1.3中断源与中断屏蔽中断源:能引发中断的事件。通常,中断源都与外设有关。在生活中,门铃的铃声是一个中断源,它由门铃这个外设发出。在嵌入式系统中,常见的中断源有按键按下和释放、定时器溢出、串口收到数据等,与此相关的外设有键盘、定时器和串口等。中断请求标志位:每个中断源都有它对应的中断标志位。一旦该中断发生,它的中断标志位就会被置位。如果中断标志位被清除,那么它所对应的中断便不会再被响应。因此,一般在中断服务程序最后要将对应的中断标志位清零。01中断源8.1中断的基本概念可以通过设置相应的中断屏蔽位,禁止CPU响应某个中断,从而实现中断屏蔽。可屏蔽中断在生活中,门铃的铃声是一个可屏蔽中断。不可屏蔽中断在计算机系统中,电源故障、内存出错、总线出错等是不可屏蔽中断。02中断屏蔽8.1.3中断源与中断屏蔽8.1中断的基本概念8.1.4中断处理过程中断处理过程大致分为:中断请求、中断响应、中断服务和中断返回。主程序中断请求中断响应中断返回执行主程序执行中断服务程序执行主程序断点8.1中断的基本概念8.1.4中断处理过程kK+1中断响应中断返回中断响应(硬件自动实现)保护现场找到该中断对应的中断服务程序的地址——中断向量表执行中断服务程序(用户编程)
中断服务程序通常是由用户使用C语言编写的特殊函数,用来实现对该中断真正的处理操作,具有以下特点:中断服务程序既没有参数,也没有返回值,更不由用户调用,而是当某个事件产生一个中断时由硬件自动调用。在中断服务程序中修改、在其他程序中访问的变量,在其定义和声明时要在前面加上volatile修饰词。中断服务程序要求应当尽量的简短。中断返回(硬件自动实现)恢复现场中断服务主程序中断请求主程序8.1中断的基本概念8.1.5中断优先级与中断嵌套中断优先级01嵌入式系统中的中断往往不止一个,那么,对于多个同时发生的中断或者嵌套发生的中断,CPU又该如何处理?应该先响应哪一个中断?答案就是中断优先级看书
(主程序)电话铃响(中断请求1)门铃响(中断请求2)开门迎客
(门铃中断的中断服务程序)接听电话
(电话铃中断的中断服务程序)8.1中断的基本概念8.1.5中断优先级与中断嵌套中断嵌套02在嵌入式系统中,中断嵌套是指当系统正在执行一个中断服务时,又有新的中断事件发生而产生了新的中断请求。看书
(主程序)电话铃响(中断请求1)接听电话
(电话铃中断的中断服务程序)开门迎客
(门铃中断的中断服务程序)门铃响(中断请求2)8.2.STM32F103中断系统上一节介绍的中断系统是一个通用概念,适用所有数字系统,如通用计算机系统、嵌入式系统、数字信号处理器和可编程控制器。本节将对其进行具体化,讲解STM32F103的中断系统。8.2.STM32F103中断系统8.2.STM32F103中断系统8.2.1嵌套向量中断控制器NVICNVIC集成在ARMCortex-M3内核中,与中央处理器核心CM3Core紧密耦合,从而实现低延迟的中断处理和高效地处理晚到的较高优先级的中断。支持84个异常,包括16个内部异常和68个非内核异常中断;使用4位优先级设置,具有16级可编程异常优先级中断响应时处理器状态的自动保存,无须额外指令;中断返回时处理器状态的自动恢复,无须额外指令;支持嵌套和向量中断;支持中断尾链技术。8.2.STM32F103中断系统8.2.STM32F103中断系统8.2.2STM32F103中断优先级抢占优先级(PreemptingPriority)高抢占式优先级的中断事件会打断当前的主程序/中断程序运行,俗称中断嵌套。何为响应优先级(subpriority)在抢占式优先级相同的情况下,高响应优先级的中断优先被响应。判断中断是否会被响应的依据首先是抢占式优先级,其次是响应优先级;抢占式优先级决定是否会有中断嵌套。优先级冲突的处理具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断的嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。010203048.2.STM32F103中断系统8.2.STM32F103中断系统8.2.2STM32F103中断优先级STM32中对中断优先级的定义STM32中指定中断优先级的寄存器位有4位,优先级分组方式所对应的抢占式优先级和响应优先级寄存器位数和所表示的优先级级数如图05(无论是抢占优先级还是响应优先级,均是数值越小,其优先级别越高)8.2.STM32F103中断系统8.2.STM32F103中断系统8.2.3STM32F103中断向量表中断向量表是中断系统中非常重要的概念。它是一块存储区域,通常位于存储器的零地址处,在这块区域上按中断号从小到大依次存放着所有中断处理程序的入口地址。位置优先级优先级类型名称说明地址
---保留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_001C
---保留0x0000_0020
---保留0x0000_0024
---保留0x0000_0028
3可设置SVCall通过SWI指令的系统服务调用0x0000_002C
4可设置调试监控(DebugMonitor)调试监控器0x0000_0030
---保留0x0000_0034
5可设置PendSV可挂起的系统服务0x0000_0038
6可设置SysTick系统嘀嗒定时器0x0000_003C07可设置WWDG窗口定时器中断0x0000_004018可设置PVD连到EXTI的电源电压检测(PVD)中断0x0000_004429可设置TAMPER侵入检测中断0x0000_0048310可设置RTC实时时钟(RTC)全局中断0x0000_004C411可设置FLASH闪存全局中断0x0000_0050512可设置RCC复位和时钟控制(RCC)中断0x0000_00548.2.STM32F103中断系统8.2.STM32F103中断系统8.2.4STM32F103中断服务函数STM32F103所有的中断服务函数,在启动代码文件startup_stm32f10x_hd.s中都有预先定义。用户开发自己的STM32F103应用时可在文件stm32f10x_it.c中使用C语言编写函数重新定义之。STM32定义的中断服务函数,在启动文件和stm32f10x_it.c中通常以PPP_IRQHanlder命名。8.3STM32F103外部
中断/事件控制器EXTISTM32F103中断依然是一个宽泛的概念,其中较为简单的是外部中断,本章将首先对其进行介绍,也可以看成对STM32F103中断的细化或实例化。8.3STM32F103外部中断/事件控制器EXTI8.3.1EXTI内部结构01外部中断、事件输入:STM32F103外部中断/事件控制器EXT1内部信号线上画有一条斜线,旁边标有19,表示这样的线路共有19套。EXTI的外部中断/事件输入线也有19根,分别是EXTI0、EXTI1、EXTI2、…、EXTI18。如果将STM32F103的I/O引脚映射为EXTI的外部中断/事件输入线,必须将该引脚设置为输入模式。8.3STM32F103外部中断/事件控制器EXTI8.3.1EXTI内部结构03APB外设接口:02边沿检测器:APB外设模块接口是STM32F103微控制器每个功能模块都有的部分,CPU通过这样的接口访问各个功能模块。尤其需要注意的是,如果使用STM32F103引脚的外部中断/事件映射功能,必须打开APB2总线上该引脚对应端口的时钟以及AFIO功能时钟。EXTI中的边沿检测器共有19个,用来连接19个外部中断/事件输入线,是EXTI的主体部分。每个边沿检测器由边沿检测电路、控制寄存器、门电路和脉冲发生器等部分组成。8.3STM32F103外部中断/事件控制器EXTI8.3.2EXTI工作原理外部中断/事件请求的产生和传输:01外部信号从编号1的STM32F103微控制器引脚进入。经过边沿检测电路,这个边沿检测电路受到上升沿触发选择寄存器和下降沿触发选择寄存器控制。经过编号3的或门,这个或门的另一个输入是中断/事件寄存器。外部请求信号进入编号4的与门,这个与门的另一个输入是事件屏蔽寄存器。外部请求信号经过挂起请求寄存器后,最后进入编号6的与门。事件寄存器对应位为1时中断屏蔽器对应位为1时8.3STM32F103外部中断/事件控制器EXTI8.3.2EXTI工作原理事件与中断:02一路信号(中断)会被送至NVIC向CPU产生中断请求,至于CPU如何响应,由用户编写或系统默认的对应的中断服务程序决定。另一路信号(事件)会向其它功能模块(如定时器、USART、DMA等)发送脉冲触发信号,至于其它功能模块会如何响应这个脉冲触发信号,则由对应的模块自己决定。8.3STM32F103外部中断/事件控制器EXTI8.3.3EXTI主要特性STM32F103微控制器的外部中断/事件控制器EXTI,具有以下主要特性:每个外部中断∕事件输入线都可以独立地配置它的触发事件(上升沿、下降沿或双边沿),并能够单独地被屏蔽。每个外部中断都有专用的标志位(请求挂起寄存器),保持着它的中断请求。可以将多达112个通用I/O引脚映射到16个外部中断∕事件输入线上。可以检测脉冲宽度低于APB2时钟宽度的外部信号。8.4STM32中断相关库函数由于中断的处理是一个内外协同的过程,所以其库函数也分为两部分,分别为NVIC库函数和EXTI库函数,分别位于misc.c和stm32f10x_exti.c文件中。8.4STM32中断相关库函数8.4.1STM32F10x的NVIC相关库函数01函数NVIC_DeInit:例:/*ResetstheNVICregisterstotheirdefaultresetvalue*/NVIC_DeInit();函数名NVIC_DeInit函数原形voidNVIC_DeInit(void)功能描述将外设NVIC寄存器重设为缺省值输入参数无输出参数无返回值无先决条件无被调用函数无8.4STM32中断相关库函数8.4.1STM32F10x的NVIC相关库函数02函数NVIC_Init:NVIC_InitTypeDefstructureNVIC_InitTypeDef定义于文件“stm32f10x_nvic.h”:
typedefstruct{u8NVIC_IRQChannel;u8NVIC_IRQChannelPreemptionPriority;u8NVIC_IRQChannelSubPriority;FunctionalStateNVIC_IRQChannelCmd;}NVIC_InitTypeDef;函数名NVIC_Init函数原形voidNVIC_Init(NVIC_InitTypeDef*NVIC_InitStruct)功能描述根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器输入参数NVIC_InitStruct:指向结构NVIC_InitTypeDef的指针,包含了外设GPIO的配置信息输出参数无返回值无先决条件无被调用函数无8.4STM32中断相关库函数NVIC_IRQChannel:该参数用以使能或者失能指定的IRQ通道,下表给出了该参数可取的值02函数NVIC_Init:NVIC_IRQn描述NVIC_IRQn描述WWDG_IRQn窗口看门狗中断CAN_SCE_IRQnCANSCE中断PVD_IRQnPVD通过EXTI探测中断EXTI9_5_IRQn外部中断线9-5中断TAMPER_IRQn篡改中断TIM1_BRK_IRQnTIM1暂停中断RTC_IRQnRTC全局中断TIM1_UP_IRQnTIM1刷新中断FlashItf_IRQnFLASH全局中断TIM1_TRG_COM_IRQnTIM1触发和通讯中断RCC_IRQnRCC全局中断TIM1_CC_IRQnTIM1捕获比较中断EXTI0_IRQn外部中断线0中断TIM2_IRQnTIM2全局中断EXTI1_IRQn外部中断线1中断TIM3_IRQnTIM3全局中断EXTI2_IRQn外部中断线2中断TIM4_IRQnTIM4全局中断EXTI3_IRQn外部中断线3中断I2C1_EV_IRQnI2C1事件中断EXTI4_IRQn外部中断线4中断I2C1_ER_IRQnI2C1错误中断DMAChannel1_IRQnDMA通道1中断I2C2_EV_IRQnI2C2事件中断DMAChannel2_IRQnDMA通道2中断I2C2_ER_IRQnI2C2错误中断DMAChannel3_IRQnDMA通道3中断SPI1_IRQnSPI1全局中断DMAChannel4_IRQnDMA通道4中断SPI2_IRQnSPI2全局中断DMAChannel5_IRQnDMA通道5中断USART1_IRQnUSART1全局中断DMAChannel6_IRQnDMA通道6中断USART2_IRQnUSART2全局中断DMAChannel7_IRQnDMA通道7中断USART3_IRQnUSART3全局中断ADC_IRQnADC全局中断EXTI15_10_IRQn外部中断线15-10中断USB_HP_CANTX_IRQnUSB高优先级或者CAN发送中断RTCAlarm_IRQnRTC闹钟通过EXTI线中断USB_LP_CAN_RX0_IRQnUSB低优先级或者CAN接收0中断USBWakeUp_IRQnUSB通过EXTI线从悬挂唤醒中断CAN_RX1_IRQnCAN接收1中断8.4STM32中断相关库函数抢占优先级和响应优先级值NVIC_IRQChannelPreemptionPriority:该参数设置了成员NVIC_IRQChannel中的抢占优先级,下表列举了该参数的取值。NVIC_IRQChannelSubPriority:该参数设置了成员NVIC_IRQChannel中的响应优先级,下表列举了该参数的取值。02函数NVIC_Init:NVIC_PriorityGroupNVIC_IRQChannel的抢占优先级NVIC_IRQChannel的响应优先级描述NVIC_PriorityGroup_000-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_40-150抢占优先级4位响应优先级0位8.4STM32中断相关库函数02函数NVIC_Init:NVIC_IRQChannelCmd该参数指定了在成员NVIC_IRQChannel中定义的IRQ通道被使能还是失能。这个参数取值为
ENABLE或者
DISABLE。例如:NVIC_InitTypeDefNVIC_InitStructure;/*ConfigurethePriorityGroupingwith1bit*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);/*EnableTIM3globalinterruptwithPreemptionPriority0andSubPriorityas2*/NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);8.4STM32中断相关库函数8.4.1STM32F10x的NVIC相关库函数03函数NVIC_PriorityGroupConfig:NVIC_PriorityGroup值函数名NVIC_PriorityGroupConfig函数原形voidNVIC_PriorityGroupConfig(u32NVIC_PriorityGroup)功能描述设置优先级分组:先占优先级和从优先级输入参数NVIC_PriorityGroup:优先级分组位长度参阅Section: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位例:/*ConfigurethePriorityGroupingwith1bit*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);8.4STM32中断相关库函数8.4.2STM32F10x的EXTI相关库函数01函数EXTI_DeInit:例:/*ResetstheEXTIregisterstotheirdefaultresetvalue*/EXTI_DeInit();函数名EXTI_DeInit函数原形EXTI_DeInit(void)功能描述将外设EXTI寄存器重设为缺省值输入参数无输出参数无返回值无先决条件无被调用函数无8.4STM32中断相关库函数8.4.2STM32F10x的EXTI相关库函数02函数EXTI_Init:EXTI_InitTypeDefstructureEXTI_InitTypeDef定义于文件“stm32f10x_exti.h”:typedefstruct{u32EXTI_Line;EXTIMode_TypeDefEXTI_Mode;EXTITrigger_TypeDefEXTI_Trigger;FunctionalStateEXTI_LineCmd;}EXTI_InitTypeDef;函数名EXTI_Init函数原形voidEXTI_Init(EXTI_InitTypeDef*EXTI_InitStruct)功能描述根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器输入参数EXTI_InitStruct:指向结构EXTI_InitTypeDef的指针,包含了外设EXTI的配置信息,参阅Section:EXTI_InitTypeDef查阅更多该参数允许取值范围输出参数无返回值无先决条件无被调用函数无8.4STM32中断相关库函数EXTI_Line:选择了待使能或者失能的外部线路。EXTI_Line描述EXTI_Line描述EXTI_Line0外部中断线0EXTI_Line10外部中断线10EXTI_Line1外部中断线1EXTI_Line11外部中断线11EXTI_Line2外部中断线2EXTI_Line12外部中断线12EXTI_Line3外部中断线3EXTI_Line13外部中断线13EXTI_Line4外部中断线4EXTI_Line14外部中断线14EXTI_Line5外部中断线5EXTI_Line15外部中断线15EXTI_Line6外部中断线6EXTI_Line16外部中断线16EXTI_Line7外部中断线7EXTI_Line17外部中断线17EXTI_Line8外部中断线8EXTI_Line18外部中断线18EXTI_Line9外部中断线9
8.4STM32中断相关库函数EXTI_Mode:设置了被使能线路的模式。EXTI_Trigger:设置了被使能线路的触发边沿。EXTI_LineCmd:用来定义选中线路的新状态。它可以被设为ENABLE或者DISABLE。例:/*Enablesexternallines12and14interruptgenerationonfallingedge*/EXTI_InitTypeDefEXTI_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);EXTI_Mode描述EXTI_Mode_Event设置EXTI线路为事件请求EXTI_Mode_Interrupt设置EXTI线路为中断请求EXTI_Trigger描述EXTI_Trigger_Falling设置输入线路下降沿为中断请求EXTI_Trigger_Rising设置输入线路上升沿为中断请求EXTI_Trigger_Rising_Falling设置输入线路上升沿和下降沿为中断请求8.4STM32中断相关库函数03函数EXTI_GetITStatus:例:
/*GetthestatusofEXTIline8*/ITStatusEXTIStatus;EXTIStatus=EXTI_GetITStatus(EXTI_Line8);函数名EXTI_GetITStatus函数原形ITStatusEXTI_GetITStatus(u32EXTI_Line)功能描述检查指定的EXTI线路触发请求发生与否输入参数EXTI_Line:待检查EXTI线路的挂起位参阅Section:EXTI_Line查阅更多该参数允许取值范围输出参数无返回值EXTI_Line的新状态(SET或者RESET)先决条件无被调用函数无8.4STM32中断相关库函数04函数EXTI_GetFlagStatus:例:/*GetthestatusofEXTIline8*/FlagStatusEXTIStatus;EXTIStatus=EXTI_GetFlagStatus(EXTI_Line8);函数名EXTI_GetFlagStatus函数原形FlagStatusEXTI_GetFlagStatus(u32EXTI_Line)功能描述检查指定的EXTI线路标志位设置与否输入参数EXTI_Line:待检查的EXTI线路标志位输出参数无返回值EXTI_Line的新状态(SET或者RESET)先决条件无被调用函数无8.4STM32中断相关库函数05函数EXTI_ClearFlag:例:/*CleartheEXTIline2pendingflag*/EXTI_ClearFlag(EXTI_Line2);函数名EXTI_ClearFlag函数原形voidEXTI_ClearFlag(u32EXTI_Line)功能描述清除EXTI线路挂起标志位输入参数EXTI_Line:待清除标志位的EXTI线路输出参数无返回值无先决条件无被调用函数无8.4STM32中断相关库函数06函数EXTI_ClearITPendingBit:例:/*ClearstheEXTIline2interruptpendingbit*/EXTI_ClearITpendingBit(EXTI_Line2);函数名EXTI_ClearITPendingBit函数原形voidEXTI_ClearITPendingBit(u32EXTI_Line)功能描述清除EXTI线路挂起位输入参数EXTI_Line:待清除EXTI线路的挂起位输出参数无返回值无先决条件无被调用函数无8.4STM32中断相关库函数8.4.3EXTI中断线GPIO引脚映射库函数例:/*SelectsPB.08asEXTILine8*/GPIO_EXTILineConfig(GPIO_PortSource_GPIOB,GPIO_PinSource8);函数GPIO_EXTILineConfig:函数名GPIO_EXTILineConfig函数原形voidGPIO_EXTILineConfig(u8GPIO_PortSource,u8GPIO_PinSource)功能描述选择GPIO管脚用作外部中断线路输入参数1GPIO_PortSource:选择用作外部中断线源的GPIO端口
参阅Section:GPIO_PortSource查阅更多该参数允许取值范围输入参数2GPIO_PinSource:待设置的外部中断线路
该参数可以取GPIO_PinSourcex(x可以是0-15)输出参数无返回值无先决条件无被调用函数无8.5EXTI项目实例前面我们讲解了中断的概念,下面我们接着讲解中断的应用,中断应用是以外部中断为例进行讲解的。8.5EXTI项目实例8.5.1项目分析—利用外部中断调节数字电子钟初始时间。建立中断向量表分配栈空间并初始化GPIO初始化EXTI中断线管脚映射EXTI中断初始化NVIC初始化,中断使能编写对应的中断服务程序启动代码文件startup_stm32f10x_yy.s用户应用主程序文件main.c中断服务程序文件stm32f10x_it.c外部中断建立过程KEY1按键定义为小时调节,KEY2按键定义为分钟调节,KEY3按键定义为秒调节,均只能向上调节,调到最大时重新置零。按键的一段接地,所以GPIO初始化时应将其配置为输入上拉模式。因为各个按键未按下时表现高电平,按下时表现为低电平,所以中断初始化时应将触发方式设置为下降沿触发。8.5EXTI项目实例第一步:复制第7章创建工程模板文件夹到桌面,并将文件夹改名为“6EXTI”,将原工程模板编译一下,直到没有错误和警告为止。项目实施5DsgShow6EXTI第二步:为工程模板的“ST_Driver”项目组添加两个外部中断需要用的源文件,分别为“stm32f10x_exti.c”文件和“misc.c”,这两个均位于“..\Libraries\STM32F10x_StdPeriph_Driver\src”目录下。8.5EXTI项目实例项目实施第三步:点击“File/New”新建两个文件,将其改名为EXTI.C和EXTI.H并保存到工程模板下的APP文件夹中。并将EXTI.C文件添加到APP项目组下。第四步:在EXTI.H文件中输入如下源程序,其中条件编译格式不变,只要更改一下预定义变量名称即可,需要将我们刚定义函数的声明加到头文件当中。参考代码如下:#ifndef_EXTI_H#define_EXTI_H#include"stm32f10x.h"voidEXTIInti(void);#endif8.5EXTI项目实例第五步:在EXTI.C文件中输入如下源程序,在程序中首先包含EXTI.H头文件,然后创建EXTIInti()中断初始化程序,其中包括打开GPIOE及AFIO时钟,GPIO管脚初始化,给外部管脚映射中断线,外部中断初始化,优先级分组,NVIC初始化等程序。项目实施voidEXTIInti(){
GPIO_InitTypeDefGPIO_InitStructure;
EXTI_InitTypeDefEXTI_InitStructure;
NVIC_InitTypeDefNVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO,ENABLE); /*GPIO管脚初始化上拉输入模式*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOE,&GPIO_InitStructure); //选择GPIO引脚用作外部中断线路此处一定要记住给端口引脚加上中断外部线路
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource0);//PE0:hour+
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource1);//PE1:minute+
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);//PE2:second+
/*设置外部中断的模式PE0
PE1
PE2中断初始化*/
EXTI_InitStructure.EXTI_Line=EXTI_Line0|EXTI_Line1|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);参考程序代码8.5EXTI项目实例项目实施 //NVIC优先级分组抢占式优先2位四级响应式优先级2位四级
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /*设置NVIC参数*/
NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn; //指定中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1; //配置抢占式优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; //配置响应式优先级
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //中断使能
NVIC_Init(&NVIC_InitStructure);
/*设置NVIC参数*/
NVIC_InitStructure.NVIC_IRQChannel=EXTI1_IRQn; //指定中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; //配置抢占式优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; //配置响应式优先级
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //中断使能
NVIC_Init(&NVIC_InitStructure);
/*设置NVIC参数*/
NVIC_InitStructure.NVIC_IRQChannel=EXTI2_IRQn; //指定中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; //配置抢占式优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1; //配置响应式优先级
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //中断使能
NVIC_Init(&NVIC_InitStructure);
参考程序代码8.5EXTI项目实例项目实施第六步:在main.h文件的中间部分添加“#include"EXTI.H"”语句,即包含EXTI.H头文件,任何时候程序中需要使用某一源文件中函数,必须先包含其头文件,否则编译是不能通过的。第七步:在main.c文件中输入如下源程序,在main函数中,首先对时间变量赋初值,然后分别对数码管管脚和外部中断进行初始化,最后应用无限循环结构显示时间,并等待中断发生。第六步参考代码如下:#ifndef_MAIN_H#define_MAIN_H#include"stm32f10x.h"#include"LED.h"#include"beepkey.h"#include"dsgshow.h"#include"EXTI.H"#endif第七步参考代码如下:#include"main.h"u8hour,minute,second;intmain(){ h
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- (2026)度全国中小学生安全知识竞赛试题库及答案
- 2026年心肺复苏理论考试试题及答案
- 2026中国量子计算技术商业化进程与市场规模预测分析报告
- 2026中国涡流泵运维管理智能化解决方案报告
- 2026中国食品行业市场趋势分析及投资价值评估研究报告
- 2026基因编辑技术在育种领域的商业化应用与监管趋势报告
- 2026汽车零部件供应链管理优化与现代企业运营模式
- 2026汽车制造行业市场需求供给状况及未来发展策略研究报告
- 2026中国智能穿戴设备行业竞争格局分析及行业投资机会发展策略报告
- 煤矿安全生产专项整治考核试卷
- 工艺纪律检查方案
- 江苏盐城东台市2026年专职网格员招聘考试试卷-含答案解析
- 2026年消化系统内镜报告规范解读手册
- 2026年CCAA国家注册审核员考试(有机产品认证基础)复习题及答案
- 汽车维修管理制度大全
- 2026年初级注册安全工程师《安全生产专业实务(其他安全)》真题试卷(附答案解析)
- 药剂师招聘笔试题试题集详解
- 胆南星临床应用现状
- 原材料采购价格监督制度
- 方言词汇调查条目表
- 疼痛管理与康复医学
评论
0/150
提交评论