STM32定时器详细讲解及应用_第1页
STM32定时器详细讲解及应用_第2页
STM32定时器详细讲解及应用_第3页
STM32定时器详细讲解及应用_第4页
STM32定时器详细讲解及应用_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

1、stm32之定时器彻底研究(2011-11-2514:38)分类:STM32学习笔记这里介绍两种方式使用stm32的定时器:直接操作寄存器和使用st的官方的库文件。相比较而言,直接操作定时器比较简洁,对着寄存器看十分明了。而使用库文件有一点晕头转向。(个人观点)程序如下:(以下程序在DX32的例程修改而来,使用的是比较古老的3.0固件库)1、timer,c文件ttinclude,STM32Libstm32f10 x.hvoidTIM2_Configuration(void)_TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;TIM_OCInitTypeD

2、efTIM_OCInitStructure;400020001000500;ul6CCRl_Valul6CCR2_Valul6CCR3_Valul6CCR4_Val/*TIM2clockenable*/RCC_APBlPeriphClockCmd(RCC_APBlPeriph_TIM2,ENABLE);/*基础设置*/TIM_TimeBaseStructure.TIM_Period=10000;/计满值TIM_TimeBaseStructure.TIM_Prescaler=7200-1:/预分频,此值TOC o 1-5 h z+1为呑频的除数一TIM_TimeBaseStructure.TIM

3、_ClockDivision=0 x0;/TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;/向上计数一一一一TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);/*比较通道1*/TIM_0CInitStructure.TIM_0CMode=TIM_OCMode_Inactive;/输出比较非主动模式TIM_0CInitStructure.TIM_Pulse=CCRl_Val;TIM_0CInitStructure.TIM_0CPolarity=TIM_OCPolarity_High;/极性

4、为正TIM_0ClInit(TIM2,&TIM_OCInitStructure);TIM_OClPreloadConfig(TIM2,TIM_OCPreload_Disable);/禁止0C1重装就,其实可以省掉这句,因为默认是4路都不量装的./*比较通道2*/TIM_OCInitStructure.TIM_Pulse=CCR2_Val;TIM_0C2Init(TIM2,&TIM_OCInitStructure);TIM_0C2PreloadConfig(TIM2,TIM_OCPreload_Disable);/*比较通道3*/TIM_OCInitStructure.TIM_Pulse=CCR

5、3_Val;TIM_OC3Init(TIM2,&TIM_OCInitStructure);TIM_0C3PreloadConfig(TIM2,TIM_OCPreload_Disable);/*比较通道4*/TIM_OCInitStructure.TIM_Pulse=CCR4_Val;TIM_0C4Init(TIM2,&TIM_OCInitStructure);TIM_0C4PreloadConfig(TIM2,TIM_OCPreload_Disable);/*使能预装载*/TIM_ARRPreloadConfig(TIM2,ENABLE);/*衣先清除所有中断位*/TIM_ClearITPen

6、dingBit(TIM2,TIM_IT_CC1TIM_IT_CC2|TIM_IT_CC3|TIM_IT_CC4|TIM_IT_Update);/*4个通道和溢皿都配置中断*/TIM_ITConfig(TIM2,TIM_IT_CC1TIM_IT_CC2|TIM_IT_CC3|TIM_IT_CC4|TIM_IT_Update,ENABLE);/*允许TIM2开始计数*/TIM_Cmd(TIM2,ENABLE);voidTIM3_Configuration(ul6p,ul6psc)_RCC-APB1ENR|=11;/TIM3时钟使能自动装载寄存器TIM3-ARR二p;设定定时器自动重装值/PSC预分

