实验七:定时器中断实验

上传人:人*** 文档编号:562067662 上传时间:2023-02-11 格式:DOCX 页数:8 大小:80.49KB
返回 下载 相关 举报
实验七:定时器中断实验_第1页
第1页 / 共8页
实验七:定时器中断实验_第2页
第2页 / 共8页
实验七:定时器中断实验_第3页
第3页 / 共8页
实验七:定时器中断实验_第4页
第4页 / 共8页
实验七:定时器中断实验_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《实验七:定时器中断实验》由会员分享,可在线阅读,更多相关《实验七:定时器中断实验(8页珍藏版)》请在金锄头文库上搜索。

1、0河由,求七琴微控制器综合设计与实训实验名称: 实验七 定时器中断实验实验七:定时器中断实验1 实训任务(1) 设置定时器时钟,自动重装载值,分频系数和计数方式;(2) 设置定时器中断优先级;(3) 通过编写延时函数实现定时器中断。11 实验说明STM32的通用定时器是由一个通过可编程预分频器(PSC)驱动的16位自动 装载计数器(CNT)构成。STM32的通用定时器的用途:测量输入信号的脉冲长度 (输入捕获)或者产生输出波形(输出比较和PWM)等。使用定时器预分频器和 RCC 时钟控制器预分频器,可以使脉冲长度和波形周期在几个微秒到几个毫秒 间调整。STM32F10X 的通用 TIMx(TI

2、M2、TIM3、TIM4 和 TIM5)定时器功能包括:(1) 6位向上、向下、向上/向下自动装载计数器(TIMx_CNT)。(2) 16位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分 频系数为165535之间的任意数值。(3) 4个独立通道(TIMx_CHl4),这些通道可以用来作为:A 输入捕获B.输出比较CPWM 生成(边缘或中间对齐模式)D. 单脉冲模式输出可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用1个定时 器控制另外一个定时器)的同步电路。(5)如下事件发生时产生中断/DMA:A. 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件

3、或者内部/外 部触发)B. 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)C 输入捕获D. 输出比较E. 支持针对定位的增量(正交)编码器和霍尔传感器电路F. 触发输入作为外部时钟或者按周期的电流管理定时器的时钟来源有 4 个:(1) 内部时钟(CK_INT)(2) 外部时钟模式1:外部输入脚(Tlx)(3) 外部时钟模式2:外部触发输入(ETR)(4) 内部触发输入(ITRx):使用A定时器作为B定时器的预分频器(A为B 提供时钟)。这些时钟,具体选择哪个可以通过 TIMx_SMCR 寄存器的相关位来设置。 这里的CK_INT时钟是从APB1倍频来的,除非APB1的时钟分频数设

4、置为1, 否则通用定时器TIMx的时钟是APB1时钟的2倍,当APB1的时钟不分频的时 候,通用定时器TIMx的时钟就等于APB1的时钟。这里还要注意的就是高级定 时器的时钟不是来自APB1,而是来自APB2。本实验使用定时器3产生溢出中断,在中断服务函数里面翻转LED上的电 平,来指示定时器中断的产生。定时器相关的库函数主要集中在固件库文件 stm32f10x_tim.h 和 stm32f10x_tim.c 文件中。12 实验步骤(1) 在实训平台上将PE4和PE5分别连接LED灯;(2) 复制上一个实验工程修改名称并保存为定时器中断实验;(3) 新建timer.c和timer.h文件,添加

5、至工程中; 编写timer.h文件,声明定时器3初始化函数;(5) 编写timer.c文件,编写定时器3初始化函数,设置分频系数、计数方式、 自动重装载计数周期值和时钟分频因子;(6) 编写 main 函数,程序编译正确;2 程序设计(1) 新建文件夹并命名为定时器中断实验,复制粘贴之前的实验文件,将工程文件改名为TIMER.uvprojx,同时添加timer.c和timer.h文件至工程中。(2)编写timer.h文件。fj.Ende _riHER_Hdefine 二TTXE匸Hfinclude ays hvoid TIM3_Inc_IniL,c luL6 & Ful psc):tendlf

6、图 8.2 timer.h 文件(3) 编写 timer.c 文件。a. 让 TIM3 时钟使能TIM3挂载在APB1下,通过APB1总线下的使能函数来使能。void TIM3_Int_Init(ul& arr U16 psc)1 RCC_APBlPeriphClockCmd(RCC_APBlPeriph_ra3, ENABLE):时讣恒能图8.3 时钟使能b. 初始化定时器参数, 设置自动重装值,分频系数,计数方式 库函数中定时器的初始化参数是通过初始化函数TIM_TimeBaseInit实现的,Void TIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeB

7、aseInitTypeDef*TIM_TimeBaseInitStruct第一个参数是确定哪一个定时器,第二个参数是定时器初始化参数结构体指针结构体类型为TIM_TimeBaseInitTypeDef,这个结构体的定义为:typedef structuintl6_t TlM_Prescaler; riM_CounierMode;uintlEt TIM_Period;uint16_t riM_ClockBivisionHuint8_t TIM_Repetitio ;TIM TimeBaselnitTYDeOef:图8.4 结构体定义这个结构体一共有 5 个成员变量,对于通用定时器只有前面 4 个

