STM8教程实验10-定时器TIM3_第1页
STM8教程实验10-定时器TIM3_第2页
STM8教程实验10-定时器TIM3_第3页
STM8教程实验10-定时器TIM3_第4页
STM8教程实验10-定时器TIM3_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

1、例程十定时器TIM3定时器的使用是很重要的,可以说是单片机的灵魂来的,它的功能非常强大,单 片机可以利用它来做很多事情。这个例程主要解析一下 STM8S里面定时器TIM2 的主要功能特点。TIM2是个通用定时器,和TIM3是一样的。通用定吋器由带有可编程预分频器的位自动装载计数器构成。它适用于多种场含,包拆:基本的定时测量输入信号的脉冲长度(输入捎获)产生输出波形(输出比较,PWM和单脉冲) 与其他定吋器或外部信号同步(外部吋钟,复位.触发和使能信号)(仅针对带冇TI阳5的芯片) 定吋器可由内部时钟驱动。TIM2/TIIVI3的主要功能TIM2TIM3的功能包括:低位向上计数和自动装载计数器

2、4位可编程(可以实吋修改的)预分赧器,计教器吋钟频率的分频系数为132托&之间的2的 幕 3个独立通逍:输入捕莪一输出比较一 PWM主成(边缘对齐模式一单脉冲模式输出如下事件笈主吋产主中断;- 更新:计数器向上溢出.计数器初蛤化(通过软件-输入捕获-输出比较图 79TIM2/TIM3 框图TIME BASE UNIT6吨b Ck ChT1rrt; tnR-甫,r时基单元包含: 化位向上计数器预分频器 “位自动装载寄存器没有重复寄存器=计数器便用内部吋理(fMASTHR)+它由CK_PSC提供”井经过预分频器分攧产生计数器吋群CK CNT,时基单元TIMx PSCPjiuto-Rek3&

3、amp;d ReliefL16-blt C&UHBirTlMx_AfiflH. aRRLTlMx_.CinRH.CNTRL“UIF UEV3 / 9# / 9预分频器预分频黠的实现:预分频器基于4泣寄荷器控制的伯位计数器,由于寄存器带有缰冲器因此可以随吋修改预分 频的數值计数器可以取值为1到32了 68之间的2的幕进行分频。计数器吋钟频率的计算公式;fCK.CNT =如戶虫冋滤则预分频器的值由预装载寄存器写入=一旦写入预装载寄存器的LS字节时,带有当前使用值的影 子寄荷器就被写入了新的值新的预分频值在下一个周期时生效(在下一个更新事件之后h对TIMxPSCRM-器的徴攥作通过预装裁奇存

4、器实现,囚北可以随时僕取不受阳制°计数模式在向上计数模式中.计数潴从0计数到用户定义的比较值仃IMx_ARR寄存器的值),然G重新从0 开始计数井产生一仆计数器溢出事件,同时,如杲TIM1_CR117-的UDIS位是6将会产生一 个更新事件(UEV). 0描述了向上让数模式匚# / 9置位TIMjEGR寄疗器的UG位(通过软件方式或苦轻用从韓式控制器)也同样可以产生一个史新 事件.# / 9风驰电子STM8开发板2012愜用軟件置位TIMx_CR1寄存器的UDIS位.可以禁止更新事件,这样可以避免左史即预装我寄 存器吋史新影子寄存器。在UDIS位被淸除之前+將不产主更荻事件匚但是在应

5、该产生史新事件 时计数器仍会被清0,冋吋顶分颇器的计数也被濟0(但预分频樂的数值小变),此外,如呆设置 TTIMx_CR1寄存器中的URS位(选择史新诘求),设置UG位将产生一个史新事件UEX但硬件 不设置5f标志(即不产:生中断请求)这是为了避免在料我模式下涓除计垃器时,同时产生吏新 和捕获中断口巧发生一个更新韦件时,所有的寄存器都被更新,硬件同时(依据URS位)设置更新标志徑 (TIMx_SR寄存器的UF位”自动装载影子寄存器被車新置入预装载寄存器的僅TIMx_ARR).预分频器的緩存器被置入顼装载寄存器的值仃IMx_PSC寄存器的内容),卜-图给出一些例子,说明TIMx_ARR=0x36

