timer.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. /**
  2. ******************************** STM32F10x *********************************
  3. * @文件名 : timer.c
  4. * @作者 : sun
  5. * @库版本 : V3.5.0
  6. * @文件版本 : V1.0.0
  7. * @日期 : 2016年05月09日
  8. * @摘要 : 定时器源文件
  9. ******************************************************************************/
  10. /*----------------------------------------------------------------------------
  11. 更新日志:
  12. 2016-05-09 V1.0.0:初始版本
  13. ----------------------------------------------------------------------------*/
  14. /* 包含的头文件 --------------------------------------------------------------*/
  15. #include "timer.h"
  16. #include "led.h"
  17. int TimeCount,TimeFlag;
  18. void Tim3_init(int Period, int Prescaler)
  19. {
  20. TIM_TimeBaseInitTypeDef TimeBaseInitValue;
  21. NVIC_InitTypeDef NVIC_InitValue;
  22. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  23. /*
  24. 时钟计算:
  25. TIM2在APB1总线,APB1总线的时钟是72M/4=18MHz
  26. 定时器的时钟是总线时钟的2倍(参考代码得知)
  27. 定时器计数时钟=36M/3600=10000hz
  28. 计数是10000,则定时时间为1s
  29. */
  30. TimeBaseInitValue.TIM_ClockDivision = TIM_CKD_DIV1;
  31. TimeBaseInitValue.TIM_CounterMode = TIM_CounterMode_Up;
  32. TimeBaseInitValue.TIM_Period = Period; //计数
  33. TimeBaseInitValue.TIM_Prescaler = Prescaler; //分频系数
  34. TIM_TimeBaseInit(TIM3, &TimeBaseInitValue);
  35. TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
  36. NVIC_InitValue.NVIC_IRQChannel = TIM3_IRQn;
  37. NVIC_InitValue.NVIC_IRQChannelCmd = ENABLE;
  38. NVIC_InitValue.NVIC_IRQChannelPreemptionPriority = 1;
  39. NVIC_InitValue.NVIC_IRQChannelSubPriority = 1;
  40. NVIC_Init(&NVIC_InitValue);
  41. TIM_Cmd(TIM3, ENABLE);
  42. }
  43. void TIM3_IRQHandler(void)
  44. {
  45. static int count = 0;
  46. if (TIM_GetITStatus(TIM3, TIM_IT_Update) == SET) {
  47. count++;
  48. if(count >= 2)
  49. {
  50. count = 0;
  51. LED_RUN = !LED_RUN;
  52. }
  53. // IWDG_Feed();
  54. TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
  55. }
  56. }
  57. /************************************************
  58. 函数名称 : TIMER_Initializes
  59. 功 能 : TIMER初始化
  60. 参 数 : 无
  61. 返 回 值 : 无
  62. 作 者 : sun
  63. *************************************************/
  64. void TIMER_Initializes(void)
  65. {
  66. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  67. /* TIM4时基单元配置 */
  68. TIM_TimeBaseStructure.TIM_Prescaler = TIM4_PRESCALER_VALUE; //预分频值
  69. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
  70. TIM_TimeBaseStructure.TIM_Period = TIM4_PERIOD_TIMING; //定时周期(自动从装载寄存器ARR的值)
  71. TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分频因子
  72. TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
  73. /* 使能预分频值 */
  74. TIM_ARRPreloadConfig(TIM4, ENABLE); //使能重载值TIM4_PRESCALER_VALUE
  75. }
  76. /************************************************
  77. 函数名称 : TIMDelay_N10us
  78. 功 能 : 定时器延时N个10us
  79. 参 数 : Times --- N值
  80. 返 回 值 : 无
  81. 作 者 : sun
  82. *************************************************/
  83. void TIMDelay_N10us(uint16_t Times)
  84. {
  85. TIM4->CR1 |= TIM_CR1_CEN; //启动定时器
  86. while(Times--)
  87. {
  88. while((TIM4->SR & TIM_FLAG_Update) == RESET);
  89. TIM4->SR &= ~TIM_FLAG_Update; //清除标志
  90. }
  91. TIM4->CR1 &= ~TIM_CR1_CEN; //关闭定时器
  92. }
  93. /************************************************
  94. 函数名称 : TIMDelay_Nms
  95. 功 能 : 定时器延时Nms
  96. 参 数 : Times --- N值
  97. 返 回 值 : 无
  98. 作 者 : sun
  99. *************************************************/
  100. void TIMDelay_Nms(uint16_t Times)
  101. {
  102. while(Times--)
  103. {
  104. TIMDelay_N10us(10);
  105. }
  106. }
  107. /**** Copyright (C)2016 sun. All Rights Reserved **** END OF FILE ****/