嵌入式系统设计与工程实践 课件 第4章 外部中断与应用实例_第1页
嵌入式系统设计与工程实践 课件 第4章 外部中断与应用实例_第2页
嵌入式系统设计与工程实践 课件 第4章 外部中断与应用实例_第3页
嵌入式系统设计与工程实践 课件 第4章 外部中断与应用实例_第4页
嵌入式系统设计与工程实践 课件 第4章 外部中断与应用实例_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

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

文档简介

第4章外部中断与应用实例《嵌入式系统设计与工程实践》配套课件《嵌入式系统设计》教研组本章概述本章主要讲述了STM32F103的外部中断系统,包括中断控制器NVIC的嵌套结构和中断优先级设置,以及中断向量表和中断服务函数的定义。详细介绍了STM32F103的外部中断/事件控制器EXTI的内部结构、工作原理和主要特性。此外,还涵盖了外部中断的HAL驱动函数及设计流程,并通过应用实例展示了外部中断的实际应用。重点讲述的内容如下:(1)STM32F103中断系统的基本结构与优先级设置。(2)STM32F103的EXTI内部结构及工作原理。(3)外部中断的HAL驱动函数及其设置。(4)STM32F103外部中断设计流程。(5)外部中断应用实例的硬件与软件设计。本章目录4.1STM32F103中断系统4.2STM32F103外部中断/事件控制器EXTI4.5STM32F103的外部中断应用实例4.4STM32F103外部中断设计流程4.3外部中断的HAL驱动函数本章目录4.1STM32F103中断系统4.2STM32F103外部中断/事件控制器EXTI4.5STM32F103的外部中断应用实例4.4STM32F103外部中断设计流程4.3外部中断的HAL驱动函数4.1STM32F103中断系统中断是计算机在执行程序时,CPU暂时停止当前任务以处理更紧急事件的机制。它提高了工作效率,支持实时处理、故障处理和分时操作。中断源引发中断,程序可通过中断屏蔽控制响应。中断处理包括请求、响应、服务和返回,优先级和嵌套机制确保紧急事件及时处理。(1)中断的定义中断是CPU在执行任务中被更紧急事件打断,转去处理外设请求,完成后返回原任务。类似看书被门铃打断,提升系统并行与效率。(2)中断的应用用于提升CPU效率、实时响应、故障抢救与分时协作。外设运行时CPU可做他事;实时系统迅速响应变化;故障中断便于保存状态;协调多外设。(3)中断源与屏蔽中断源如按键、定时器溢出等,对应标志位置位表征事件。屏蔽功能可临时禁止某些中断,保障关键流程。中断分为可屏蔽与不可屏蔽两类。4.1STM32F103中断系统(4)中断处理过程流程含请求、响应、服务与返回四步。处理中需保存断点与上下文,以便恢复。现代MCU多由硬件自动入栈与出栈,简化保护与恢复。这个处理过程称为中断处理过程,如图4-1所示,其大致可以分为四步:中断请求、中断响应、中断服务和中断返回。图4-1中断处理过程示意图4.1STM32F103中断系统(5)优先级与嵌套优先级决定多源先后,高优先级先响应。嵌套指处理中断时遇更高优先级再入中断,完成后返回原中断,确保紧急事件及时处理。4.1STM32F103中断系统嵌套向量中断控制器,简称NVIC,是ARMCortex-M3不可分离的一部分。NVIC与Cortex-M3紧耦合协同响应中断。M3支持256中断与256级优先级;STM32含84中断与16级优先级。68通道固定映射,每通道1字节优先级(高4位有效),每4通道组成1个32位寄存器,共≥17个。4.1.1嵌套向量中断控制器NVIC4.1STM32F103中断系统中断优先级决定了一个中断是否能被屏蔽,以及在未屏蔽的情况下何时可以响应。优先级的数值越小,则优先级越高。STM32(Cortex-M3)中有两个优先级的概念:抢占式优先级和响应优先级,也把响应优先级称作“亚优先级”或“副优先级”,每个中断源都需要被指定这两种优先级。1.何为抢占式优先级(preemptionpriority)高抢占式优先级的中断事件会打断当前的主程序/中断程序运行,俗称中断嵌套。2.何为响应优先级(subpriority)在抢占式优先级相同的情况下,高响应优先级的中断优先被响应。在抢占式优先级相同的情况下,如果有低响应优先级中断正在执行,高响应优先级的中断要等待已被响应的低响应优先级中断执行结束后才能得到响应(不能嵌套)。4.1.2STM32F103中断优先级4.1STM32F103中断系统3.判断中断是否会被响应的依据首先是抢占式优先级,其次是响应优先级。抢占式优先级决定是否会有中断嵌套。4.优先级冲突的处理高抢占优先级中断可打断低抢占级中断服务,实现中断嵌套;即高抢占级可嵌套低抢占级。同抢占级无嵌套:后到需等待先到完成;若同时到达,先比响应优先级,相同则按向量表顺序处理。4.1STM32F103中断系统5.STM32中对中断优先级的定义STM32中指定中断优先级的寄存器位有4位,这4个寄存器位的分组方式如下:(1)第0组:所有4位用于指定响应优先级。(2)第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级。(3)第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级。(4)第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级。(5)第4组:所有4位用于指定抢占式优先级。优先级分组方式所对应的抢占式优先级和响应优先级寄存器位数和所表示的优先级数如图4-2所示。8.2具身智能和具身人工智能图4-2STM32F103优先级位数和级数分配图4.1STM32F103中断系统中断向量表是中断系统中非常重要的概念。它是一块存储区域,通常位于存储器的地址处,在这块区域上按中断号从小到大依次存放着所有中断处理程序的入口地址。当某中断产生且经判断其未被屏蔽,CPU会根据识别到的中断号到中断向量表中找到该中断的所在表项,取出该中断对应的中断服务程序的入口地址,然后跳转到该地址执行STM32F103产品的中断向量表,如书中表4-1所示。STM32F1系列微控制器不同产品支持可屏蔽中断的数量略有不同。互联型的STM32F105系列和STM32F107系列共支持68个可屏蔽中断通道。其他非互联型的产品(包括STM32F103系列)支持60个可屏蔽中断通道。4.1.3STM32F103中断向量表4.1STM32F103中断系统中断服务程序类似函数但无参无返,仅在中断触发时被隐式调用;需与启动文件中断名一致以正确覆盖默认处理。(1)ISR命名形式为PPP_IRQHandler,PPP对应外设名,启动文件中已预定义默认空实现。(2)用户在stm32f10x_it.c中用同名C函数重定义,即可在链接时覆盖默认中断处理程序。(3)务必确保函数名与startup_stm32f10x_xx.s一致,如EXTI1_IRQHandler,否则无法正确绑定。(4)ISR内只做必要处理,快速退出;将耗时逻辑转移至主循环或RTOS任务,避免阻塞中断。4.1.4STM32F103中断服务函数4.1STM32F103中断系统(5)在ISR中避免使用阻塞API与复杂库函数;若需通信,采用标志位、环形缓冲或轻量消息。(6)如需使用C++,将ISR声明为extern"C"以禁用名称修饰,确保与向量表符号匹配。(7)调试建议:开启对应外设与NVIC,清中断标志位;若ISR不进,优先核对函数名与启动文件。本章目录4.1STM32F103中断系统4.2STM32F103外部中断/事件控制器EXTI4.5STM32F103的外部中断应用实例4.4STM32F103外部中断设计流程4.3外部中断的HAL驱动函数4.2STM32F103外部中断/事件控制器EXTISTM32F103微控制器的外部中断/事件控制器(EXTI)由19个产生事件/中断请求边沿检测器组成,每个输入线可以独立地配置输入类型(脉冲或挂起)和对应的触发事件升沿或下降沿或者双边沿都触发)。每个输入线都可以独立地被屏蔽。挂起寄存器保持状态线的中断请求。4.2STM32F103外部中断/事件控制器EXTI在STM32F103微控制器中,外部中断/事件控制器EXTI,由19根外部输入线、19个生中断/事件请求的边沿检测器和APB外设接口等部分组成,如图4-3所示。4.2.1STM32F103的EXTI内部结构4.2STM32F103外部中断/事件控制器EXTI图4-3STM32F103外部中断/事件控制器内部结构图4.2STM32F103外部中断/事件控制器EXTI1.外部中断与事件输入从图4-3可以看出,STM32F103外部中断/事件控制器EXTI内部信号线上画有一斜线,旁边标有19,表示这样的线路共有19套。(1)线路总数与命名:EXTI共有19根外部中断/事件输入线,命名为EXTI0、EXTI1~EXTI18。(2)特殊通道:EXTI16连接PVD输出,EXTI17连接RTC闹钟,EXTI18连接USB唤醒信号。(3)通用通道映射:EXTI0~EXTI15可分别映射到STM32F103任一端口的对应引脚Px0~Px15。(4)支持的端口:端口字母x可为A/B/C/D/E/F/G,实现跨端口的同号引脚复用至相同EXTI线。4.2STM32F103外部中断/事件控制器EXTI(5)典型用法:通过AFIO_EXTICR选择具体Pxn映射到EXTIn,并在EXTI与NVIC中配置触发与使能。STM32F103微控制器最多有112个引脚,可以以下方式连接到16根外部中断/事件输入线上,如图4-4所示。(1)按号映射规则:任一端口的0号脚(PA0/PB0~PG0)映射到EXTI0;1号脚到EXTI1;…;15号脚到EXTI15。(2)互斥限制:同一时刻,同一EXTIn只能选择一个端口的同号引脚参与映射(例如EXTI0只能选PA0或PB0等之一)。(3)配置位置:映射选择在AFIO->EXTICR[0..3]中设置,每个寄存器控制4条EXTI线的端口选择。4.2STM32F103外部中断/事件控制器EXTI(4)实践建议:优先选用噪声小、带上拉/下拉方便的引脚;规划避免多个外设争抢同一EXTIn资源。另外,如果将STM32F103的I/O引脚映射为EXTI的外部中断/事件输入线,必须将该引脚设置为输入模式。4.2STM32F103外部中断/事件控制器EXTI图4-4STM32F103外部中断/事件输入线映像4.2STM32F103外部中断/事件控制器EXTI2.APB外设接口图4-3上部的APB外设模块接口是STM32F103微控制器每个功能模块都有的部分,CPU通过这样的接口访问各个功能模块。尤其需要注意的是,如果使用STM32F103引脚的外部中断/事件映射功能,必须打开APB2总线上该引脚对应端口的时钟以及AFIO功能时钟。3.边沿检测器EXTI中的边沿检测器共有19个,用来连接19个外部中断/事件输入线,是EXTI的主体部分。每个边沿检测器由边沿检测电路、控制寄存器、门电路和脉冲发生器等部分组成。4.2STM32F103外部中断/事件控制器EXTI1.外部中断/事件请求的产生和传输从图4-3可以看出,外部中断/事件请求的产生和传输过程如下:(1)外部信号由编号1的芯片引脚进入STM32F103,作为EXTI输入源,按配置参与中断或事件流程。(2)边沿检测由上升沿与下降沿触发寄存器控制,可选上升、下降或双边沿触发中断/事件。(3)信号经编号3或门,与软件中断/事件寄存器并联;软件置位可直接产生有效请求,路径一致。(4)事件路径:信号入编号4与门,由事件屏蔽寄存器控制;为1放行至脉冲发生器,输出单脉冲。(5)中断路径:信号置位挂起寄存器,再入编号6与门;中断屏蔽寄存器为1时送NVIC产生中断,否则屏蔽。4.2.2STM32F103的EXTI工作原理4.2STM32F103外部中断/事件控制器EXTI2.事件与中断由上面讲述的外部中断/事件请求信号的产生和传输过程可知,从外部激励信号看,中断和事件的请求信号没有区别,只是在STM32F103微控制器内部将它们分开。(1)一路信号(中断)会被送至NVIC向CPU产生中断请求,至于CPU如何响应,由用户编写或系统默认的对应的中断服务程序决定。(2)另一路信号(事件)会向其他功能模块(如定时器、USART、DMA等)发送脉冲触发信号,至于其他功能模块会如何响应这个脉冲触发信号,则由对应的模块自己决定。4.2STM32F103外部中断/事件控制器EXTISTM32F103微控制器的外部中断/事件控制器EXTI,具有以下主要特性:(1)每个外部中断/事件输入线都可以独立地配置它的触发事件(上升沿、下降沿或双边沿),并能够单独地被屏蔽。(2)每个外部中断都有专用的标志位(请求挂起寄存器),保持着它的中断请求。(3)可以将多达112个通用I/O引脚映射到16个外部中断/事件输入线上。(4)可以检测脉冲宽度低于APB2时钟宽度的外部信号。4.2.3EXTI主要特性本章目录4.1STM32F103中断系统4.2STM32F103外部中断/事件控制器EXTI4.5STM32F103的外部中断应用实例4.4STM32F103外部中断设计流程4.3外部中断的HAL驱动函数4.3外部中断的HAL驱动函数STM32中断系统是通过一个嵌套向量中断控制器(NVIC)进行中断控制的,使用中断要先对NVIC进行配置。STM32的HAL库中提供了NVIC相关操作函数。STM32F1中断管理相关驱动程序的头文件是stm32f1xx_hal_cortex.h,其常用函数如表4-2所示。4.3.1中断设置相关HAL驱动函数4.3外部中断的HAL驱动函数4-2中断管理常用函数4.3外部中断的HAL驱动函数表4-2中前面的3个函数用于STM32CubeMX自动生成的代码,其他函数用于用户代码。几个常用的函数详细介绍如下。1.函数HAL_NVIC_SetPriorityGrouping()函数HAL_NVIC_SetPriorityGrouping()用于设置优先级分组策略,其函数原型定义如下:

voidHAL_NVIC_SetPriorityGrouping(uint32_tPriorityGroup);其中,参数PriorityGroup是优先级分组策略,可使用文件stm32f1xx_hal_cortex.h中定义的几个宏定义常量,如下所示,它们表示不同的分组策略。#defineNVIC_PRIORITYGROUP_00x00000007U//0位用于抢占优先级,4位用于次优先级#defineNVIC_PRIORITYGROUP_10x00000006U//1位用于抢占优先级,3位用于次优先级#defineNVIC_PRIORITYGROUP_20x00000005U//2位用于抢占优先级,2位用于次优先级#defineNVIC_PRIORITYGROUP_30x00000004U//3位用于抢占优先级,1位用于次优先级#defineNVIC_PRIORITYGROUP_40x00000003U//4位用于抢占优先级,0位用于次优先级4.3外部中断的HAL驱动函数2.函数HAL_NVIC_SetPriority()函数HAL_NVIC_SetPriority()用于设置某个中断的抢占优先级和次优先级,其函数原型定义如下:voidHAL_NVIC_SetPrlorlty(IRQn_TypeIRQn,uint32_tPreemptprlority,uint32_tsubpriority);其中,参数IRQn是中断的中断号,为枚举类型IRQn_Type。枚举类型IROn_Type的定义在文件stm32f103xe.h中,它定义了表4-1中所有中断的中断号枚举值。在中断操作的相关函数中,都用IRQn_Type类型的中断号表示中断,这个枚举类型的部分定义如下:typedefenum{/******Cortex-M3ProcessorExceptionsNumbers*******************************/NonMaskableInt_IRQn=-14,//NonMaskableInterruptMemoryManagement_IRQn=-12,//Cortex-M4MemoryManagementInterrupt4.3外部中断的HAL驱动函数BusFault_IRQn=-11,//Cortex-M4BusFaultInterruptUsageFault_IRQn=-10,//Cortex-M4UsageFaultInterruptSVCa11_IRQn=-5,//Cortex-M4SVCallInterruptDebugMonitor_IRQn=-4,//Cortex-M4DebugMonitorInterruptPendSV_IRQn=-2,//Cortex-M4PendSVInterruptSysTick_IRQn=-1,//Cortex-M4SystemTickInterrupt/******STM32specificInterruptNumbers******************************/WWDG_IRQn=0,//WindowWatchDogInterruptPVD_IRQn=1,//PVDthroughEXTILinedetectionInterruptEXTI0_IRQn=6,//EXTILineoInterruptEXTI1_IRQn=7,//EXTILinelInterruptEXTI2_IRQn=8,//EXTILine2InterruptRNG_IRQn=80,//RNGglobalInterruptFPU_IRQn=81.//FPUglobalinterrupt}IRQn_Type:4.3外部中断的HAL驱动函数由这个枚举类型的定义代码可以看到,其中断号枚举值就是在中断名称后面加了“_IRQn”。例如,中断号为0的窗口看门狗中断WWDG,其中断号枚举值就是WWDG_IRQn。函数中的另外两个参数,PreemptPriority是抢占优先级数值,SubPriority是次优先级数值。这两个优先级的数值范围需要在设置的优先级分组策略的可设置范围之内。例如,假设使用了分组策略2,对于中断号为6的外部中断EXTI0,设置其抢占优先级为1,次优先级为0,则执行的代码如下:HAL_NVIC_SetPriority(EXTIO_IRQn,1,0);3.函数HAL_NVIC_EnableIRQ()函数HAL_NVIC_EnableIRQ()的功能是在NVIC控制器中开启某个中断,只有在NVIC中开启某个中断后,NVIC才会对这个中断请求做出响应,执行相应的ISR。其原型定义如下:voidHAL_NVIC_EnableIRQ(IRQn_TypeIRQn):其中,枚举类型IRQn_Type的参数IRQn是中断号的枚举值。4.3外部中断的HAL驱动函数外部中断相关函数的定义在文件stm32f1xx_hal_gpio.h中,函数列表如表4-3所示。4.3.2外部中断相关HAL函数表4-3外部中断相关函数4.3外部中断的HAL驱动函数1.读取和清除中断标志在HAL库中,以“_HAL”为前缀的都是宏函数。例如,函数_HAL_GPIO_EXTI_GET_IT()的定义如下:#define_HAL_GPIO_EXTI_GET_FLAG(_EXTI_LINE_)(EXTI->PR&(_EXTI_LINE_))它的功能就是检查外部中断挂起寄存器(EXTI_PR)中某个中断线的挂起标志位是否置位。参数函数_HAL_GPIO_EXTI_CLEAR_IT()用于清除某个中断线的中断挂起标志位,其定义如下:

#define_HAL_GPIO_EXTI_CLEAR_IT(_EXTI_LINE_)(EXTI->PR=(_EXTI_LINE_))2.在某个外部中断线上产生软中断函数_HAL_GPIO_EXTI_GENERATE_SWIT()的功能是在某个中断线上产生软中断,其定义如下:#define_HAL_GPIO_EXTI_GENERATE_SWIT(_EXTI_LINE_)(EXTI->SWIER|=(_EXTI_LINE_))4.3外部中断的HAL驱动函数3.外部中断ISR以及中断处理回调函数对于0到15线的外部中断,EXTI0至EXTI4有独立的ISR,EXTI[9:5]共用一个ISR,EXTI[15:10]共用一个ISR。在启用某个中断后,在STM32CubeMX自动生成的中断处理程序文件stm32f1xx_it.c中会生成ISR的代码框架。这些外部中断ISR的代码都是一样的,下面是几个外部中断的ISR代码框架,只保留了其中一个ISR的完整代码,其他的删除了代码沙箱注释。voidEXTI0_IRQHandler(void)//EXTI0的ISR{/*USERCODEBEGINEXTI0_IRQn0*//*USERCODEENDEXTI0_IRQn0*/HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);/*USERCODEBEGINEXTI0_IRQn1*/4.3外部中断的HAL驱动函数/*USERCODEENDEXTI0_IRQn1*/}voidEXTI9_5_IRQHandler(void)//EXTI[9:5]的ISR{HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5);}voidEXTI15_10_IRQHandler(void)//EXTI[15:10]的ISR{HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_11);}4.3外部中断的HAL驱动函数可以看到,这些ISR都调用了函数HAL_GPIO_EXTI_IRQHandler(),并以中断线作为函数参数。所以,函数HAL_GPIO_EXTI_IRQHandler()是外部中断处理通用函数,这个函数的代码如下:voidHAL_GPIO_EXTI_IRQHandler(uint16_tGPIO_Pin){/*EXTIlineinterruptdetected*/If(_HAL_GPIO_EXTI_GET_IT(GPIO_Pin)!=RESET)//检测中断挂起标志{__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);//清除中断挂起标志HAL_GPIO_EXTI_Callback(GPIO_Pin);//执行回调函数}}本章目录4.1STM32F103中断系统4.2STM32F103外部中断/事件控制器EXTI4.5STM32F103的外部中断应用实例4.4STM32F103外部中断设计流程4.3外部中断的HAL驱动函数4.4STM32F103外部中断设计流程STM32F1中断设计包括三部分,即NVIC设置、中断端口配置、中断处理。使用库函数配置外部中断的步骤。(1)使能GPIO口时钟,初始化GPIO口为输入。首先,要使用GPIO口作为中断输入,所以要使能相应的GPIO口时钟。(2)设置GPIO口模式,触发条件,开启SYSCFG时钟,设置GPIO口与中断线的映射关系。该步骤如果使用标准库,那么需要多个函数分步实现。而当使用HAL库的时候,则都是在函数HAL_GPIO_Init中一次性完成的。例如要设置PA0连接中断线0,并且为上升沿触发,代码为:GPIO_InitTypeDefGPIO_Initure;GPIO_Initure.Pin=GPIO_PIN_0;//PA0GPIO_Initure.Mode=GPIO_MODE_IT_RISING;//外部中断,上升沿触发GPIO_Initure.Pull=GPIO_PULLDOWN;//默认下拉HAL_GPIO_Init(GPIOA,&GPIO_Initure);4.4STM32F103外部中断设计流程(3)配置中断优先级(NVIC),并使能中断。设置好中断线和GPIO映射关系,然后又设置好了中断的触发模式等初始化参数。既然是外部中断,涉及到中断当然还要设置NVIC中断优先级。设置中断线0的中断优先级并使能外部中断0的方法为:HAL_NVIC_SetPriority(EXTI0_IRQn,2,0); //抢占优先级为2,子优先级为0HAL_NVIC_EnableIRQ(EXTI0_IRQn); //使能中断线24.4STM32F103外部中断设计流程(4)编写中断服务函数。配置完中断优先级之后,接着要做的就是编写中断服务函数。中断服务函数的名字是在HAL库中事先有定义的。这里需要说明一下,STM32F1的IO口外部中断函数只有7个,分别为:voidEXTI0_IRQHandler();voidEXTI1_IRQHandler();voidEXTI2_IRQHandler();voidEXTI3_IRQHandler();voidEXTI4_IRQHandler();voidEXTI9_5_IRQHandler();voidEXTI15_10_IRQHandler();4.4STM32F103外部中断设计流程(5)编写中断处理回调函数HAL_GPIO_EXTI_Callback。在使用HAL库的时候,也可以跟使用标准库一样,在中断服务函数中编写控制逻辑。但是HAL库为了用户使用方便,它提供了一个中断通用入口函数HAL_GPIO_EXTI_IRQHandler,在该函数内部直接调用回调函数HAL_GPIO_EXTI_Callback。可以看看HAL_GPIO_EXTI_IRQHandler函数定义:voidHAL_GPIO_EXTI_IRQHandler(uint16_tGPIO_Pin){if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin)!=0x00u){__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);__HAL_GPIO_EXTI_Callback(GPIO_Pin);}}4.4STM32F103外部中断设计流程下面再总结一下配置GPIO口外部中断的一般步骤:(1)使能GPIO口时钟。(2)调用函数HAL_GPIO_Init设置GPIO口模式,触发条件,使能SYSCFG时钟以及设置GPIO口与中断线的映射关系。(3)配置中断优先级(NVIC),并使能中断。(4)在中断服务函数中调用外部中断共用入口函数HAL_GPIO_EXTI_IRQHandler。(5)编写外部中断回调函数HAL_GPIO_EXTI_Callback。通过以上几个步骤的设置,就可以正常使用外部中断了。本章目录4.1STM32F103中断系统4.2STM32F103外部中断/事件控制器EXTI4.5STM32F103的外部中断应用实例4.4STM32F103外部中断设计流程4.3外部中断的HAL驱动函数4.5STM32F103的外部中断应用实例本实例是一个基于STM32微控制器的简单例程,通过按下KEY0(PC13)或KEY_UP(PA0)按键来控制LED0(PA8)的状态翻转。首先,在STM32CubeMX中配置GPIO:将PA8设置为推挽输出模式以控制LED0,将PC13和PA0配置为输入模式并启用内部上拉电阻以检测按键状态。生成代码后,在main.c中实现按键控制和LED翻转的逻辑。4.5STM32F103的外部中断应用实例外部中断设计实例的硬件设计同按键的硬件设计,同图3-13所示。本实例使用STM32F103C8T6最小系统板上的两个按键,分别为KEY0按键和KEY_UP按键。当按键被按下时,PC13或PA0引脚的电平将从低电平状态变为高电平状态,产生一个上升沿信号。因此,可以将该上升沿信号用作中断的触发源。4.5.1STM32F103的外部中断应用实例硬件设计4.5STM32F103的外部中断应用实例EXTI(外部中断/事件控制器)用于管理来自GPIO等I/O引脚的信号引起的中断或事件。使用EXTI进行配置的流程如下:(1)配置EXTI线:设置EXTI线的模式、触发条件以及使能状态等配置项。(2)使能EXTI线中断:启用EXTI线的中断,并配置其相关的中断优先级。为实现这两个步骤,可以使用HAL库中的驱动函数进行配置。1.exti.h头文件exti.h头文件用于定义STM32F103微控制器的外部中断(EXTI)驱动代码,主要功能包括以下几个方面:(1)引脚和中断编号的定义:文件中定义了与按键相关的GPIO引脚及其对应的中断编号。例如,KEY0按键连接到GPIOC的第13引脚,WKUP按键连接到GPIOA的第0引脚。通过这些定义,程序可以方便地引用和管理这些引脚。4.5.2STM32F103的外部中断应用实例软件设计4.5STM32F103的外部中断应用实例(2)时钟使能宏:为每个引脚提供了时钟使能的宏定义,如KEY0_INT_GPIO_CLK_ENABLE()和WKUP_INT_GPIO_CLK_ENABLE()。这些宏通过调用__HAL_RCC_GPIOx_CLK_ENABLE()函数来使能相应GPIO端口的时钟,确保外部中断功能正常工作。(3)中断处理函数的定义:文件中还定义了与外部中断相关的中断请求号和中断处理函数。例如,KEY0的中断请求号为EXTI15_10_IRQn,其处理函数为EXTI15_10_IRQHandler。这些定义使得在中断发生时,能够正确调用相应的中断服务程序。文件还声明了exti_init()函数,用于外部中断的初始化,确保中断系统的正常运行。整体而言,exti.h提供了外部中断配置和管理的基础框架。4.5STM32F103的外部中断应用实例2.exti.c文件exti.c文件实现了STM32F103微控制器的外部中断(EXTI)驱动代码,主要功能包括以下几个方面:(1)中断服务程序:文件中定义了两个中断服务程序,分别为KEY0_INT_IRQHandler和WKUP_INT_IRQHandler。这两个函数在相应按键被按下时被调用,首先通过HAL_GPIO_EXTI_IRQHandler()清除中断标志位,然后再次调用__HAL_GPIO_EXTI_CLEAR_IT()以避免因按键抖动而导致的误触发。(2)中断回调处理:HAL_GPIO_EXTI_Callback()函数用于处理中断事件。在此函数中,首先进行消抖处理(延时20毫秒),然后根据触发的GPIO引脚号判断是哪个按键被按下。如果是KEY0或WKUP按键被按下,则调用LED0_TOGGLE()函数翻转LED0的状态。4.5STM32F103的外部中断应用实例(3)外部中断初始化:exti_init()函数负责配置外部中断的相关设置。它使能了KEY0和WKUP的GPIO时钟,配置了按键的触发模式(KEY0为下降沿,WKUP为上升沿),并设置了中断优先级和使能中断请求。这些配置确保了外部中断能够正常工作并响应按键事件。4.5STM32F103的外部中断应用实例3.main.c文件/*********************************************************************@filemain.c*@brief外部中断实例*********************************************************************/#include"./SYSTEM/sys/sys.h"#include"./SYSTEM/usart/usart.h"#include"./SYSTEM/delay/delay.h"#include"./BSP/LED/led.h"#include"./BSP/KEY/key.h"#include"./BSP/EXTI/exti

温馨提示

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

评论

0/150

提交评论