6、吋,计数器在不同吋钟频率卜-的动作°坪站的预分频为Z囚此计数器的吋钟(CK_CNT)频率是预分频时钟(CKJSC)频率的一半匚 関32禁止了自动装載功能(ARPE=O)所以在计数器达到0x36吋,计数器溢出,娜子寄存器立刻 被史新,同时产主一个史新事件=图32当ARPE=0(ARR预装载h预分频为2时的计数器史新。ck psc luinjinnnnnnfinnnnnnnnnnnnnnnnnnRCNT_EM TIMER CLOCK = CK CMTrouuwwwuwiCOUNTER REGISTER3132)(33)(34归或3皿00和他® 3帕碗或虬COUNTER OVER

7、FLOW1nUPDATE EVENT (UEV|nilPHATF INTFRFHjPT FL AR (UIF)value iransfend knmedialBly in shadow朋3的预分频为仁因此CK_CNT(n频率与CKJSC暫影3便能了自动重载(ARPE=1),所以在计数器达到皿FF产生溢出。0x36在溢出时被写入, 同吋产生一个更新事件=4 / 9图33 ARPE=1仃IMJARR预装载)时的计数器更新ck_psc jLrLrLrLrLrLrLnrLrLrLrLrLrLrLrCNT ENTIMER CLOCK = CK.CNT_CQUMTER REGISTER FA )uumqi

8、nnmuuuinCOUNTER OVERFLOWUPDATE EVEHT (U£V|5 / 9# / 9计数模式就介绍一种向上技术模式,其他模式可以参考STM8寄存器.pdf文档第115页至118页捕获/比较通道输入部分请参考"5如魏2输入部分框图所示,定时器带有两个输入通道,通道1在内部链接到比较器匚 图82 输入部分框图# / 9风驰电子STM8开发板2012图83TIM2通道1的输入部分框图T11F ED:1c lhe clocfc/trnggeir witrollflfrnDUASTtRfitterdownooualeiTI1FTilf 巳OilTI2FP1divi

9、der/1.Z2. MJSICPSICF3:01<X1PTflCTl-CCMRlTIM? CCER1TI2F rising P (from channT 2)TI2F 恒Ilin® (from channel 2)(hom cloeMn contrbHsr>CG1tTIM2_CCMR1 TIM2.CCEA1图84输出部分框图6 / 9风驰电子STM8开发板2012# / 9风驰电子STM8开发板2012图85通道1的输出部分框罔# / 9风驰电子STM8开发板2012# / 9风驰电子STM8开发板2012通道输出的具体的原理可以参考 STM8寄存器.pdf文档第133页

10、至138页中断迪用宦时器包括4个中断源;捕茯/比较3中断捕茯/比较2中断捕获/出较1中断史新中断在使用中断功能吋,需要先设置TIMxJERf器的CC3IE位戎CC2IE位或CC1IE位使能中断请 求。通过软件设置TIMx_EGR寄存誥的相应位也能产主不冋的中版源-了解通用定时器TIM3现在关键是学会怎么去用,怎样去设置定时器的寄存器 好的,跟以前一样从主函数看起int main (void)C/* Infinite loop"设置內鄭冉速时钟為主时钟*CLK_HSrPrescalerConfig(CLKPRESCALER_HS工口工HL);/*1<Set High speed

11、internal clock */ TIM3_MQde = BaseTimeTini3_Init (丨;LED_lnit.();Set-LdOFF ();_nable_interrupt ();#elif= PWMPWM_Init ();while (1)/* 添力匚你的代码 */|#if TIM3_Mode =BaseTimeLED Display ();#*lif Tir-i3_Mode=-PWMTeat PWM_LED ();看过这主函数,是否觉得这和前面的例程写得有点不一样呢?是的,这个TIM3的功能强大,功能比较多,在我的例程中,我写了几个常用和比较重要的功能, 所以才有了预定义的方

12、法,这种形式对调试程序比较重要,呆会在详细解释。这 种#if#endif 或#if Helif#endif。这就预定义,只有后面为真,编译器 才会编译那些代码,否则就不会编译。大家学过C语言的都是知道这种编程方法, 希望大家能领会这种方法。下面还是主要看看的我们STM8S勺TIM3的各个功能的初始话。在这个例程中,介绍了定时器的基本定时,主要利用基本定时来实现 最精准的1ms的延迟函数和TIM3的PW啲功能。#if TTM3_Mode BaseTimeTim3_lnit ();LED !nit ();SetLedOFF ();enableinterrupt();#elif TIIwI3_Mod

13、e = PUMPWM init-();#endif这个就是初始化,如果是TIM3_Mode=BaseTim的话就是利用TIM3的定时器功 能。看看里面的初始化吧。7 / 9风驰电子STM8开发板2012void Tini3_lnit. (void)T丄M3_uelnit();TlM3_Tiin*3AsaIni-t ( 3P TM3_P RES CALE R_16 ,;TTM3_Prescale rConfig(TTM3_PRESCALER_16# Tin3_PSCRELOADMODE_IMHEDIATE), TiM3_ARRPreloadCorLfig (ehabLE );TIM3_ITCon

14、fig IIM3 _Z T _U PDAT E f ENABLE);TIM3_Cmd(ENABLE);)这个初始化函数定义了 TIM3的计数频率为主时钟的16分频,就是1M当从0计 数到999就是1ms但计数到999是马上又自动重装系数,又从 0开始计数,当 计数到999,会产生一个中断。_en ablenterrupt(); 这个就是开总中断其他的2个初始化就LED的初始化,前面已经讲过了,这里就不再重复了。下面看看中断服务子程序Interjrtipt void TIM3_UPD_OVF_BRK_IRQHand丄g弋(aoiM)T irairLgDelay_De creme nt ();TI

15、M3_ClearITPendingBit (THM:3_:rT_UPDATE); 一 一 一这个TIM3计数溢出中断的中断号为0xF,里面的函数是放中断后要处理的语句, 最后要清楚标志位,TIM3_ClearlTPendingBit(TIM3_IT_UPDATE);否则就跳不出 中断。这里主要是实现1ms的延迟函数,所以只调用了 TimingDelay_Decrement();这个函数。看看它的函数原型一void TimingDelay_Decrement. (void)if (TimingDelay i = 0x00)TimingDelay-;就是每近一次中断TimingDelay就减1,T

16、imingDelay定义为静态全局变量,这 样的话就可以实现1ms精准延迟。下面看看延迟函数的原型void delay_ms(nTime)Timi ngDe1ay = nTirne;while CTimingDelay L = 0);整个延迟思想是TimingDelay不等于0的话,就在这等到TimingDelay为0, TimingDelay减1是进去中断子程序,TimingDelay 是全局静态变量。这个功能 使用流水灯LED来演示,所以大家在主函数的文件头部那里这样定义就行 #dfine1非tdmfiriEPWM0#defineEaseTime1这个就是表示#if TIM3 Mode二二

17、 BaseTime当你编译的时候只编译定时器这个功能的代码。编译后下载到风驰电子STM8开发板的时候就会见到LED不断的流,每隔100ms下面接着写TIM3的PW功能#elif TIM3_Mode();void PWM I nit (甘想id)#if TIM3 Chaniti&l-=TIM3_Channel 1/*TTM3 Frequency = TTM3 counter elotk/(ARF + 1)*/TIM3_TinieBaseInit I.TTM3-PRE凸499);/*TIM3 Fraqli&ney = 16M/16/ (499+1) -2K*/* PWM1 Mode

18、 ccnfiguratian: ChannellTIM3 Chsnntll duty cycle = TIM3_CCR1/(TIM3_ARR + 1)J * 100 = 50*/TIM3_OClZnit (TIM3_OCMODE_Pml, TI M3 _OUT PUT ST AT E_E N AB LE r 2 5 0 , TI M3_O C PO LAE IT Y _H IGH); TiM3_oclPt&10adconfig(enable);#elif TTM3_Chan1 = -TIM3_Channe12TIM3_TinieEaselnit (TII13_PRESCALER_L6,

19、 999);TIM3 OCZmit (TIM3 OCMODE PtMMZ, TIM3 OUTPUT STATE fiHABLE, SDCt TIK3 OC POLARITY HIGH); TTM3_OC2Pre loadconfig(ENABLE);#fllif TIMS hs.nn«l = =TlM3_ehannel 3TI PI3_OC PO LARI TY_H I GH);TZM3_TittieEaseIlflit (TIM3_PRESCALER_16r 499);TIMS_OC3ini.t (IIM3_OCEODE_PWM3r II?I3_DUTFLITSTATE_ENABL

