版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章
中断与系统定时器第4章
中断与系统滴答定时器【实战案例4-1】外部中断应用编程
【照猫画虎4-1】中断优先级的影响
【实践案例4-2】SysTick定时器的应用
【照猫画虎4-2】SysTick定时器的应用
4.1NVIC和EXTI控制器4.1.1基本概念
4.1.2NVIC和EXTI控制器4.1.3中断优先级管理异常(Exception)和中断(Interrupt)都是系统中突发事件的处理机制,当发生时将暂停处理器正常的执行流程,进入特定的处理程序。中断(Interrupt)是由内核外部产生的,一般由硬件引起,比如各种外设引起的外部中断等。异常(Exception)通常是在内核内部,由内核自身产生的,并且大多是由软件引起的,比如除法出错异常、Flash预取值失败等。4.1NVIC和EXTI控制器4.1.1基本概念
异常号和中断号4.1NVIC和EXTI控制器
中断向量和中断向量表4.1NVIC和EXTI控制器NVIC:NestedVectoredInterruptController,嵌套向量中断控制器4.1NVIC和EXTI控制器EXTI控制器:外部中断/事件(ExternalInterrupt)控制器4.1.2NVIC和EXTI控制器4.1NVIC和EXTI控制器NVIC的封装4.1NVIC和EXTI控制器EXTI控制器实现外部中断/事件的管理。外部中断/事件是实现外设与微处理器之间通信的主要方式之一。从外部激励信号来看,中断和事件的产生源可以一样。但是,中断(Interrupt)需要CPU参与后续的中断响应,包括上下文切换、执行中断服务程序、恢复现场并返回等,而事件(Event)只是触发脉冲发生器产生一个单脉冲输出,送入其他硬件电路,以实现对该事件的响应,比如DMA操作、AD转换等。EXTI控制器4.1NVIC和EXTI控制器4.1NVIC和EXTI控制器外部中断的引入在23根EXTI0~22中,16根来自于GPIO引脚,用于引入外部中断请求,7根引入RTC闹钟、USBOTGFS唤醒、以太网唤醒等事件。每根EXTI线通过多路开关与各GPIO中序号相同的引脚相连,连接的具体引脚通过GPIO端口复用寄存器进行配置和选择。4.1NVIC和EXTI控制器需要注意的是,在中断向量表中,由GPIO引脚引入的16个外部中断EXTI0~EXTI15只占用了7个中断向量,也就是只能使用7个中断服务函数。其中EXTI5~9、EXTI10~15分别共用一个中断处理函数。在NVIC中,用240个8位的中断优先级IP(InterruptPriority)寄存器实现各中断优先级的设置,因此最多可以管理240个中断的优先级。每个中断的优先级数值可以设置为0~255,分别保存在对应的IP寄存器中。另外,每4个IP寄存器构成一个32位的IPR寄存器,因此共有60个IPR寄存器IPR0~59。4.1NVIC和EXTI控制器4.1.3中断优先级管理IP寄存器4.1NVIC和EXTI控制器PRI_x:也就是NVIC结构体中的IP[x]WWDG_IRQn=0,PVD_IRQn=1,TAMP_STAMP_IRQn=2,RTC_WKUP_IRQn=3,
FLASH_IRQn=4,RCC_IRQn=5,
EXTI0_IRQn=6,在core_cm4.h文件中,定义了如下函数用于设置中断的优先级数值__STATIC_INLINEvoid__NVIC_SetPriority(IRQn_TypeIRQn,uint32_tpriority){if((int32_t)(IRQn)>=0){NVIC->IP[((uint32_t)IRQn)]=(uint8_t)((priority<<(8U-__NVIC_PRIO_BITS))&(uint32_t)0xFFUL);}……}4.1NVIC和EXTI控制器例如,利用如下语句 __NVIC_SetPriority(EXTI0_IRQn,2)调用上述函数时,函数中的__NVIC_PRIO_BITS宏的值为4,因此将入口参数2左移8-4=4位得到0x20,再与0xFF相与得到0x20,存入IP[6]寄存器中(其中6为EXTI0的中断号,即EXTI0_IRQn=6),从而设置EXTI0中断的优先级数值为2。4.1NVIC和EXTI控制器在NVIC中,原则上每个外部中断可配置的优先级数值为0~255,数值越小,优先级越高。为了便于管理,在STM32中将中断优先级进一步分为抢占优先级(PreemptPriority)和子优先级(SubPriority),其中子优先级又称为响应优先级。每个中断源都同时具有上述两种优先级。抢占优先级的级别高于响应优先级,并且数值越小所代表的优先级就越高。在进行优先级设置时,STM32F407只用了82个IP寄存器IP0~81,并且每个IP寄存器只用了高4位。高4位又进一步分为两部分,分别表示抢占优先级和子优先级。因此每个中断的抢占优先级和子优先级最多用4位二进制表示,意味着最多有16级抢占优先级和16级子优先级。4.1NVIC和EXTI控制器STM32的中断优先级管理为了便于管理,将中断优先级进一步分为抢占优先级(PreemptPriority)和子优先级(SubPriority)或响应优先级。STM32F407只用了82个IP寄存器IP0~81,并且每个IP寄存器中只用高4位表示抢占优先级和子优先级。通过设置不同的优先级分组可以指定高4位中用多少位分别表示抢占优先级和响应优先级。4.1NVIC和EXTI控制器例如:假设设置优先级分组为3,则在所有82个中断对应的每个IP寄存器中,用高4位中的最高3位指定该中断的抢占优先级,用高4位中的最低位1指定该中断的响应优先级。因此,每个中断的抢占优先级可以设置为0~7,响应优先级设置为1或0。4.1NVIC和EXTI控制器D7D4D3D00111未
用假设设置IP6=0111XXXX,则表示EXTI0的抢占优先级为3,子优先级为1。再如,假设中断优先级分组设为2,并设置3号中断(RTC_WKUP中断)的抢占优先级和响应优先级分别为2和1;6号中断(外部中断0)的抢占优先级和响应优先级分别为3和0;7号中断(外部中断1)的抢占优先级和响应优先级分别为2和0,则3个中断的优先级顺序为:中断7>中断3>中断64.1NVIC和EXTI控制器优先级管理规则4.1NVIC和EXTI控制器抢占优先级高的中断可以打断正在执行的抢占优先级低的中断。抢占优先级相同,响应优先级高的中断不能打断响应优先级低的中断。当两个或者多个中断的抢占式优先级和响应优先级都相同时,那么就遵循自然优先级,在中断向量表中,数值越小的优先级越高。4.2外部中断应用编程4.2.1外部中断的CubeMX配置4.2.2外部中断的初始化
4.2.3外部中断的处理4.2外部中断应用编程与外部中断相关的配置和应用程序包括如下内容:设置中断触发条件设置中断优先级使能外设中断判断中断源:进入中断服务程序后,根据中断标志判断当前发出中断请求的中断源。清除中断标志:发出中断请求后,相应的中断标志位将被置位,以便MCU接收到中断请求。这些中断请求需要及时清除,避免重复进入中断。编写中断服务程序:根据需要实现的具体功能编写接收到中断请求后应该执行的具体操作和实现的功能。4.2外部中断应用编程4.2.1外部中断的CubeMX配置在CubeMX中,配置GPIO引脚引入外部中断的基本步骤如下。1)配置GPIO引脚模式为复用的GPIO_EXTIx
2)在GPIO模式面板配置触发方式,具体可以分别配置为如下3种:ExternalInterruptwithRisingedgetriggerdetection:上边沿触发ExternalInterruptwithFallingedgetriggerdetection:下边沿触发ExternalInterruptwithRising/Fallingedgetriggerdetection:上下双边沿触发4.2外部中断应用编程3)在外设列表中单击SystemCore/NVIC,在NVIC配置面板中启用指定的中断
4)在NVIC配置面板上部的PriorityGroup(中断优先级分组)下拉列表中可以配置优先级分组,再在下面的列表中设置中断的抢占优先级和响应优先级。5)单击配置面板上方的Codegeneration(代码生成)标签,确认并勾选所启用外部中断的相关属性选项GenerateEnableinInit、GenerateIRQhandler、CallHALhandler,从而将在生成的工程代码中自动创建中断处理相关函数。4.2外部中断应用编程图4-4
NVIC配置对话框4.2外部中断应用编程4.2.2外部中断的初始化与外部中断相关的HAL库定义都放在stm32f4xx_hal_gpio.c/.h文件中。在GPIO初始化结构体GPIO_InitTypeDef定义中,成员Mode与外部中断有关,其取值可以是以下宏定义:#defineGPIO_MODE_IT_RISING (MODE_INPUT|EXTI_IT|TRIGGER_RISING) /*上升沿触发的外部中断模式*/#defineGPIO_MODE_IT_FALLING (MODE_INPUT|EXTI_IT|TRIGGER_FALLING) /*下降沿触发的外部中断模式*/#defineGPIO_MODE_IT_RISING_FALLING(MODE_INPUT|EXTI_IT|TRIGGER_RISING|TRIGGER_FALLING) /*上下边沿触发的外部中断模式*/4.2外部中断应用编程在gpio.c文件中的MX_GPIO_Init()函数中,将根据CubeMX中的配置对初始化结构体中的成员Mode进行赋值,从而配置指定的GPIO引脚为复用模式,并配置中断的触发方式,相关代码如下(以EXTI0中断为例):voidMX_GPIO_Init(void){ ……GPIO_InitStruct.Mode=GPIO_MODE_IT_RISING;……HAL_NVIC_SetPriority(EXTI0_IRQn,0,0); //设置EXTI0优先级HAL_NVIC_EnableIRQ(EXTI0_IRQn); //使能EXTI0中断}上述代码同时调用了两个HAL库函数设置外部中断的优先级,并开启中断。4.2外部中断应用编程4.2.3外部中断的处理在基于HAL库的程序开发中,所有中断处理函数都定义在文件stm32fxxxit.c中。在使用CubeMX软件进行初始化配置时,如果使能了某一个外设的中断功能,那么在生成代码时,相应的中断处理函数就会自动添加到该文件中,用户只需要在该函数中添加相应的中断处理代码即可。例如,假设配置了PA0引脚引入外部中断,则在stm32fxxxit.c中,将自动生成相应的中断服务程序如下:4.2外部中断应用编程4.2外部中断应用编程检测中断源清除中断请求调用中断回调函数4.2外部中断应用编程中断回调函数是一个弱函数,意思是在该函数中并未实现具体功能,仅仅是为了避免编译通过而设置的函数。函数实现的具体功能代码需要在用户程序文件中重写,将该函数覆盖掉。中断回调函数4.2外部中断应用编程【实践案例4-1】外部中断应用编程本案例要求利用按键控制LED的闪烁。开发板中两个按键K1和K2的电路连接如图4-6所示,其中K1和K2分别连接到GPIO的PA0和PC13引脚。当按键按下时,相应的GPIO引脚输出高电平;按键释放时,输出低电平。4.2外部中断应用编程CubeMX中的配置和初始化配置PF6引脚为GPIO_Output模式,配置PA0和PC13引脚,用户标签为LED_R。配置PA0和PC13为GPIO_EXTI0和GPIO_EXTI13模式,GPIO_Mode属性分别配置为上升沿触发和下降沿触发,User_Label分别配置为BTN_K1和BTN_K2。在NVIC配置对话框中勾选EXTIline0interrupt和EXTIline[15:10]interrupt,并确认上述两个外部中断的相关属性选项GenerateEnableinInit、GenerateIRQhandle、CallHALhandle都被勾选。4.2外部中断应用编程中断回调函数的编写4.2外部中断应用编程【照猫画虎4-1】中断优先级的影响要求在CubeMX中配置两个按键的不同优先级,并将中断回调函数按照如下修改。如果在延时等待期间,按动K2以产生一个低优先级的K2中断请求,观察红色LED能否像案例4-1一样闪烁(参谋工程文件夹2.KEY_INT)。注意延迟时间要足够大,以便观察。4.3系统滴答定时器4.3.1SysTick的封装4.3.2SysTick的初始化
4.3.3
系统节拍与HAL时基4.3.4HAL_Delay()函数
系统滴答定时器SysTick(SystemTimer)是属于CM4内核中的一个外设,内嵌在NVIC中,所有基于CM4内核的单片机都具有这个系统定时器,使得软件在CM4单片机中可以很容易的移植。系统定时器一般用于产生时基信号,作为操作系统所有操作的节拍和时间刻度。与普通的定时/计数器类似,系统定时器在计数脉冲的作用下进行递减计数。当从设定的计数初值计数到零时,将产生一次中断,即可实现每隔指定的时间实现期望的操作。4.3系统滴答定时器4.3.1SysTick的封装控制和状态寄存器重载寄存器当前计数值寄存器校准寄存器4.3系统滴答定时器位段名称描
述16COUNTFLAG定时器计数到0时该位置12CLKSOURCE时钟源选择位,0=HCLK/8,1=处理器时钟HCLK1TICKINT0:计数到0时不发中断请求,通过读取COUNTFLAG标志位可确定计数器是否递减到0;1:计数到0时产生SysTick异常请求
0ENABLE定时器的使能位(启动定时)CTRL:控制和状态寄存器4.3系统滴答定时器LOAD:重装计数初值寄存器。低24位保存计数初值,计数初值范围为0x00000001-0x00FFFFFF。假设需要定时N个时钟周期,则计数初值设为N-1。当CTRL中的ENABLE位置1时,计数器从LOAD寄存器重新装入RELOAD值,并开始减计数。计数到零时,COUNTFLAG位被置1。如果TICKINT位为1,则可以触发SysTick异常。之后,又自动装入RELOAD值,开始计数。VAL:当前计数值寄存器。低24位保存计数器的当前计数值,可供程序读取。4.3系统滴答定时器4.3系统滴答定时器4.3.2SysTick的初始化在core_cm4.h头文件中,定义了如下函数:uint32_tSysTick_Config(uint32_tticks)用于实现SysTick定时器的配置,其中包括设置LOAD寄存器的值等于ticks-1、设置SysTick异常的优先级,设置VAL寄存器的初始值为0,并配置SysTick的计数时钟脉冲为系统时钟脉冲HCLK,开启SysTick异常请求并启动定时。4.3系统滴答定时器在HAL_Init()->HAL_InitTick()->HAL_SYSTICK_Config()函数中,调用上述SYSTICK_Config()函数时的入口参数为
SystemCoreClock/(1000U/uwTickFreq)其中变量uwTickFreq的值为1;变量SystemCoreClock的值将通过main.c文件中的SystemClock_Config()函数自动配置为系统时钟频率(也就是H
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 莫比乌斯-题库(安全生产)测试卷及答案
- 2026电气照明考试题及答案
- 2026电路原理考试题及答案
- 虫媒传染病培训考试测试卷及答案
- 2026年高处作业特种工冲刺押题实战卷
- 2026年青海省公务员考试题库(面试)在线复习题库
- 2026年大连市高职单招职业技能考前演练试题及答案
- 小学美术教师考试试题及基础知识点整 理(附答案)
- 2026年乡镇(街道)公务员考前冲刺试题解析(海南临高)
- 2026年上半年教师资格证面试试讲真题(初中数学)
- 城市管理的面试题及答案
- 第三章物质的性质与转化论证重污染天气“汽车限行”的合理性探讨社会性科学议题教学设计-高一上学期化学鲁科版
- 翻转课堂培训课件
- 托里县上海梅兰日兰矿业有限公司新疆托里县科克火热金矿建设项目环境影响报告书简本
- 经营煤炭合伙协议书
- 合同面积调整补充协议
- 煤矿应急培训课件班组长
- RPA财务机器人开发与应用(课程标准)8.10
- 广西-黄邵华-向量的数量积
- 2023市政排水管道气囊封堵施工规程
- 利用PDCA提高预诊分诊率
评论
0/150
提交评论