7、频寄存器TIM3-PSC二psc;/设定定时器的分频系数TIM3-DIER|=1O;/允许更新中断TIM3-DIER|=16;/允许触发中断TIM3-CR1|=OXO1;/使能定时器3(这里面包括计数方向为向上计数)ttif0voidTIM4_Configuration(void)_TIM_TimeBaseInitTypeDefTIM_TimeBaseStrueture;TIM_OCInitTypeDefTIM_OCInitStructure;/*TIM4clockenable*/RCC_APBlPeriphClockCmd(RCC_APBlPeriph_TIM4,ENABLE);/*基础设置

8、*/TIM_TimeBaseStructure.TIM_Period=10000;/计满值TIM_TimeBaseStructure.TIM_Prescaler=7200-1:/预分频,此值+1为八频的除数一TIM_TimeBaseStructure.TIM_ClockDivision=0 x0;/TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;/向上计数TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);/*使能预装载*/TIM_ARRPreloadConfig(TIM4,ENABLE)

9、;/*应先清除所有中断位*/TIM_ClearITPendingBit(TIM4,TIM_IT_Update);TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE):/*允许TIM2开始计数*/TIM_Cmd(TIM4,ENABLE);#elsevoidTIM_Configuration(ul6p,ul6psc)_RCC-APB1ENR|=12;/TIM4时钟使能自动装载寄存器TIM4-ARR二p;/设定定时器自动重装值/PSC预分频寄存器TIM4-PSC二psc;/设定定时器的分频系数TIM4-DIER|=l0;/允许更新中断TIM4-DIER|=16;/允许触发中

10、断TIM4-CR11=0X01;/使能定时器3(这里面包括计数方向为向上计数)ttendif上程序中,定时器2被配置成多路捕获模式,定时器3是直接操作寄存器进行配置的。定时器4用了两种配置方式,使用固件库和直接操作寄存器。可以切换。效果一样。需要注意的是,stm32103RBT6的通用定时器只有2、3、4.(没有5)2、stm32f10 x_it.c文件丄丄丄卜FunctionNameDescriptionInputOutputReturn:TIM2_IRQHandlerTIM2中断:ThisfunctionhandlesTIM2globalinterruptrequest:None:None

11、:None丄丄丄丄丄丄丄丄卜丄丄*丄丄“丄丄kL丄unsignedintcnt=O;unsignedintflag=O;voidTIM2_IRQHandler(void)if(TIM_GetITStatus(TIM2,TIM_IT_CC1)!=RESET)/*必须清空标志位*/TIM_ClearITPendingBit(TIM2,TIM_IT_CC1);/可添加功能块elseif(TIM_GetITStatus(TIM2,TIM_IT_CC2)!=RESET)TIM_ClearITPendingBit(TIM2,TIM_IT_CC2);/可添加功能块elseif(TIM_GetITStatus

12、(TIM2,TIM_IT_CC3)!=RESET)TIM_ClearITPendingBit(TIM2,TIM_IT_CC3);/可添加功能块elseif(TIM_GetITStatus(TIM2,TIM_IT_CC4)!=RESET)TIM_ClearITPendingBit(TIM2,TIM_IT_CC4);/可添加功能块if(TIM_GetITStatus(TIM2,TIM_IUpdate)!二RESET)TIM_ClearITPendingBit(TIM2,TIMIT.Update);/flag二1;/计时满标志位置位/vwx丄卜丄卜丄丄丄/cnt+;/每TIM.Period计时满变量

13、加一%!xkL%!x丄卜XTXTXTFunctionNameDescriptionInputOutputReturn:TIM3_IRQHandler:ThisfunctionhandlesTIM3globalinterruptrequest:None:None:NoneI%!x“%fx丄卜丄“丄“丄卜丄%fx?x”丄”丄“”“”“丄“%fxkL%!xXTvoidTIM3_IRQHandler(void)_if(TIM3-SR&0X0001)cnt+;flag=l;TIM3-SR&=(1O);%!x%!x丄卜XTXTXTFunctionNameDescriptionInputOutputRetu

14、rn:TIM4_IRQHandler:ThisfunctionhandlesTIM4globalinterruptrequest:None:None:None%!xa#“%fx%!x丄卜丄“丄卜丄*?”丄”丄“?x?x”a#“”“丄“%fxkL%!xXTvoidTIM4_IRQHandler(void)_if(TIM_GetITStatus(TIM4,TIM_IT_Update)!=RESET)TINLClearlTPendingBit(TIM4,TIM_IT_Update);cnt+;flag=l;可以看到,定时器2有多个处理的事件,四个通道的计数溢出和定时器的总溢出。具体事件根据应用來配置

