版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章EXTI与开发实例6.1STM32F4中断系统向量中断控制器简称NVIC(NestedVectoredInterruptController),是Cortex-M4不可分离的一部分。NVIC与Cortex-M4内核相辅相成,共同完成对中断的响应。NVIC的寄存器以存储器映射的方式访问,除了包含控制寄存器和中断处理的控制逻辑之外,NVIC还包含了MPU、SysTick定时器及调试控制相关的寄存器。ArmCortex-M4内核共支持256个中断,其中16个内部中断,240个外部中断和可编程的256级中断优先级的设置。STM32目前支持的中断共84个(16个内部+68个外部),还有16级可编程的中断优先级。6.1.1STM32F4嵌套向量中断控制器NVIC每个外部中断与NVIC中的下列寄存器中有关:(1)使能与除能寄存器(除能也就是平常所说的屏蔽)。(2)挂起与解挂寄存器。(3)优先级寄存器。(4)活动状态寄存器。另外,下列寄存器也对中断处理有重大影响:(1)异常屏蔽寄存器(PRIMASK、FAULTMASK及BASEPRI)。(2)向量表偏移量寄存器。(3)软件触发中断寄存器。(4)优先级分组字段。中断优先级数值越小优先级越高。STM32Cortex-M4中断有抢占优先级和响应(亚或副)优先级,均需设置。1. 何为抢占式优先级(preemptionpriority)高抢占式优先级的中断事件会打断当前的主程序/中断程序运行,俗称中断嵌套。2. 何为响应优先级(subpriority)在抢占式优先级相同的情况下,高响应优先级的中断优先被响应。在抢占式优先级相同的情况下,如果有低响应优先级中断正在执行,高响应优先级的中断要等待已被响应的低响应优先级中断执行结束后才能得到响应(不能嵌套)。6.1.2STM32F4中断优先级3. 判断中断是否会被响应的依据首先是抢占式优先级,其次是响应优先级。抢占式优先级决定是否会有中断嵌套。4.优先级冲突的处理高抢占优先级中断可在低抢占中断处理中响应,实现中断嵌套。抢占优先级相同时无嵌套,先处理先到或响应优先级高者,相同按表顺序。5. STM32中对中断优先级的定义STM32的中断有两个优先级的概念:抢占式优先级和响应优先级,也把响应优先级称作“亚优先级”或“副优先级”,每个中断源都需要被指定为这两种优先级。(1)抢占式优先级高抢占优先级中断能抢断低优先级中断,实现中断嵌套,优先响应。(2)副优先级抢占级相同时,高副优先级先响应,低副优先级中断执行完后才响应,非抢断。(3)优先级冲突处理抢占优先相同无嵌套,先处理先来或副优先级高的,中断表顺序决定最终处理顺序。因此,判断中断是否会被响应的依据是,首先是看抢占式优先级,其次是副优先级。抢占式优先级决定是否会有中断嵌套;(4)STM32对中断优先级的定义STM32中指定中断优先级的寄存器位有4位,这4个寄存器位的分组方式如下:第0组,所有4位用于指定响应优先级。第1组,最高1位用于指定抢占式优先级,最低3位用于指定响应式优先级。第2组,最高2位用于指定抢占式优先级,最低2位用于指定响应式优先级。第3组,最高3位用于指定抢占式优先级,最低1位用于指定响应式优先级。第4组,所有4位用于指定抢占式优先级。优先级分组方式所对应的抢占式优先级和响应式优先级寄存器位数和所表示的优先级数如图6-2所示。图6-2STM32F4优先级位数和级数分配图中断向量表是中断系统中非常重要的概念。它是一块存储区域,通常位于存储器的地址处,在这块区域上按中断号从小到大依次存放着所有中断处理程序的入口地址。当某个中断发生且未被屏蔽时,CPU会根据中断号查找中断向量表中的对应项,获取该中断服务程序入口地址,随后跳转执行该程序。这是STM32F4系列中断处理的基本流程。STM32F4系列微控制器不同产品支持可屏蔽中断的数量略有不同。6.1.3STM32F4中断向量表STM32F407中断服务函数在启动文件startup_stm32f40x_xx.s预定义,命名为PPP_IRQHandler。用户在stm32f40x_it.c中用C语言重定义,编译链接时替代默认中断服务程序。STM32F407的中断服务函数具有以下特点:(1)预置弱定义属性。启动代码中除复位程序外,中断服务函数预置弱定义,用户可同名替代。(2)全C实现。中断服务程序全用C语言编写,现场保护恢复由硬件自动完成,无需汇编“封皮”。6.1.4STM32F4中断服务函数6.2STM32F4外部中断/事件控制器EXTISTM32F407的EXTI有23个边沿检测器,每线独立配置输入类型和触发边沿(上、下或双边),且可独立屏蔽,中断请求由挂起寄存器保持。EXTI控制器的主要特性如下:(1)每个中断/事件都有独立的触发和屏蔽。(2)每个中断线都有专用的状态位。(3)支持多达23个软件的中断/事件请求。(4)检测脉冲宽度低于APB2时钟宽度的外部信号。外部中断/事件控制器由中断屏蔽寄存器、请求挂起寄存器、软件中断/事件寄存器、上升沿触发选择寄存器、下降沿触发选择寄存器、事件屏蔽寄存器、边沿检测电路和脉冲发生器等部分构成。外部中断/事件控制器框图如图6-3所示。6.2.1STM32F4的EXTI内部结构图6-3STM32F407外部中断/事件控制器内部结构图EXTI有两种功能:产生中断请求和触发事件。1. 外部中断与事件输入从图6-3看,STM32F407EXTI共有23内部信号线和23外部中断/事件输入线,编号EXTI0~EXTI22。EXTI0~EXTI15共16个输入线由GPIO引脚选定,每个EXTI线只能被一个GPIO引脚绑定。EXTI0~EXTI4独立ISR,EXTI5~EXTI9共用ISR,EXTI10~EXTI15共用ISR,需ISR内判断具体中断线。另外7个EXTI线连接的不是某个实际的GPIO引脚,而是其他外设产生的事件信号。这7个EXTI线的中断有单独的ISR。(1)EXTI线16连接PVD输出。(2)EXTI线17连接RTC闹钟事件。(3)EXTI线18连接USBOTGFS唤醒事件。(4)EXTI线19连接以太网唤醒事件。(5)EXTI线20连接USBOTGHS唤醒事件。(6)EXTI线21连接RTC入侵和时间戳事件。(7)EXTI线22连接RTC唤醒事件。另外,如果将STM32F407的I/O引脚映射为EXTI的外部中断/事件输入线,必须将该引脚设置为输入模式。图6-4STM32F407外部中断/事件输入线映像2. APB外设接口图6-3上部的APB外设模块接口是STM32F407微控制器每个功能模块都有的部分,CPU通过这样的接口访问各个功能模块。3. 边沿检测器EXTI中的边沿检测器共有23个,用来连接23个外部中断/事件输入线,是EXTI的主体部分。每个边沿检测器由边沿检测电路、控制寄存器、门电路和脉冲发生器等部分组成。STM32F407微控制器的外部中断/事件控制器EXTI,具有以下主要特性:(1)每个外部中断/事件输入线都可以独立地配置它的触发事件(上升沿、下降沿或双边沿),并能够单独地被屏蔽。(2)每个外部中断都有专用的标志位(请求挂起寄存器),保持着它的中断请求。(3)可以将多达140个通用I/O引脚映射到16个外部中断/事件输入线上。(4)可以检测脉冲宽度低于APB2时钟宽度的外部信号。6.2.2STM32F4的EXTI主要特性6.3STM32F4中断HAL驱动程序STM32中断系统是通过一个嵌套向量中断控制器(NVIC)进行中断控制的,使用中断要先对NVIC进行配置。STM32的HAL库中提供了NVIC相关操作函数。STM32F4中断管理相关驱动程序的头文件是stm32f4xx_hal_cortex.h,其常用函数如表6-2所示。6.3.1中断设置相关HAL驱动函数表6-2中断管理常用函数表6-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位用于次优先级2. 函数HAL_NVIC_SetPriority()函数HAL_NVIC_SetPriority()用于设置某个中断的抢占优先级和次优先级,其函数原型定义如下:voidHAL_NVIC_SetPrlorlty(IRQn_TypeIRQn,uint32_tPreemptprlority,uint32_tsubpriority);其中,参数IRQn是中断的中断号,为枚举类型IRQn_Type。枚举类型IROn_Type的定义在文件stm32F407xe.h中。在中断操作的相关函数中,都用IRQn_Type类型的中断号表示中断,这个枚举类型的部分定义如下:typedefenum{/******Cortex-M4处理器异常编号*******************************/NonMaskableInt_IRQn=-14,//NonMaskableInterruptMemoryManagement_IRQn=-12,//Cortex-M4MemoryManagementInterruptBusFault_IRQn=-11,//Cortex-M4BusFaultInterruptUsageFault_IRQn=-10,//Cortex-M4UsageFaultInterruptSVCa11_IRQn=-5,//Cortex-M4SVCallInterruptDebugMonitor_IRQn=-4,//Cortex-M4DebugMonitorInterruptPendSV_IRQn=-2,//Cortex-M4PendSVInterruptSysTick_IRQn=-1,//Cortex-M4SystemTickInterrupt/******TM32特定中断编号******************************/WWDG_IRQn=0,//WindowWatchDogInterruptPVD_IRQn=1,//PVDthroughEXTILinedetectionInterruptEXTI0_IRQn=6,//EXTILineoInterruptEXTI1_IRQn=7,//EXTILinelInterruptEXTI2_IRQn=8,//EXTILine2InterruptRNG_IRQn=80,//RNGglobalInterruptFPU_IRQn=81.//FPUglobalinterrupt}IRQn_Type:由这个枚举类型的定义代码可以看到,其中断号枚举值就是在中断名称后面加了“_IRQn”。例如,中断号为0的窗口看门狗中断WWDG,其中断号枚举值就是WWDG_IRQ0函数中的另外两个参数,PreemptPriority是抢占优先级数值,SubPriority是次优先级数值。3. 函数HAL_NVIC_EnableIRQ()函数HAL_NVIC_EnableIRQ()的功能是在NVIC控制器中开启某个中断,只有在NVIC中开启某个中断后,NVIC才会对这个中断请求做出响应,执行相应的ISR。其原型定义如下:voidHAL_NVIC_EnableIRQ(IRQn_TypeIRQn):其中,枚举类型IRQn_Type的参数IRQn是中断号的枚举值。外部中断相关函数的定义在文件stm32f4xx_hal_gpio.h中,函数列表如表6-3所示。6.3.2外部中断相关HAL函数表6-3外部中断相关函数1. 读取和清除中断标志在HAL库中,以“_HAL”为前缀的都是宏函数。例如,函数_HAL_GPIO_EXTI_GET_IT()的定义如下:#define_HAL_GPIO_EXTI_GET_IT(_EXTI_LINE_)(EXTI->PR&(_EXTI_LINE_))它的功能就是检查外部中断挂起寄存器(EXTI_PR)中某个中断线的挂起标志位是否置位。参数2. 在某个外部中断线上产生软中断函数_HAL_GPIO_EXTI_GENERATE_SWIT()的功能是在某个中断线上产生软中断,其定义如下:#define_HAL_GPIO_EXTI_GENERATE_SWIT(_EXTI_LINE_)(EXTI->SWIER|=(_EXTI_LINE_))它实际上就是将外部中断的软件中断事件寄存器(EXTI_SWIER)中对应于中断线_EXTI_LINE_的位置1,通过软件的方式产生某个外部中断。3. 外部中断ISR以及中断处理回调函数对于0~15线的外部中断,EXTI0~EXTI4有独立的ISR,EXTI[9:5]共用一个ISR,EXTI[15:10]共用一个ISR。在启用某个中断后,在STM32CubeMX自动生成的中断处理程序文件stm32f4xx_it.c中会生成ISR的代码框架。这些外部中断ISR的代码都是一样的。6.4STM32F4外部中断设计流程STM32F4中断设计包括三部分,即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);(3)配置中断优先级(NVIC),并使能中断。设置好中断线和GPIO映射关系,然后又设置好了中断的触发模式等初始化参数。设置中断线0的中断优先级并使能外部中断0的方法为:HAL_NVIC_SetPriority(EXTI0_IRQn,2,0); //抢占优先级为2,子优先级为0HAL_NVIC_EnableIRQ(EXTI0_IRQn); //使能中断线0(4)编写中断服务函数。配置完中断优先级之后,接着要做的就是编写中断服务函数。中断服务函数的名字是在HAL库中事先有定义的。这里需要说明一下,STM32F14的IO口外部中断函数只有7个,分别为:voidEXTI0_IRQHandler();voidEXTI1_IRQHandler();voidEXTI2_IRQHandler();voidEXTI3_IRQHandler();voidEXTI4_IRQHandler();voidEXTI9_5_IRQHandler();voidEXTI15_10_IRQHandler();(5)编写中断处理回调函数HAL_GPIO_EXTI_Callback。在使用HAL库的时候,也可以跟使用标准库一样,在中断服务函数中编写控制逻辑。6.5采用STM32CubeMX和HAL库的外部中断设计实例中断在嵌入式应用中占有非常重要的地位,几乎每个控制器都有中断功能。中断对保证紧急事件在第一时间处理是非常重要的。设计使用外接的按键作为触发源,使得控制器产生中断,并在中断服务函数中实现控制RGB彩灯的任务。外部中断设计实例的硬件设计同按键的硬件设计,如图5-48所示。在本实例中,我们根据图5-48一个示例,通过按键控制LED,如下:(1)按下KEY1,LED变亮;再按下KEY1,LED变暗;(2)按下并弹开KEY2,LED变亮;再按下并弹开KEY2,LED变暗;6.5.1STM32F4外部中断的硬件设计下面讲述STM32F4外部中断的软件设计。1.通过STM32CubeMX新建工程通过STM32CubeMX新建工程的步骤如下:(1)新建文件夹
Demo目录下新建文件夹EXTI,这是保存本章新建工程的文件夹。(2)新建STM32CubeMX工程在STM32CubeMX开发环境中新建工程。(3)选择MCU或开发板CommercialPartNumber和MCUs/MPUsList选择STM32F407ZGT6,选择StartProject启动工程。6.5.2STM32F4外部中断的软件设计(4)保存STM32CubeMX工程使用STM32CubeMX菜单File→SaveProject,保存工程。(5)生成报告使用STM32CubeMX菜单File→GenerateReport生成当前工程的报告文件。(6)配置MCU时钟树STM32CubeMXPinout&Configuration子页面下,选择SystemCore→RCC,HighSpeedClock(HSE)根据开发板实际情况,选择Crystal/CeramicResonator(晶体/陶瓷晶振)。(7)配置MCU外设配置GPIO端口为EXTI模式如图6-5所示图6-5配置GPIO端口为EXTI模式配置完成后的GPIO端口页面如图6-6所示。图6-6配置完成后的GPIO端口页面切换到STM32CubeMXPinout&Configuration子页面下选择SystemCore→NVIC,修改PriorityGroup为2bitsforpre-emptionpriority(2位抢占优先级),Enabled栏勾选EXTIline0interrupt和EXTIline[15:10]interrupts。修改PreemptionPriority(抢占优先级)和SubPriority(子优先级)如图6-7所示。图6-7NVIC配置页面CodeGeneration页面Selectforinitsequenceordering栏勾选EXTIline0interrupt和EXTIline[15:10]interrupts。NVICCodeGeneration配置页面如图6-8所示。图6-8NVICCodeGeneration配置页面(8)配置工程STM32CubeMXProjectManager子页面Project栏下Toolchain/IDE选择MDK-Arm,MinVersion选择V5,可生成KeilMDK工程;选择STM32CubeIDE,可生成STM32CubeIDE工程。(9)生成C代码工程STM32CubeMX主页面,单击GENERATECODE按钮生成C代码工程。2.通过KeilMDK实现工程通过KeilMDK实现工程的步骤如下:(1)打开工程打开
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 影像与手术设备协同维护
- 2025年广告投放协议(视频)
- 康复设备人机交互:适配不同功能障碍患者的个性化方案
- 康复医疗质量评价与持续改进策略
- 2025年宠物急诊专员年终应急处置报告
- 师资同伴互助学习机制构建
- 屈光白内障联合手术常见并发症的预防策略
- 护理岗位护理岗位沟通技巧
- 屈光术前眼内压评估与术中调控策略优化
- 医疗健康大数据平台的建设与运营
- 2026年海南职业技术学院单招职业技能测试题库及参考答案详解1套
- 浙江省强基联盟2025-2026学年高三上学期二模英语试题(解析版)
- 2026春译林版新版八年级下册英语单词默写表
- 2025至2030中国网球行业市场发展分析与发展趋势及投资风险报告
- 袜业生产质量管理工作规范
- 安全生产三管三必须培训课件
- 2025秋人教版(新教材)小学信息科技五年级全一册(上册)期末测试卷附答案(三套)
- 鼓号队小镲训练
- DB-T29-317-2024 雪道施工技术规程
- GB/T 9870.3-2025硫化橡胶或热塑性橡胶动态性能的测定第3部分:玻璃化转变温度(Tg)
- 【MOOC】《刑法学总论以案说法》(暨南大学)期末考试慕课答案
评论
0/150
提交评论