myInputCapture.c 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. #include "myInputCapture.h"
  2. #include "board.h"
  3. #include "stm32f10x.h"
  4. #include "stm32f10x_adc.h"
  5. #include "stm32f10x_tim.h"
  6. #include "stm32f10x_it.h"
  7. uint16_t captureStartValue = 0, captureEndValue = 0;
  8. uint16_t CaptureNumber = 0;
  9. uint32_t Capture = 0;
  10. uint32_t capturePLuseFrq = 0;
  11. CaptureCallback inputCaptureCb;
  12. irqCallback_ts irqCallback_tim2ch2;
  13. irqCallback_ts irqCallback_tim2ch3;
  14. irqCallback_ts irqCallback_tim3ch4;
  15. void tim2ch2_callback(uint8_t status, uint32_t param)
  16. {
  17. if(CaptureNumber == 0)
  18. {
  19. /* Get the Input Capture value */
  20. captureStartValue = TIM_GetCapture2(TIM2);
  21. CaptureNumber = 1;
  22. }
  23. else if(CaptureNumber == 1)
  24. {
  25. /* Get the Input Capture value */
  26. captureEndValue = TIM_GetCapture2(TIM2);
  27. /* Capture computation */
  28. if (captureEndValue > captureStartValue)
  29. {
  30. Capture = (captureEndValue - captureStartValue);
  31. }
  32. else
  33. {
  34. Capture = ((0xFFFF - captureStartValue) + captureEndValue);
  35. }
  36. /* Frequency computation */
  37. capturePLuseFrq = (uint32_t) SystemCoreClock / Capture;
  38. CaptureNumber = 0;
  39. inputCaptureCb(captureStartValue, captureEndValue, capturePLuseFrq);
  40. }
  41. }
  42. /**
  43. * @brief tim2的通道2捕捉功能初始化
  44. * 定时器的分频数为@TIM_ICPSC_DIV1时,捕捉的最小频率的脉冲为1098Hz
  45. *
  46. * @param cb 将捕捉的数据反馈回应用层
  47. */
  48. void myInputCaptureTIM2_CH2_init(CaptureCallback cb)
  49. {
  50. NVIC_InitTypeDef NVIC_InitStructure;
  51. TIM_ICInitTypeDef TIM_ICInitStructure;
  52. irqCallback_tim2ch2.thisCb = tim2ch2_callback;
  53. TIM2CC2_callbackRegiste(&irqCallback_tim2ch2);
  54. /* TIM2 clock enable */
  55. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  56. /* Enable the TIM3 global Interrupt */
  57. NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
  58. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  59. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  60. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  61. NVIC_Init(&NVIC_InitStructure);
  62. TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
  63. TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
  64. TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  65. TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
  66. TIM_ICInitStructure.TIM_ICFilter = 0x0;
  67. TIM_ICInit(TIM2, &TIM_ICInitStructure);
  68. /* TIM enable counter */
  69. TIM_Cmd(TIM2, ENABLE);
  70. /* Enable the CC2 Interrupt Request */
  71. TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE);
  72. inputCaptureCb = cb;
  73. }
  74. /**
  75. * @brief tim2的通道3中断函数
  76. *
  77. *
  78. * @param status
  79. * @param param
  80. */
  81. void tim2ch3_callback(uint8_t status, uint32_t param)
  82. {
  83. if(CaptureNumber == 0)
  84. {
  85. /* Get the Input Capture value */
  86. captureStartValue = TIM_GetCapture3(TIM2);
  87. CaptureNumber = 1;
  88. }
  89. else if(CaptureNumber == 1)
  90. {
  91. /* Get the Input Capture value */
  92. captureEndValue = TIM_GetCapture3(TIM2);
  93. /* Capture computation */
  94. if (captureEndValue > captureStartValue)
  95. {
  96. Capture = (captureEndValue - captureStartValue);
  97. }
  98. else
  99. {
  100. Capture = ((0xFFFF - captureStartValue) + captureEndValue);
  101. }
  102. /* Frequency computation */
  103. capturePLuseFrq = (uint32_t) SystemCoreClock / Capture;
  104. CaptureNumber = 0;
  105. inputCaptureCb(captureStartValue, captureEndValue, capturePLuseFrq);
  106. }
  107. }
  108. /**
  109. * @brief 初始化定时器2的通道3的输入脉冲捕捉功能
  110. * 定时器的分频数为@TIM_ICPSC_DIV1时,捕捉的最小频率的脉冲为1098Hz
  111. * 映射到PA2脚,对应转接板的BOARD_GPIO_SPI_GPIOD
  112. * 捕捉两个边沿之间的频率
  113. * @param cb 将捕捉的数据反馈回应用层
  114. */
  115. void myInputCaptureTIM2_CH3_init(CaptureCallback cb)
  116. {
  117. NVIC_InitTypeDef NVIC_InitStructure;
  118. TIM_ICInitTypeDef TIM_ICInitStructure;
  119. GPIO_InitTypeDef GPIO_InitStructure;
  120. irqCallback_tim2ch3.thisCb = tim2ch3_callback;
  121. TIM2CC3_callbackRegiste(&irqCallback_tim2ch3);
  122. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  123. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
  124. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; //
  125. GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
  126. GPIO_PinRemapConfig(GPIO_PartialRemap2_TIM2, ENABLE);
  127. /* TIM2 clock enable */
  128. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  129. /* Enable the TIM3 global Interrupt */
  130. NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
  131. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  132. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  133. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  134. NVIC_Init(&NVIC_InitStructure);
  135. TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;
  136. TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
  137. TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  138. TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
  139. TIM_ICInitStructure.TIM_ICFilter = 0x0;
  140. TIM_ICInit(TIM2, &TIM_ICInitStructure);
  141. /* TIM enable counter */
  142. TIM_Cmd(TIM2, ENABLE);
  143. /* Enable the CC2 Interrupt Request */
  144. TIM_ITConfig(TIM2, TIM_IT_CC3, ENABLE);
  145. inputCaptureCb = cb;
  146. }
  147. void myInputCaptureTIM2_CH3_disable(void)
  148. {
  149. TIM_ITConfig(TIM2, TIM_IT_CC3, DISABLE);
  150. }
  151. /**
  152. * @brief tim3的通道4中断函数
  153. *
  154. *
  155. * @param status
  156. * @param param
  157. */
  158. void tim3ch4_callback(uint8_t status, uint32_t param)
  159. {
  160. if(CaptureNumber == 0)
  161. {
  162. /* Get the Input Capture value */
  163. captureStartValue = TIM_GetCapture4(TIM3);
  164. CaptureNumber = 1;
  165. }
  166. else if(CaptureNumber == 1)
  167. {
  168. /* Get the Input Capture value */
  169. captureEndValue = TIM_GetCapture4(TIM3);
  170. /* Capture computation */
  171. if (captureEndValue > captureStartValue)
  172. {
  173. Capture = (captureEndValue - captureStartValue);
  174. }
  175. else
  176. {
  177. Capture = ((0xFFFF - captureStartValue) + captureEndValue);
  178. }
  179. /* Frequency computation */
  180. capturePLuseFrq = (uint32_t) SystemCoreClock / Capture;
  181. CaptureNumber = 0;
  182. inputCaptureCb(captureStartValue, captureEndValue, capturePLuseFrq);
  183. }
  184. }
  185. /**
  186. * @brief 初始化定时器3的通道4的输入脉冲捕捉功能
  187. * 定时器的分频数为@TIM_ICPSC_DIV1时,捕捉的最小频率的脉冲为1098Hz
  188. * 映射到PB1脚,对应转接板的BOARD_GPIO_SPI_GPIOC
  189. * 捕捉两个边沿之间的频率
  190. * @param cb 将捕捉的数据反馈回应用层
  191. */
  192. void myInputCaptureTIM3_CH4_init(CaptureCallback cb)
  193. {
  194. NVIC_InitTypeDef NVIC_InitStructure;
  195. TIM_ICInitTypeDef TIM_ICInitStructure;
  196. GPIO_InitTypeDef GPIO_InitStructure;
  197. irqCallback_tim3ch4.thisCb = tim3ch4_callback;
  198. TIM3CC4_callbackRegiste(&irqCallback_tim3ch4);
  199. // GPIO_InitStructure.GPIO_Pin = BOARD_PIN_SPI_GPIOC;
  200. // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
  201. // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; //
  202. // GPIO_Init(BOARD_PORT_SPI_GPIOC, &GPIO_InitStructure);//初始化
  203. /* TIM2 clock enable */
  204. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  205. /* Enable the TIM3 global Interrupt */
  206. NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  207. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  208. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  209. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  210. NVIC_Init(&NVIC_InitStructure);
  211. TIM_ICInitStructure.TIM_Channel = TIM_Channel_4;
  212. TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
  213. TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  214. TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
  215. TIM_ICInitStructure.TIM_ICFilter = 0x0;
  216. TIM_ICInit(TIM3, &TIM_ICInitStructure);
  217. /* TIM enable counter */
  218. TIM_Cmd(TIM3, ENABLE);
  219. /* Enable the CC2 Interrupt Request */
  220. TIM_ITConfig(TIM3, TIM_IT_CC4, ENABLE);
  221. inputCaptureCb = cb;
  222. }