20、Ef 25Df TIM3_OC3FreloadC0nfig(ENABLE);#endifTIW3_Cnid (ENABLE) ivoid这个初始化函数定义了 3个通道的初始化,初始化里面最重要的是设置了 PWM勺 频率和占空比,对于怎么设,大家看上面的例程代码和注释就清楚了。 在官方库 里面没有单独对PW设置频率和占空比,所以我就封装了 2个这样的函数,大家 来看看。SetT工胆rrcqu2ric:¥ (uint 16_t TIM3_P© riod)/ * Set. theAutoreload value */TIM3->ARRH = (uint8_t)(TIM3_P

21、eriod » 8);TIM3->ARRL = (uintBt)(TTM3_PeLiod);大家看到这个函数是否和官方库封装的很相似呢?这是个很标准的函数,其实大家要培养成良好的编程习惯,这样让人感觉你的编程是很规范的。 这个函数是实 现PW啲频率的设置。频率的设置还要跟时钟有关系。TIM3 Freque ncy = TIM3 cou nter clock/(ARR +1)= TIM3 cou nterclock/( TIM3_Period+ 1)。void S-atTIM3_PWM_DutyCycl& ( ain匸rTM3_Pulse)#if friM3_Channel=TlM3_ChanneLl /* Set 七h总 Pulse value */TIH3->CCR1H = (uint8_t)(TIM3_Puls& » B); TIH3->CCR1Ij = (uinz6_t) (TlM3_eulse) i#lif TTM3_C

温馨提示

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

评论

0/150

提交评论