15、。另外,以上代码只是对三个通用定时器进行测试,具体应用根据情况来定。3、NVIC.c文件ttinclude,STM32Libstm32f10 x.h/设置所有的中断允许voidMVIC_Configuration(void)_NVIC_InitTypeDefNVIC_InitStructure;/*Timer2中断*/MVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;MVIC_InitStructure.NVIC_IRQChannelPreemptionPrio

16、rity=4:NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE:NVIC_Init(&NIC_InitStructure);ttif1/*Configureonebitforpreemptionpriority*/*Timer3中断*/NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;MVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;NVIC_InitStruc

17、ture.NVIC_IRQChannelSubPriority=0;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE:NVIC_Init(&NIC_InitStructure);/*Timer4中断*/NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn;MVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;NVIC_InitStructure.NVIC_IRQChan

18、nelCmd=ENABLE:NVIC_Init(&NIC_InitStructure);ttendif/*UART1*/NVIC_InitStructure.NVIC_IRQChannel=USARTl_IRQn;MVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE:NVIC_Init(&NIC_InitStructure);4、main,c文件ttinc

19、lude,STM32Libstm32flOx.httincludehal.httincludestdio.httincludestring,hexternunsignedintent;externunsignedintflag;intfputc(intch,FILE*f)/USART_SendData(USART1,(u8)ch);USART1-DR=(u8)ch;/*Loopuntiltheendoftransmission*/while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)=RESET)returnch;intmain(void)CanTxM

20、sgmsg;msg.StdId=0 xll;msg.DLC=8;msg.IDE=CAN_ID_STD;msg.RTR二CAN_RTR_DATA;memset(msg.Data,Oxll,8);ChipHallnitO;/片内硬件初始化ChipOutHallnit();/片外硬件初始化for(;)can_send(&msg);if(flag)flag=0;printf(entis%dn,ent);本程序使用了串口、定时器,通过串口将当前计数值发给PC。同时通过can总线对外发送数据另外使用了printf,程序中有相应的配置。5、can.c文件ttinclude,STM32Libstm32f10

21、x.httincludehal.httincludestring.h/CAN总线的发送接收管脚的初始化voidCAN_Configuration(void)_GPIO_InitTypeDefGPIO_InitStructure;/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPI0ARCC_APB2Periph_AFIO,ENABLE);/RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFI0,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPI0A,ENABLE);RCC_APB2Pe

22、riphClockCmd(RCC_APB2Periph_GPI0A,ENABLE);/*PA11-CANRX*/GPIOInitStructure.GPIOPin=GPIOPin11;GPIO_InitStructure.GPIO_Speed二GPI0_Speed_50MHz;GPIOInitStructure.GPIOMode二GPIOModeIPU;GPI0_Init(GPIOA,&GPIO_InitStructure);APA12-CANTX*/GPIOInitStructure.GPIOPin二GPIOPin12;GPIO_InitStructure.GPIO_Speed二GPI0_S

23、peed_50MHz;GPIO_InitStructure.GPIO_Mode二GPIO_Mode_AF_PP;GPI0_Init(GPIOA,&GPIO_InitStructure);RCC_APBlPeriphClockCmd(RCC_APBlPeriph_CANl,ENABLE);/RCC_APBlPeriphClockCmd(RCC_APBlPeriph_CANl,ENABLE);/vw卜丄丄丄丄丄丄卜*CAN中断测试卜丄丄.卜丄卜丄卜卜丄“卜丄“卜丄卜;丄卜卜卜丄“卜丄“丄voidCAN_Interrupt(void)CAN_InitTypeDefCAN_InitStrueture;