8、参数有用 最后一个参数 TIM_RepetitionCounter 在高级定时器才会用到。c. 设置 TIM3_DIER 允许更新中断 寄存器的相应位使能更新中断,在库函数里面定时器中断使能是通过 TIM_ITConfig 函数来实现的:void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_tTIM_IT, FunctionalState NewState);第一个参数是选择定时器,取值为 TIM1TIM17。第二个参数非常关键,是用来指明使能的定时器中断的类型,定时器中断的 类型有很多种,包括更新中断TIM_IT_Update,触发中断TIMT_Trigge

9、r,以及 输入捕获中断等等。第三个参数是设定失能还是使能。最终函数为 TIM_ITConfig(TIM3,TIM_IT_Update, ENABLE );d. TIM3中断优先级设置在定时器中断使能之后,因为要产生中断,必不可少的要设置NVIC相关寄 存器,设置中断优先级。WIC InitStructure.NVIC IRQChajinel = TIM3_IRQn:TIM3中新?rI C_ I ni tS t ruct ur e. I cl I RQChanne LPr e &mp t ionPr i or i t y = 0:;1占优先级 Ci 级mC_InitStnicture.5YLC_

10、IRQChannelSubPrioritv = 3;从优先级 3 级WIC_InitStructurerrIC_TRQChannelCnid = ENABLE: TRQ 通道牡逆直IC_Ini t (ftNVIC_InitStru.cture):旳抬ItXVIC寄存器图8.5 中断优先级设置e. 使能 TIM3配置完后要开启定时器,通过TIM3_CR1的CEN位来设置。在固件库里面 使能定时器的函数是通过TIM_Cmd函数来实现的:void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState) 此时定时器 3 初始化函数为:void TIM3

11、_Int_Init(ul6 arr, u!6 psc)T IM_T iineEas e Ini t T vpDe f TIM_Ti meBaseSt ructure:RCC_APB LPer iph? 1 ckCmd tHOCAPB 1 Per i ph.TIMJ, ENABLE); 时制便能TypeUef NVIC_InitStructure ;TIM_TimeBaseStrLicture. TIM_Period = arr;设置在下一个更新爭件装入活动的胃娜裝我寄存器冏期 TIM TimeBaseStructure, TIM Prescaler =psc;设置用來惟为TIMx时梆飙車廉的頂

12、分蘋准TMilimeBaseStructure. TBLclockDivision 二 TIM_CKD_DIV1 ;讹胃时沖寸割:TDT5 二 Tck_tiDiT IM_T iineBas eStructure. TI W_Coutit er Mode = TIM_Ccnjni.erMode_Up:亍叮1向 t. i I 敎煌式T IM_T imeBas e Ini t(TIM3, ATIM_T imeBas eSt rue t lire);/ 棍据指疋的参暫初始化 T IMx 的时冋站数单位TIM_ITConfig(IIM3rTIM_IT_UpdaTe, EXAELE );快傩指n:押TB5

13、3中撕.ft许更fr中曲WIC.InLT St rue ture. NVIC_I RQChanne 1 = TIM3_IRQn: TIH3 中噺WIC InitStructure. WIC I RQChanne I Preempt i onPr j or i t v = 0;UkVL 丸緘。缄IC_ItiitStructure. NP1C_IRQChanne 1 SubPriority = 3;从起先级3拔WK_InitStructure. W1C_IRQChanne 1 Cmd = ENABLE:喷能WlC.Init NPIC_InitStructure:旳始化XVK 帘存器TIM_Cind

14、.(riM3r ENABLE):TM3图8.6初始化函数TIM3_Int_Init()函数就是上边介绍的几个步骤,该函数的2个参数用来设置 TIM3的溢出时间。系统初始化的时候在默认的系统初始化函数Systemlnit函数 里面已经初始化APB1的时钟为2分频,所以APB1的时钟为36M,而从STM32 的内部时钟树图得知:当APB1的时钟分频数为1的时候,TIM27的时钟为APB1 的时钟,而如果APB1的时钟分频数不为1,那么TIM27的时钟频率将为APB1 时钟的两倍。因此,TIM3的时钟为72M,再根据我们设计的arr和psc的值, 就可以计算中断时间了。计算公式如下:Tout= (a

15、rr+1)*(psc+1)/Tclk;其中:Tclk: TIM3 的输入时钟频率(单位: Mhz)Tout: TIM3 的溢出时间(单位: us)f. 编写中断服务函数通过该函数来处理定时器产生的相关中断。在中断产生后,通过状态寄存器 的值来判断此次产生的中断属于什么类型。然后执行相关的操作,这里使用的是 溢出中断,所以在状态寄存器 SR 的最低位。在处理完中断之后应该向 TIM3_SR 的最低位写 0,来清除该中断标志。在固件库函数里面,用来读取中断状态寄存器的值判断中断类型的函数是:ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t)该函数的作用是判断定时器TIMx的中断类型,TIM_IT是否发生中断。固件库中清除中断标志位的函数是:void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT)该函数的作用是清除定时器TIMx的中断TIMT标志位。中断服务函数为:void TIM3_IRQHandler(void)if (TIM_GetITStatUs(TlM3, TIM_IT

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号