新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > STM32学习笔记——利用通用定时器TIM2进行精确延时

STM32学习笔记——利用通用定时器TIM2进行精确延时

作者:时间:2016-11-28来源:网络收藏

TIM_IT值

TIM_FLAG

描述

TIME_FLAG_Update

TIM中断源

……

……

例:

[cpp]view plaincopy
  1. TIM_ITConfig(TIM2,TIME_FLAG_Update,ENABLE);

2.5函数TIM_Cmd

函数名

TIM_Cmd

函数原型

voidTIM_Cmd(TIM_TypeDef*TIMx,FunctionalStateNewState)

功能描述

使能或者失能TIMx外设

输入参数1

TIMx:x可以是2,3或者4,来选择TIM外设

输入参数2

NewState:TIMx中断的新状态

这个参数可以取:ENABLE或者DISABLE

例:

[cpp]view plaincopy
  1. TIM_Cmd(TIM2,ENABLE);

3例程程序

本例程主要使用TIM2进行精准延时并亮灭LED灯,其中NVIC部分暂做了解,后面再继续深入。另外,需要注意3.0以后版本的固件库相比2.0版有所更改,如删除旧版NVIC部分函数,或移动至misc.c文件中,通道名TIM2_IRQChannel更改为TIM2_IRQn等。完整构架:

完整代码:

[cpp]view plaincopy
  1. #include"stm32f10x.h"
  2. voiddelay1ms(u32nTimer);
  3. voidGPIO_Configuration(void);
  4. voidTIM2_IRQHandler(void);
  5. voidTimer2_Configuration(void);
  6. voidNVIC_Configuration(void);
[cpp]view plaincopy
  1. intmain(void)
  2. {
  3. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//使能GPIOC时钟
  4. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//使能TIM2时钟
  5. GPIO_Configuration();
  6. NVIC_Configuration();//配置中断
  7. Timer2_Configuration();//配置定时器
  8. while(1)
  9. {
  10. GPIO_ResetBits(GPIOC,GPIO_Pin_7|GPIO_Pin_6);
  11. GPIO_SetBits(GPIOC,GPIO_Pin_9|GPIO_Pin_8);
  12. delay1ms(1000);
  13. GPIO_ResetBits(GPIOC,GPIO_Pin_9|GPIO_Pin_8);
  14. GPIO_SetBits(GPIOC,GPIO_Pin_7|GPIO_Pin_6);
  15. delay1ms(1000);
  16. GPIO_Write(GPIOC,0x0140);
  17. delay1ms(2000);
  18. GPIO_Write(GPIOC,0x0280);
  19. delay1ms(2000);
  20. }
  21. }
  22. voidGPIO_Configuration(void)
  23. {
  24. GPIO_InitTypeDefGPIO_InitStructure;
  25. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
  26. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  27. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
  28. GPIO_Init(GPIOC,&GPIO_InitStructure);
  29. }
  30. voidTimer2_Configuration(void)
  31. {
  32. TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
  33. TIM_DeInit(TIM2);//使用缺省值初始化TIM外设寄存器
  34. TIM_TimeBaseStructure.TIM_Period=1;//自动重装载寄存器值为1
  35. TIM_TimeBaseStructure.TIM_Prescaler=(36000-1);//时钟预分频数为36000
  36. TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//采样分频倍数1,未明该语句作用。
  37. TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//上升模式
  38. TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
  39. TIM_ClearFlag(TIM2,TIM_FLAG_Update);//清除更新标志位
  40. TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//使能中断
  41. TIM_Cmd(TIM2,ENABLE);//使能TIM2定时器
  42. }
  43. voidNVIC_Configuration(void)
  44. {
  45. NVIC_InitTypeDefNVIC_InitStructure;
  46. NVIC_SetPriorityGrouping(NVIC_PriorityGroup_0);
  47. NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;//3.0版以后的函数库将各通道TIM2_IRQChanel改名TIM2_IRQn
  48. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
  49. NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
  50. NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  51. NVIC_Init(&NVIC_InitStructure);//NVIC_Init函数被包含在misc.c文件中。
  52. }
  53. volatileu32gTimer;
  54. voidTIM2_IRQHandler(void)
  55. {
  56. if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)//检查溢出信号
  57. {
  58. TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除溢出标志
  59. gTimer--;
  60. }
  61. }
  62. voiddelay1ms(u32nTimer)
  63. {
  64. gTimer=nTimer;
  65. while(gTimer);
  66. }

完成编译并烧录后,开发板上四个LED灯先相邻两两亮灭,亮灭时间延迟1秒,然后交替两两亮灭,亮灭时间延迟2秒。

参考文献

[1]Sharkdo.STM32用定时器精确延时的方法[EB/OL].http://www.cnblogs.com/sharkdo/archive/2011/03/23/1993036.html,2011-03-23/2012-10-14

[2]Cdzlllfe.stm32 通用定时器精确延时程序[EB/OL].

http://blog.sina.com.cn/s/blog_88534dff01010t1a.html,2011-12-17/2012-10-14

[3]福州芯达工作室.《STM32入门系列教程——定时器与蜂鸣器》[EB/OL].http://ishare.iask.sina.com.cn/f/10918196.html,2010-10-20/2012-10-14.

[4]正点电子.《Stm32不完全手册》[EB/OL].http://www.amobbs.com/forum.php?mod=viewthread&tid=4517523,2011-01-17/2012-10-15

[5]半壶水,《STM32菜鸟学习手册-罗嗦版》,http://wenku.baidu.com/view/fc7c7d20ccbff121dd3683da.html,2012-08-19.

[6]ST.《如何从STM32F10xxx固件库V2.0.3升级为STM32F10xxx标准外设库V3.0.0》[EB/OL].http://ishare.iask.sina.com.cn/f/18297257.html?from=like,2011-08-22/2012-09-09.


上一页 1 2 3 下一页

评论


技术专区

关闭