123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251 |
- #include "myInputCapture.h"
- #include "board.h"
- #include "stm32f10x.h"
- #include "stm32f10x_adc.h"
- #include "stm32f10x_tim.h"
- #include "stm32f10x_it.h"
- uint16_t captureStartValue = 0, captureEndValue = 0;
- uint16_t CaptureNumber = 0;
- uint32_t Capture = 0;
- uint32_t capturePLuseFrq = 0;
- CaptureCallback inputCaptureCb;
- irqCallback_ts irqCallback_tim2ch2;
- irqCallback_ts irqCallback_tim2ch3;
- irqCallback_ts irqCallback_tim3ch4;
- void tim2ch2_callback(uint8_t status, uint32_t param)
- {
- if(CaptureNumber == 0)
- {
- /* Get the Input Capture value */
- captureStartValue = TIM_GetCapture2(TIM2);
- CaptureNumber = 1;
- }
- else if(CaptureNumber == 1)
- {
- /* Get the Input Capture value */
- captureEndValue = TIM_GetCapture2(TIM2);
-
- /* Capture computation */
- if (captureEndValue > captureStartValue)
- {
- Capture = (captureEndValue - captureStartValue);
- }
- else
- {
- Capture = ((0xFFFF - captureStartValue) + captureEndValue);
- }
- /* Frequency computation */
- capturePLuseFrq = (uint32_t) SystemCoreClock / Capture;
- CaptureNumber = 0;
- inputCaptureCb(captureStartValue, captureEndValue, capturePLuseFrq);
- }
- }
- /**
- * @brief tim2的通道2捕捉功能初始化
- * 定时器的分频数为@TIM_ICPSC_DIV1时,捕捉的最小频率的脉冲为1098Hz
- *
- * @param cb 将捕捉的数据反馈回应用层
- */
- void myInputCaptureTIM2_CH2_init(CaptureCallback cb)
- {
- NVIC_InitTypeDef NVIC_InitStructure;
- TIM_ICInitTypeDef TIM_ICInitStructure;
- irqCallback_tim2ch2.thisCb = tim2ch2_callback;
- TIM2CC2_callbackRegiste(&irqCallback_tim2ch2);
- /* TIM2 clock enable */
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
- /* Enable the TIM3 global Interrupt */
- NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
- TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
- TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
- TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
- TIM_ICInitStructure.TIM_ICFilter = 0x0;
- TIM_ICInit(TIM2, &TIM_ICInitStructure);
-
- /* TIM enable counter */
- TIM_Cmd(TIM2, ENABLE);
- /* Enable the CC2 Interrupt Request */
- TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE);
- inputCaptureCb = cb;
- }
- /**
- * @brief tim2的通道3中断函数
- *
- *
- * @param status
- * @param param
- */
- void tim2ch3_callback(uint8_t status, uint32_t param)
- {
- if(CaptureNumber == 0)
- {
- /* Get the Input Capture value */
- captureStartValue = TIM_GetCapture3(TIM2);
- CaptureNumber = 1;
- }
- else if(CaptureNumber == 1)
- {
- /* Get the Input Capture value */
- captureEndValue = TIM_GetCapture3(TIM2);
-
- /* Capture computation */
- if (captureEndValue > captureStartValue)
- {
- Capture = (captureEndValue - captureStartValue);
- }
- else
- {
- Capture = ((0xFFFF - captureStartValue) + captureEndValue);
- }
- /* Frequency computation */
- capturePLuseFrq = (uint32_t) SystemCoreClock / Capture;
- CaptureNumber = 0;
-
- inputCaptureCb(captureStartValue, captureEndValue, capturePLuseFrq);
- }
- }
- /**
- * @brief 初始化定时器2的通道3的输入脉冲捕捉功能
- * 定时器的分频数为@TIM_ICPSC_DIV1时,捕捉的最小频率的脉冲为1098Hz
- * 映射到PA2脚,对应转接板的BOARD_GPIO_SPI_GPIOD
- * 捕捉两个边沿之间的频率
- * @param cb 将捕捉的数据反馈回应用层
- */
- void myInputCaptureTIM2_CH3_init(CaptureCallback cb)
- {
- NVIC_InitTypeDef NVIC_InitStructure;
- TIM_ICInitTypeDef TIM_ICInitStructure;
- GPIO_InitTypeDef GPIO_InitStructure;
- irqCallback_tim2ch3.thisCb = tim2ch3_callback;
- TIM2CC3_callbackRegiste(&irqCallback_tim2ch3);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; //
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
- GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化
- /* TIM2 clock enable */
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
- /* Enable the TIM3 global Interrupt */
- NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;
- TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
- TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
- TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
- TIM_ICInitStructure.TIM_ICFilter = 0x0;
- TIM_ICInit(TIM2, &TIM_ICInitStructure);
-
- /* TIM enable counter */
- TIM_Cmd(TIM2, ENABLE);
- /* Enable the CC2 Interrupt Request */
- TIM_ITConfig(TIM2, TIM_IT_CC3, ENABLE);
- inputCaptureCb = cb;
- }
- /**
- * @brief tim3的通道4中断函数
- *
- *
- * @param status
- * @param param
- */
- void tim3ch4_callback(uint8_t status, uint32_t param)
- {
- if(CaptureNumber == 0)
- {
- /* Get the Input Capture value */
- captureStartValue = TIM_GetCapture4(TIM3);
- CaptureNumber = 1;
- }
- else if(CaptureNumber == 1)
- {
- /* Get the Input Capture value */
- captureEndValue = TIM_GetCapture4(TIM3);
-
- /* Capture computation */
- if (captureEndValue > captureStartValue)
- {
- Capture = (captureEndValue - captureStartValue);
- }
- else
- {
- Capture = ((0xFFFF - captureStartValue) + captureEndValue);
- }
- /* Frequency computation */
- capturePLuseFrq = (uint32_t) SystemCoreClock / Capture;
- CaptureNumber = 0;
- inputCaptureCb(captureStartValue, captureEndValue, capturePLuseFrq);
- }
- }
- /**
- * @brief 初始化定时器3的通道4的输入脉冲捕捉功能
- * 定时器的分频数为@TIM_ICPSC_DIV1时,捕捉的最小频率的脉冲为1098Hz
- * 映射到PB1脚,对应转接板的BOARD_GPIO_SPI_GPIOC
- * 捕捉两个边沿之间的频率
- * @param cb 将捕捉的数据反馈回应用层
- */
- void myInputCaptureTIM3_CH4_init(CaptureCallback cb)
- {
- NVIC_InitTypeDef NVIC_InitStructure;
- TIM_ICInitTypeDef TIM_ICInitStructure;
- GPIO_InitTypeDef GPIO_InitStructure;
- irqCallback_tim3ch4.thisCb = tim3ch4_callback;
- TIM3CC4_callbackRegiste(&irqCallback_tim3ch4);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; //
- GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
- /* TIM2 clock enable */
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
- /* Enable the TIM3 global Interrupt */
- NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- TIM_ICInitStructure.TIM_Channel = TIM_Channel_4;
- TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
- TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
- TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
- TIM_ICInitStructure.TIM_ICFilter = 0x0;
- TIM_ICInit(TIM3, &TIM_ICInitStructure);
-
- /* TIM enable counter */
- TIM_Cmd(TIM3, ENABLE);
- /* Enable the CC2 Interrupt Request */
- TIM_ITConfig(TIM3, TIM_IT_CC4, ENABLE);
- inputCaptureCb = cb;
- }
|