TIM.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. #include "main.h"
  2. static void TIM1_Init(uint16_t arr, uint16_t psc);
  3. static void TIM2_Init(uint16_t arr, uint16_t psc);
  4. static void TIM3_Init(uint16_t arr, uint16_t psc);
  5. static void Overtime_Handle(uint16_t *counter, uint8_t *overTime_flag, uint16_t overTime, void (* callback)(void));
  6. TIMClassStruct TIMClass = {
  7. .TIM1_Init = TIM1_Init,
  8. .TIM2_Init = TIM2_Init,
  9. .TIM3_Init = TIM3_Init,
  10. .Overtime_Handle = Overtime_Handle
  11. };
  12. //#define use_TIM1
  13. #define use_TIM2
  14. #define use_TIM3
  15. /* 在别的地方复现此函数 TIM1中断函数
  16. void TIM1_UP_IRQHandler(void)
  17. {
  18. if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)
  19. {
  20. TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update);
  21. }
  22. }
  23. */
  24. /* 在别的地方复现此函数 TIM2中断函数
  25. void TIM2_IRQHandler(void)
  26. {
  27. if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
  28. {
  29. TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update);
  30. }
  31. }
  32. */
  33. /* 在别的地方复现此函数 TIM3中断函数
  34. void TIM3_IRQHandler(void)
  35. {
  36. if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
  37. {
  38. TIM_ClearITPendingBit(TIM3, TIM_FLAG_Update);
  39. }
  40. }
  41. */
  42. /**
  43. * @brief TIM1初始化
  44. * @param None
  45. * @retval None
  46. */
  47. static void TIM1_Init(uint16_t arr, uint16_t psc)
  48. {
  49. #ifdef use_TIM1
  50. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  51. NVIC_InitTypeDef NVIC_InitStructure;
  52. // 设置中断组
  53. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  54. // 设置中断来源
  55. NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
  56. // 设置主优先级为 0
  57. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  58. // 设置抢占优先级为3
  59. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  60. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  61. NVIC_Init(&NVIC_InitStructure);
  62. RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
  63. // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
  64. TIM_TimeBaseStructure.TIM_Period = arr;
  65. // 时钟预分频数
  66. TIM_TimeBaseStructure.TIM_Prescaler = psc;
  67. // 时钟分频因子 ,没用到不用管
  68. TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  69. // 计数器计数模式,设置为向上计数
  70. TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
  71. // 重复计数器的值,没用到不用管
  72. TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
  73. // 初始化定时器
  74. TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
  75. // 清除计数器中断标志位
  76. TIM_ClearFlag(TIM1, TIM_FLAG_Update);
  77. // 开启计数器中断
  78. TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);
  79. // 使能计数器
  80. TIM_Cmd(TIM1, ENABLE);
  81. #endif
  82. }
  83. /**
  84. * @brief TIM2初始化
  85. * @param None
  86. * @retval None
  87. */
  88. void TIM2_Init(uint16_t arr, uint16_t psc)
  89. {
  90. #ifdef use_TIM2
  91. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  92. NVIC_InitTypeDef NVIC_InitStructure;
  93. // 设置中断组
  94. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  95. // 设置中断来源
  96. NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
  97. // 设置主优先级为 0
  98. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  99. // 设置抢占优先级为3
  100. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  101. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  102. NVIC_Init(&NVIC_InitStructure);
  103. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  104. // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
  105. TIM_TimeBaseStructure.TIM_Period = arr;
  106. // 时钟预分频数
  107. TIM_TimeBaseStructure.TIM_Prescaler= psc;
  108. // 时钟分频因子 ,没用到不用管
  109. TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  110. // 计数器计数模式,设置为向上计数
  111. TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
  112. // 重复计数器的值,没用到不用管
  113. TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
  114. // 初始化定时器
  115. TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  116. // 清除计数器中断标志位
  117. TIM_ClearFlag(TIM2, TIM_FLAG_Update);
  118. // 开启计数器中断
  119. TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
  120. // 使能计数器
  121. TIM_Cmd(TIM2, ENABLE);
  122. #endif
  123. }
  124. /**
  125. * @brief TIM3初始化
  126. * @param None
  127. * @retval None
  128. */
  129. void TIM3_Init(uint16_t arr, uint16_t psc)
  130. {
  131. #ifdef use_TIM3
  132. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  133. NVIC_InitTypeDef NVIC_InitStructure;
  134. // 设置中断组
  135. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  136. // 设置中断来源
  137. NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  138. // 设置主优先级为 0
  139. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
  140. // 设置抢占优先级为3
  141. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  142. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  143. NVIC_Init(&NVIC_InitStructure);
  144. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  145. // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
  146. TIM_TimeBaseStructure.TIM_Period = arr;
  147. // 时钟预分频数
  148. TIM_TimeBaseStructure.TIM_Prescaler = psc;
  149. // 时钟分频因子 ,没用到不用管
  150. TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  151. // 计数器计数模式,设置为向上计数
  152. TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
  153. // 重复计数器的值,没用到不用管
  154. TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
  155. // 初始化定时器
  156. TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  157. // 清除计数器中断标志位
  158. TIM_ClearFlag(TIM3, TIM_FLAG_Update);
  159. // 开启计数器中断
  160. TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
  161. // 使能计数器
  162. TIM_Cmd(TIM3, ENABLE);
  163. #endif
  164. }
  165. /**
  166. * @brief 定时器非堵塞延时处理函数
  167. * @param counter: 对应计数器地址
  168. * @param overTime_flag: 对应超时标志地址
  169. * @param overTime: 超时时间
  170. * @param callback: 超时结束的回调函数
  171. * @retval None
  172. * @note None
  173. */
  174. static void Overtime_Handle(uint16_t *counter, uint8_t *overTime_flag, uint16_t overTime, void (* callback)(void))
  175. {
  176. if(*overTime_flag)
  177. {
  178. *counter = *counter + 1;
  179. if((*counter >= overTime))
  180. {
  181. *overTime_flag = 0;
  182. *counter = 0;
  183. callback();
  184. }
  185. }
  186. }