24、CAN_FilterInitTypeDefCAN_FilterlnitStrueture;/CanTxMsgTxMessage:/*CANregisterinit*/CAN_DeInit(CANl);CAN_Struetlnit(&CAN_InitStructure);/*CANcellinit*/*CANcellinit*/CAN_InitStructure.CAN_TTCM=DISABLE;CAN_InitStructure.CAN_ABOM=DISABLE;CAN_InitStructure.CAN_AWDI=DISABLE;CAN_InitStructure.CAN_NART=DISA

25、BLE;DISABLE:重传CAN_InitStructure.CAN_RFLM=DISABLE;CAN_InitStructure.CAN_TXFP=DISABLE;/时间触发/自动离线管理自动唤醒/ENABLE:错误不自动重传CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;/CAN_Mode_LoopBack,CAN_Mode_Norma1CAN_InitStructure.CAN_SJW二CAN_SJW_ltq;CAN_InitStructure.CAN_BS1二CAN_BSl_5tq;CAN_InitStructure.CAN_BS2二CAN_BS

26、2_3tq;CAN_InitStructureCAN_Prescaler二4;36/(4*(1+5+3)二1000k/1-4/1-16/1-8/波特率为CAN_Init(CAN1,&CAN_InitStructure);/*CAN过滤器设置*/CANFilterlnitStructureCAN_FilterNumber二0;CANFilterlnitStructure.CAN_Fi11erMode=CAN_FliterMode_IdMask;CANFilterlnitStructure.CANFilterScale=CANFilterScale32bit;CAN_FilterInitStruc

27、ture.CAN_FiIterIdHigh二0 x0000;CAN_FilterInitStructure.CAN_FilterIdLow二0 x0000;CAN_FilterInitStructure.CAN_Fi11erMaskldHigh=0 x0000;CAN_FilterInitStructure.CAN_Fi11erMaskldLow=0 x0000:CANFilterlnitStructure.CAN_FilterFIFOAssignment=CAN_FIFOO;CANFilterlnitStructureCAN_FilterActivation二ENABLE;CAN_Filte

28、rInit(&CAN_FilterInitStrueture);/*允许FMPO中断*/CAN_ITConfig(CANl,CAN_IT_FMPO,ENABLE);/*typedefstructuint32_tStdid;uint32_tExtld;uint8_tIDE;uint8_tRTR;uint8_tDLC;uint8_tDataE8:CanTxMsg;*/发送一个2字节的数据voidSendCan(ul6dat)CanTxMsgTxMessage;TxMessageExtld二0 x01;TxMessage.IDE=CAN_ID_EXT;TxMessage.RTR二CAN_RTR_DA

29、TA;TxMessageDLC二2;TxMessageData0=dat&Oxff;TxMessageDatal=dat8;CAN_Transmit(CAN1,&TxMessage);_ttif1intcan_send(CanTxMsg*pTransmitBuf)_u8TransmitMailbox二0;CanTxMsgTxMessage;if(pTransmitBuf-DLC8)return1;/*transmit*/TxMessage.Stdld二pTransmitBuf-StdId;/用來设定标准标识符(0-0 x7ff,11位)/TxMessageExtlpTransmitBuf-Ex

30、tld;TxMessage.RTR=pTransmitBuf-RTR;/设置RTR位为数据帧TxMessage.IDE=pTransmitBuf-IDE;标识符扩展位,为标准帧TxMessage.DLC=pTransmitBuf-DLC;/设置数据长度根据DLC字段的值,将有效数据拷贝到发送数据寄存器memcpy(TxMessage.Data,pTransmitBuf-Data,pTransmitBuf-DLC);TransmitMailbox二CAN_Transmit(CAN1,&TxMessage);TransmitMailbox=TransmitMailbox;/加上这句话就是防止编译器产生警吿:return1;ttendif在调用can_send(CanTxMsg*pTransmitBuf)发送数据之前,要对can总线进行相应的(5頂。6、hal.c文件:卜丄*丄卜丄丄卜丄丄丄丄

温馨提示

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

评论

0/150

提交评论