示例#1
0
void TIM4_IRQHandler(void)
{
  TIM_ClearITPendingBit(TIM4, TIM_IT_CC2); //Zeruj flagê przerwania

  cnt = TIM_GetCapture2(TIM4); //odczytaj wartoæ z rejestru CCR kana³u nr 2


  if (cnt != 0)
  {
	  my_wyp = (TIM_GetCapture1(TIM4) * 100) / cnt; // wype³nienie
	  my_frq = 72000000 / cnt;
  }
  else
  {
	  my_wyp = 0;
	  my_frq = 0;
  }
}
/*******************************************************************************
* Function Name  : TIM2_IRQHandler
* Description    : This function handles TIM2 global interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void TIM2_IRQHandler(void)
{
  u16 capture;
  if(TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET)
  {
    GPIOD->ODR ^= ((u32)1<<7);
    TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
  }

  if(TIM_GetITStatus(TIM2,TIM_IT_CC2) != RESET)
  {
    //GPIOD->ODR ^= ((u32)1<<7);
    TIM_ClearITPendingBit(TIM2,TIM_IT_CC2);
    capture = TIM_GetCapture2(TIM2);
    TIM_SetCounter(TIM2,0);
  }

}
示例#3
0
/**
  * @brief  This function handles TIM1 Break and TIM9 interrupts request.
  * @param  None
  * @retval None
  */
void TIM1_BRK_TIM9_IRQHandler(void)
{
  /* TIM9_CH1 toggling with frequency = 366.2 Hz */
  if (TIM_GetITStatus(TIM9, TIM_IT_CC1) != RESET)
  {
    TIM_ClearITPendingBit(TIM9, TIM_IT_CC1 );
    capture = TIM_GetCapture1(TIM9);
    TIM_SetCompare1(TIM9, capture + CCR1Val );
  }

  /* TIM9_CH2 toggling with frequency = 732.4 Hz */
  if (TIM_GetITStatus(TIM9, TIM_IT_CC2) != RESET)
  {
    TIM_ClearITPendingBit(TIM9, TIM_IT_CC2);
    capture = TIM_GetCapture2(TIM9);
    TIM_SetCompare2(TIM9, capture + CCR2Val);
  }
}
示例#4
0
void TIM2_IRQHandler(void)
{
   u8 j=0;
   colcnt++;
   if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
   {
          TIM_ClearITPendingBit(TIM2, TIM_IT_Update); 
	  }
//	   IC2Value = TIM_GetCapture2(TIM2); 
//	   IC1Value = TIM_GetCapture1(TIM2) ;                        //读取IC2捕获寄存器的值,即为PWM周期的计数值
       
	else if (TIM_GetITStatus(TIM2,TIM_IT_CC2) == SET)
      {
                                               //计算PWM频率。
		 // if(Capflag==0)
		 //  { 
		    IC2Value = TIM_GetCapture2(TIM2);
		 //    Capflag=1;
		 //  } 
         //  else if(Capflag==1)
	   	 //  {  
		   IC1Value = TIM_GetCapture1(TIM2) ;                        //读取IC2捕获寄存器的值,即为PWM周期的计数值
		 //  	  Capflag=0;
		 //  }
     	 
		 DutyCycle = 2000*(IC1Value)/(IC2Value)  ;   
	      if(DutyCycle!=0)
	      CO2sum[99] = DutyCycle;

	      for(j=0;j<99;j++)
          {
	  	    CO2sum[j] =  CO2sum[j+1];
	      }
		 TIM_ClearITPendingBit(TIM2, TIM_IT_CC2); 

	  }


	  Tim2SP() ;


	 
}
示例#5
0
文件: pwm_in.c 项目: xydang/Sender
void TIM2_IRQHandler(void)
{
	uint16_t val =0,i=0;
	for(i=0;i<2;i++){
		if (Channels[i].tim == TIM2 && (TIM_GetITStatus(TIM2, Channels[i].cc) == SET)){
			TIM_ClearITPendingBit(TIM2, Channels[i].cc);
			switch (Channels[i].channel)
			{
				case TIM_Channel_1:
					val = TIM_GetCapture1(TIM2);
					break;
				case TIM_Channel_2:
					val = TIM_GetCapture2(TIM2);
					break;
			}
			if (Inputs[i].state == 0)
				Inputs[i].rise = val;
			else
				Inputs[i].fall = val;
			if (Inputs[i].state == 0) {
				Inputs[i].state = 1;
				TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
				TIM_ICInitStructure.TIM_Channel = Channels[i].channel;
				TIM_ICInit(TIM2, &TIM_ICInitStructure);
			}else{
				if(Inputs[i].fall > Inputs[i].rise ){
					val = (Inputs[i].fall - Inputs[i].rise);
					if(val < 2100 && val>900)
						Inputs[i].capture = val;
				}else{
					val = ((0xffff - Inputs[i].rise) + Inputs[i].fall);
					if(val < 2100 && val>900)
					Inputs[i].capture = val;
				}
				Inputs[i].state = 0;
				TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
				TIM_ICInitStructure.TIM_Channel = Channels[i].channel;
				TIM_ICInit(TIM2, &TIM_ICInitStructure);
			}
		}
	}
}
示例#6
0
文件: Timers.c 项目: BKampers/Cross
void TIM3_IRQHandler(void)
{
    if (TIM_GetITStatus(PULSE_TIMER, TIM_IT_CC2) != RESET)
    {
        int capture = TIM_GetCapture2(PULSE_TIMER);
        TIM_SetCompare3(PULSE_TIMER, (uint16_t) (capture - 1));
        TIM_ClearITPendingBit(PULSE_TIMER, TIM_IT_CC2);
        if (CaptureService != NULL)
        {
            CaptureService(capture);
        }
    }
    if (TIM_GetITStatus(PULSE_TIMER, TIM_IT_CC3) != RESET)
    {
        TIM_ClearITPendingBit(PULSE_TIMER, TIM_IT_CC3);
        if (CaptureOverflowService != NULL)
        {
            CaptureOverflowService();
        }
    }
}
示例#7
0
void TIM4_Tone_Interrupt_Handler(void)
{
	uint16_t capture;

	if (TIM_GetITStatus(TIM4, TIM_IT_CC1) != RESET)
	{
		TIM_ClearITPendingBit(TIM4, TIM_IT_CC1 );
		capture = TIM_GetCapture1(TIM4);
		TIM_SetCompare1(TIM4, capture + PIN_MAP[1].timer_ccr);
		if(PIN_MAP[1].user_property != -1)
		{
			if (PIN_MAP[1].user_property > 0)
			{
				PIN_MAP[1].user_property -= 1;
			}
			else
			{
				noTone(1);
			}
		}
	}

	if (TIM_GetITStatus(TIM4, TIM_IT_CC2) != RESET)
	{
		TIM_ClearITPendingBit(TIM4, TIM_IT_CC2);
		capture = TIM_GetCapture2(TIM4);
		TIM_SetCompare2(TIM4, capture + PIN_MAP[0].timer_ccr);
		if(PIN_MAP[0].user_property != -1)
		{
			if (PIN_MAP[0].user_property > 0)
			{
				PIN_MAP[0].user_property -= 1;
			}
			else
			{
				noTone(0);
			}
		}
	}
}
示例#8
0
/**
  * @brief  This function handles TIM2 global interrupt request.
  * @param  None
  * @retval None
  */
void TIM2_IRQHandler(void)
{
  if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
  {
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);

    /* Pin PC.00 toggling with frequency = 390 Hz */
    GPIO_WriteBit(GPIOC, GPIO_Pin_0, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_0)));
    capture = TIM_GetCapture1(TIM2);
    TIM_SetCompare1(TIM2, capture + CCR1_Val);
  }
  else if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)
  {
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);

    /* Pin PC.01 toggling with frequency = 585 Hz */
    GPIO_WriteBit(GPIOC, GPIO_Pin_1, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_1)));
    capture = TIM_GetCapture2(TIM2);
    TIM_SetCompare2(TIM2, capture + CCR2_Val);
  }
  else if (TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET)
  {
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);

    /* Pin PC.02 toggling with frequency = 1.17 KHz */
    GPIO_WriteBit(GPIOC, GPIO_Pin_2, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_2)));
    capture = TIM_GetCapture3(TIM2);
    TIM_SetCompare3(TIM2, capture + CCR3_Val);
  }
  else
  {
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC4);

    /* Pin PC.03 toggling with frequency = 2.34 KHz */
    GPIO_WriteBit(GPIOC, GPIO_Pin_3, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_3)));
    capture = TIM_GetCapture4(TIM2);
    TIM_SetCompare4(TIM2, capture + CCR4_Val);
  }
}
/**
  * @brief  This function handles TIM3 global interrupt request.
  * @param  None
  * @retval None
  */
void TIM3_IRQHandler(void)
{
  if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);

    /* LED1 toggling with frequency = 73.24 Hz */
    STM_EVAL_LEDToggle(LED1);
	capture = TIM_GetCapture1(TIM3);
    TIM_SetCompare1(TIM3, capture + CCR1_Val);
  }
  else if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);

    /* LED2 toggling with frequency = 109.8 Hz */
    STM_EVAL_LEDToggle(LED2);
    capture = TIM_GetCapture2(TIM3);
    TIM_SetCompare2(TIM3, capture + CCR2_Val);
  }
  else if (TIM_GetITStatus(TIM3, TIM_IT_CC3) != RESET)
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC3);

    /* LED3 toggling with frequency = 219.7 Hz */
    STM_EVAL_LEDToggle(LED3);
    capture = TIM_GetCapture3(TIM3);
    TIM_SetCompare3(TIM3, capture + CCR3_Val);
  }
  else
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC4);

    /* LED4 toggling with frequency = 439.4 Hz */
    STM_EVAL_LEDToggle(LED4);
    capture = TIM_GetCapture4(TIM3);
    TIM_SetCompare4(TIM3, capture + CCR4_Val);
  }
}
示例#10
0
// PWM input handler
void TIM3_IRQHandler(void)
{
    // TIM2 in STM32F3 is a 32 bit timer, to use 16 bit timer, we should change the data type to uint16_t
    timer_val_t diff;
    static timer_val_t now;
    static timer_val_t last = 0;
    static uint32_t  chan = 0;
    if (TIM_GetITStatus(TIM3, TIM_IT_CC2) == SET){
        TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
        last = now;
        now = TIM_GetCapture2(TIM2);
        diff = now - last;  // auto overflow
        if(diff > MAX_PULSE*PRESCALER/SYSFREQ_MHz ){
            chn_count = chan;
            chan = 0;
        }else{
            pwm_intputs[chan % MAX_CHN_CNT] = (uint16_t)(diff*PRESCALER/SYSFREQ_MHz);
            if(chan < MAX_CHN_CNT)
                chan++;
        }
    }
}
//LHL
void LHL_2_execute(uint16_t time) // time = time*0.1 (ms)
{
	static uint16_t ticker = 0;
	if ((uint16_t)(ticker+time)==GetTicker()) 
	{
		ticker = GetTicker();
		
		CCR_now=TIM_GetCapture2(TIM2);
		if (phi_LHL_2>CCR_now)
		{
			CCR_now++;
			if ((SysTicker % k_LHL_2) ==0)
				TIM_SetCompare2(TIM2, CCR_now);
		}
		else if (phi_LHL_2<CCR_now)
		{
			CCR_now--;
			if ((SysTicker % k_LHL_2) ==0)
				TIM_SetCompare2(TIM2, CCR_now);
		}
	}
}
示例#12
0
/*******************************************************************************
* Function Name  : TIM2_IRQHandler
* Description    : This function handles TIM2 global interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void TIM2_IRQHandler(void)
{
  /* Clear TIM2 Capture compare interrupt pending bit */
  TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);

  /* Get the Input Capture value */
  IC2Value = TIM_GetCapture2(TIM2);

  if (IC2Value != 0)
  {
    /* Duty cycle computation */
    DutyCycle = (TIM_GetCapture1(TIM2) * 100) / IC2Value;

    /* Frequency computation */
    Frequency = 72000000 / IC2Value;
  }
  else
  {
    DutyCycle = 0;
    Frequency = 0;
  }
}
void RHL_1_execute(uint16_t time) // time = time*0.1 (ms)
{
	static uint16_t ticker = 0;
	if ((uint16_t)(ticker+time)==GetTicker()) 
	{
		ticker = GetTicker();
		
		CCR_now=TIM_GetCapture2(TIM4);
		if (phi_RHL_1>CCR_now)
		{
			CCR_now++;
			if ((SysTicker % k_RHL_1) ==0)
				TIM_SetCompare2(TIM4, CCR_now);
		}
		else if (phi_RHL_1<CCR_now)
		{
			CCR_now--;
			if ((SysTicker % k_RHL_1) ==0)
				TIM_SetCompare2(TIM4, CCR_now);
		}
	}
}
示例#14
0
static void timCCxHandler(TIM_TypeDef *tim)
{
	uint16_t capture;
	timerConfig_t *timerConfig;

	uint8_t channelIndex = 0;
	for (channelIndex = 0; channelIndex < CC_CHANNELS_PER_TIMER; channelIndex++) {
		uint8_t channel = channels[channelIndex];

		if (channel == TIM_Channel_1 && TIM_GetITStatus(tim, TIM_IT_CC1) == SET) {
			TIM_ClearITPendingBit(tim, TIM_IT_CC1);

			timerConfig = findTimerConfig(tim, TIM_Channel_1);
			capture = TIM_GetCapture1(tim);
		} else if (channel == TIM_Channel_2 && TIM_GetITStatus(tim, TIM_IT_CC2) == SET) {
			TIM_ClearITPendingBit(tim, TIM_IT_CC2);

			timerConfig = findTimerConfig(tim, TIM_Channel_2);
			capture = TIM_GetCapture2(tim);
		} else if (channel == TIM_Channel_3 && TIM_GetITStatus(tim, TIM_IT_CC3) == SET) {
			TIM_ClearITPendingBit(tim, TIM_IT_CC3);

			timerConfig = findTimerConfig(tim, TIM_Channel_3);
			capture = TIM_GetCapture3(tim);
		} else if (channel == TIM_Channel_4 && TIM_GetITStatus(tim, TIM_IT_CC4) == SET) {
			TIM_ClearITPendingBit(tim, TIM_IT_CC4);

			timerConfig = findTimerConfig(tim, TIM_Channel_4);
			capture = TIM_GetCapture4(tim);
		} else {
			continue; // avoid uninitialised variable dereference
		}

		if (!timerConfig->callback) {
			continue;
		}
		timerConfig->callback(timerConfig->reference, capture);
	}
}
示例#15
0
/**
  * @brief  This function handles TIM2 global interrupt request.
  * @param  None
  * @retval None
  */
void TIM2_IRQHandler(void)
{
  if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
  {
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);

    /* Pin PC.06 toggling with frequency = 73.24 Hz */
    GPIO_WriteBit(GPIOC, GPIO_Pin_6, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_6)));
    capture = TIM_GetCapture1(TIM2);
    TIM_SetCompare1(TIM2, capture + CCR1_Val);
  }
  else if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)
  {
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);

    /* Pin PC.07 toggling with frequency = 109.8 Hz */
    GPIO_WriteBit(GPIOC, GPIO_Pin_7, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_7)));
    capture = TIM_GetCapture2(TIM2);
    TIM_SetCompare2(TIM2, capture + CCR2_Val);
  }
  else if (TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET)
  {
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);

    /* Pin PC.08 toggling with frequency = 219.7 Hz */
    GPIO_WriteBit(GPIOC, GPIO_Pin_8, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_8)));
    capture = TIM_GetCapture3(TIM2);
    TIM_SetCompare3(TIM2, capture + CCR3_Val);
  }
  else
  {
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC4);

    /* Pin PC.09 toggling with frequency = 439.4 Hz */
    GPIO_WriteBit(GPIOC, GPIO_Pin_9, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_9)));
    capture = TIM_GetCapture4(TIM2);
    TIM_SetCompare4(TIM2, capture + CCR4_Val);
  }
}
/**
  * @brief  This function handles TIM3 global interrupt request.
  * @param  None
  * @retval None
  */
void TIM3_IRQHandler(void)
{
  if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);

    /* LED4 toggling with frequency = 4.57 Hz */
    STM_EVAL_LEDToggle(LED4);
	capture = TIM_GetCapture1(TIM3);
    TIM_SetCompare1(TIM3, capture + CCR1_Val);
  }
  else if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);

    /* LED3 toggling with frequency = 9.15 Hz */
    STM_EVAL_LEDToggle(LED3);
    capture = TIM_GetCapture2(TIM3);
    TIM_SetCompare2(TIM3, capture + CCR2_Val);
  }
  else if (TIM_GetITStatus(TIM3, TIM_IT_CC3) != RESET)
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC3);

    /* LED5 toggling with frequency = 18.31 Hz */
    STM_EVAL_LEDToggle(LED5);
    capture = TIM_GetCapture3(TIM3);
    TIM_SetCompare3(TIM3, capture + CCR3_Val);
  }
  else
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC4);

    /* LED6 toggling with frequency = 36.62 Hz */
    STM_EVAL_LEDToggle(LED6);
    capture = TIM_GetCapture4(TIM3);
    TIM_SetCompare4(TIM3, capture + CCR4_Val);
  }
}
示例#17
0
static void pwmTIMxHandler(TIM_TypeDef *tim, uint8_t portBase)
{
    int8_t port;

    // Generic CC handler for TIM2,3,4
    if (TIM_GetITStatus(tim, TIM_IT_CC1) == SET) {
        port = portBase + 0;
        TIM_ClearITPendingBit(tim, TIM_IT_CC1);
        pwmPorts[port].callback(port, TIM_GetCapture1(tim));
    } else if (TIM_GetITStatus(tim, TIM_IT_CC2) == SET) {
        port = portBase + 1;
        TIM_ClearITPendingBit(tim, TIM_IT_CC2);
        pwmPorts[port].callback(port, TIM_GetCapture2(tim));
    } else if (TIM_GetITStatus(tim, TIM_IT_CC3) == SET) {
        port = portBase + 2;
        TIM_ClearITPendingBit(tim, TIM_IT_CC3);
        pwmPorts[port].callback(port, TIM_GetCapture3(tim));
    } else if (TIM_GetITStatus(tim, TIM_IT_CC4) == SET) {
        port = portBase + 3;
        TIM_ClearITPendingBit(tim, TIM_IT_CC4);
        pwmPorts[port].callback(port, TIM_GetCapture4(tim));
    }
}
示例#18
0
uint16_t HAL_Servo_Read_Pulse_Width(uint16_t pin)
{
  uint16_t SERVO_TIM_CCR = 0x0000;

  if(PIN_MAP[pin].timer_ch == TIM_Channel_1)
  {
    SERVO_TIM_CCR = TIM_GetCapture1(PIN_MAP[pin].timer_peripheral);
  }
  else if(PIN_MAP[pin].timer_ch == TIM_Channel_2)
  {
    SERVO_TIM_CCR = TIM_GetCapture2(PIN_MAP[pin].timer_peripheral);
  }
  else if(PIN_MAP[pin].timer_ch == TIM_Channel_3)
  {
    SERVO_TIM_CCR = TIM_GetCapture3(PIN_MAP[pin].timer_peripheral);
  }
  else if(PIN_MAP[pin].timer_ch == TIM_Channel_4)
  {
    SERVO_TIM_CCR = TIM_GetCapture4(PIN_MAP[pin].timer_peripheral);
  }

  //pulseWidth = (SERVO_TIM_CCR * 1000000) / ((SERVO_TIM_ARR + 1) * SERVO_TIM_PWM_FREQ);
  return SERVO_TIM_CCR;
}
示例#19
0
void TIM8_CC_IRQHandler()
{
	TIM_ICInitTypeDef TIM_ICInitStructure;
	TIM_ICStructInit(&TIM_ICInitStructure); //Initialize the structure with default setting

	if(TIM_GetITStatus(TIM8, TIM_IT_CC1) == SET) {
		TIM_ClearITPendingBit(TIM8, TIM_IT_CC1);

		TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;

		if(capture_state[THROTTLE_CHANNEL] == RISE) {
			//Rised edge capture
			rise_value[THROTTLE_CHANNEL] = TIM_GetCapture1(TIM8);

			//Change to measure the falled edge
			capture_state[THROTTLE_CHANNEL] = FALL;
			TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
		} else {
			//Falled edge capture
			fall_value[THROTTLE_CHANNEL] = TIM_GetCapture1(TIM8);

			/* Calculate the RC high pulse value */
			if(fall_value[THROTTLE_CHANNEL] > rise_value[THROTTLE_CHANNEL])
				rc_value[THROTTLE_CHANNEL] = fall_value[THROTTLE_CHANNEL] - rise_value[THROTTLE_CHANNEL];
			else if(fall_value[THROTTLE_CHANNEL] == 0 && rise_value[THROTTLE_CHANNEL] == 0)
				rc_value[THROTTLE_CHANNEL] = 0; //No signal
			else /* falled edge measured value is overflow */
				rc_value[THROTTLE_CHANNEL] = (fall_value[THROTTLE_CHANNEL] + 10000) - rise_value[THROTTLE_CHANNEL];

			//Change to measure the rised edge
			capture_state[THROTTLE_CHANNEL] = RISE;
			TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
		}

		TIM_ICInit(TIM8, &TIM_ICInitStructure);
	}

	if(TIM_GetITStatus(TIM8, TIM_IT_CC2) == SET) {
		TIM_ClearITPendingBit(TIM8, TIM_IT_CC2);

		TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;

		if(capture_state[YAW_CHANNEL] == RISE) {
			//Rised edge capture
			rise_value[YAW_CHANNEL] = TIM_GetCapture2(TIM8);

			//Change to measure the falled edge
			capture_state[YAW_CHANNEL] = FALL;
			TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
		} else {
			//Falled edge capture
			fall_value[YAW_CHANNEL] = TIM_GetCapture2(TIM8);

			/* Calculate the RC high pulse value */
			if(fall_value[YAW_CHANNEL] > rise_value[YAW_CHANNEL])
				rc_value[YAW_CHANNEL] = fall_value[YAW_CHANNEL] - rise_value[YAW_CHANNEL];
			else if(fall_value[YAW_CHANNEL] == 0 && rise_value[YAW_CHANNEL] == 0)
				rc_value[YAW_CHANNEL] = 0; //No signal
			else /* falled edge measured value is overflow */
				rc_value[YAW_CHANNEL] = (fall_value[YAW_CHANNEL] + 10000) - rise_value[YAW_CHANNEL];

			//Change to measure the rised edge
			capture_state[YAW_CHANNEL] = RISE;
			TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
		}

		TIM_ICInit(TIM8, &TIM_ICInitStructure);
	}
}
示例#20
0
static inline void pwmIRQHandler(TIM_TypeDef *tim)
{
	pwm_in_counter++;

    uint8_t i;
    uint16_t val = 0;
    uint16_t time_on = 0;
    uint16_t time_off = 0;

    for (i = 0; i < PWMIN_CHANNEL_NUM; i++) {
        struct TIM_Channel channel = Channels[i];
        struct PWM_State *input = &Inputs[i];

        if (channel.tim == tim && (TIM_GetITStatus(tim, channel.tim_cc) == SET)) {
            TIM_ClearITPendingBit(channel.tim, channel.tim_cc);

            switch (channel.tim_channel) {
                case TIM_Channel_1:
                    val = TIM_GetCapture1(channel.tim);
                    break;
                case TIM_Channel_2:
                    val = TIM_GetCapture2(channel.tim);
                    break;
                case TIM_Channel_3:
                    val = TIM_GetCapture3(channel.tim);
                    break;
                case TIM_Channel_4:
                    val = TIM_GetCapture4(channel.tim);
                    break;
            }


            if (input->state == 0) {
        	input->rise = val;
        	if(input->rise > input->fall)
        	    time_off = input->rise - input->fall;
        	else
        	    time_off = ((0xFFFF - input->fall) + input->rise);

                // switch states
        	if ((time_off >= MINOFFWIDTH) && (time_off <= MAXOFFWIDTH)){
        	    input->state = 1;
                    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
                    TIM_ICInitStructure.TIM_Channel = channel.tim_channel;
                    TIM_ICInit(channel.tim, &TIM_ICInitStructure);
        	}

            } else {
        	input->fall = val;
        	if (input->fall > input->rise)
                    time_on = (input->fall - input->rise);
                else
                    time_on = ((0xFFFF - input->rise) + input->fall);

        	if ((time_on >= MINONWIDTH) && (time_on <= MAXONWIDTH))
        	    {
		    // compute capture
		    input->capture = time_on;

		    // switch state
		    input->state = 0;
		    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
		    TIM_ICInitStructure.TIM_Channel = channel.tim_channel;
		    TIM_ICInit(channel.tim, &TIM_ICInitStructure);
		    }
            }
        }
    }
}
示例#21
0
void TIM2_IRQHandler(void)
{
	uint32_t current[4];
	TIM_ICInitTypeDef TIM_ICInitStructure;
	TIM_ICStructInit(&TIM_ICInitStructure);

	if (TIM_GetITStatus(TIM2, TIM_IT_CC1) == SET) {
		/* Clear TIM1 Capture compare interrupt pending bit */
		TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);

		if ( inc[INC6].status == RISING ) {
			TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
			TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;

			/* Get the Input Capture value */
			inc[INC6].prev_value = TIM_GetCapture1(TIM2);
			inc[INC6].status = FALLING;
			

		} else {
			TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
			TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;

			//Get the Input Capture value
			current[0] =  TIM_GetCapture1(TIM2);

			if (current[0] > inc[INC6].prev_value)
				inc[INC6].curr_value =  current[0] - inc[INC6].prev_value ;
			else if (current[0] < inc[INC6].prev_value)
				inc[INC6].curr_value = 0xFFFF - inc[INC6].prev_value  + current[0] ;

			inc[INC6].status = RISING;
		}

		TIM_ICInit(TIM2, &TIM_ICInitStructure);

	}

	if (TIM_GetITStatus(TIM2, TIM_IT_CC2) == SET) {
		/* Clear TIM1 Capture compare interrupt pending bit */
		TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);

		if (inc[INC5].status == RISING) {
			TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
			TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;

			/* Get the Input Capture value */
			inc[INC5].prev_value = TIM_GetCapture2(TIM2);
			inc[INC5].status = FALLING;

		} else {
			TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
			TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;

			/* Get the Input Capture value */
			current[1] =  TIM_GetCapture2(TIM2);

			if (current[1] > inc[INC5].prev_value)
				inc[INC5].curr_value =  current[1] - inc[INC5].prev_value ;
			else if (current[1] < inc[INC5].prev_value)
				inc[INC5].curr_value = 0xFFFF - inc[INC5].prev_value + current[1] ;

			inc[INC5].status = RISING;


		}

		TIM_ICInit(TIM2, &TIM_ICInitStructure);
	}

	if (TIM_GetITStatus(TIM2, TIM_IT_CC3) == SET) {
		/* Clear TIM1 Capture compare interrupt pending bit */
		TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);

		if (inc[INC2].status == RISING) {
			TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;
			TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;

			/* Get the Input Capture value */
			inc[INC2].prev_value = TIM_GetCapture3(TIM2);
			inc[INC2].status = FALLING;
			


		} else {
			TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;
			TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;

			/* Get the Input Capture value */
			current[2] =  TIM_GetCapture3(TIM2);

			if (current[2] > inc[INC2].prev_value)
				inc[INC2].curr_value=  current[2] - inc[INC2].prev_value;
			else if (current[2] < inc[INC2].prev_value)
				inc[INC2].curr_value =   0xFFFF - inc[INC2].prev_value + current[2] ;
			
			inc[INC2].status = RISING;


		}

		TIM_ICInit(TIM2, &TIM_ICInitStructure);
	}

	if (TIM_GetITStatus(TIM2, TIM_IT_CC4) == SET) {
		/* Clear TIM1 Capture compare interrupt pending bit */
		TIM_ClearITPendingBit(TIM2, TIM_IT_CC4);

		if (inc[INC1].status == RISING) {
			TIM_ICInitStructure.TIM_Channel = TIM_Channel_4;
			TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;

			/* Get the Input Capture value */
			inc[INC1].prev_value = TIM_GetCapture4(TIM2);
			inc[INC1].status  = FALLING;
			

		} else {
			TIM_ICInitStructure.TIM_Channel = TIM_Channel_4;
			TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;

			/* Get the Input Capture value */
			current[3] =  TIM_GetCapture4(TIM2);

			if (current[3] > inc[INC1].prev_value)
				inc[INC1].curr_value =  current[3] - inc[INC1].prev_value;
			else if (current[3] < inc[INC1].prev_value)
				inc[INC1].curr_value = 0xFFFF - inc[INC1].prev_value+ current[3] ;

			inc[INC1].status = RISING;


		}

		TIM_ICInit(TIM2, &TIM_ICInitStructure);
	}
}
示例#22
0
文件: pwm_in.c 项目: Zasy/STM32_Demo
//定时器3中断服务程序	 
void TIM3_IRQHandler(void)
{   
 	if((TIM3CH1_CAPTURE_STA&0X80)==0)//CH1 还未成功捕获	
	{  		
		if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
		{	
			 TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);

			if(TIM3CH1_CAPTURE_STA&0X40)		//捕获到一个下降沿为真 		   发生上升沿中断后再次发生中断为下降沿
			{	  			
				TIM3CH1_CAPTURE_DOWNVAL=TIM_GetCapture1(TIM3);   //获取当前的捕获值

				if(TIM3CH1_CAPTURE_DOWNVAL<TIM3CH1_CAPTURE_UPVAL)
				{
					 tim3_T=65535;
			    }
			    else tim3_T=0;	

			   tempup1=TIM3CH1_CAPTURE_DOWNVAL-TIM3CH1_CAPTURE_UPVAL+tim3_T;//得到总的高电平时间

			   pwmout1=tempup1;

			   TIM3CH1_CAPTURE_STA=0;
					
			   TIM_OC1PolarityConfig(TIM3,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获			  
			}
			else  								//发生捕获事件但不是下降沿,第一次捕获上升沿,清零,定时器开始计数
			{
				TIM3CH1_CAPTURE_UPVAL=TIM_GetCapture1(TIM3);			//获取上升沿的数据
				TIM3CH1_CAPTURE_STA|=0X40;		//标记以捕获到了上升沿
			   	TIM_OC1PolarityConfig(TIM3,TIM_ICPolarity_Falling);		//CC1P=1 设置为下降沿捕获
			
			}		    
		}			     	    					   
 	}
	
  
	if((TIM3CH2_CAPTURE_STA&0X80)==0)//CH1 还未成功捕获	
	{  
		if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)//捕获1发生捕获事件
		{	
			TIM_ClearITPendingBit(TIM3,TIM_IT_CC2);
			if(TIM3CH2_CAPTURE_STA&0X40)		//捕获到一个下降沿为真 		   发生上升沿中断后再次发生中断为下降沿
			{	  			

			   TIM3CH2_CAPTURE_DOWNVAL=TIM_GetCapture2(TIM3);

				if(TIM3CH2_CAPTURE_DOWNVAL<TIM3CH2_CAPTURE_UPVAL)
				{
					tim3_T=65535;
				}
				else tim3_T=0;	

			   tempup2=TIM3CH2_CAPTURE_DOWNVAL-TIM3CH2_CAPTURE_UPVAL+tim3_T;//得到总的高电平时间			

			   pwmout2=tempup2;
	  
			   TIM3CH2_CAPTURE_STA=0;	

			   TIM_OC2PolarityConfig(TIM3,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
			   
			}
			else  								//发生捕获事件但不是下降沿,第一次捕获上升沿,清零,定时器开始计数
			{
				TIM3CH2_CAPTURE_UPVAL=TIM_GetCapture2(TIM3);			//获取上升沿的数据
				TIM3CH2_CAPTURE_STA|=0X40;		//标记以捕获到了上升沿
			   	TIM_OC2PolarityConfig(TIM3,TIM_ICPolarity_Falling);		//CC1P=1 设置为下降沿捕获	
			}		    
		}			     	    					   
 	}		 
	

	if((TIM3CH3_CAPTURE_STA&0X80)==0)//CH3 还未成功捕获	
	{	
	  
		if (TIM_GetITStatus(TIM3, TIM_IT_CC3) != RESET)//捕获3发生捕获事件
		{	
			TIM_ClearITPendingBit(TIM3, TIM_IT_CC3);

			if(TIM3CH3_CAPTURE_STA&0X40)		//捕获到一个下降沿为真 		   发生上升沿中断后再次发生中断为下降沿
			{	  			
				TIM3CH3_CAPTURE_DOWNVAL=TIM_GetCapture3(TIM3);

				if(TIM3CH3_CAPTURE_DOWNVAL<TIM3CH3_CAPTURE_UPVAL)
				{
					tim3_T=65535;
				}
				else tim3_T=0;	

				tempup3=TIM3CH3_CAPTURE_DOWNVAL-TIM3CH3_CAPTURE_UPVAL+tim3_T;//得到总的高电平时间

			   pwmout3=tempup3;

			   TIM3CH3_CAPTURE_STA=0;
				
			   TIM_OC3PolarityConfig(TIM3,TIM_ICPolarity_Rising); //CC3P=0 设置为上升沿捕获
			
			}
			else  								//发生捕获事件但不是下降沿,第一次捕获上升沿,清零,定时器开始计数
			{
				TIM3CH3_CAPTURE_UPVAL=TIM_GetCapture3(TIM3);			//获取上升沿的数据
				TIM3CH3_CAPTURE_STA|=0X40;		//标记以捕获到了上升沿
			   	TIM_OC3PolarityConfig(TIM3,TIM_ICPolarity_Falling);		//CC1P=1 设置为下降沿捕获
			}		    
		}			     	    					   
 	}

	if((TIM3CH4_CAPTURE_STA&0X80)==0)//CH4 还未成功捕获	
	{	  
		if (TIM_GetITStatus(TIM3, TIM_IT_CC4) != RESET)//捕获1发生捕获事件
		{	
			TIM_ClearITPendingBit(TIM3,TIM_IT_CC4);

			if(TIM3CH4_CAPTURE_STA&0X40)		//捕获到一个下降沿为真 		   发生上升沿中断后再次发生中断为下降沿
			{	  			

				TIM3CH4_CAPTURE_DOWNVAL=TIM_GetCapture4(TIM3);
				if(TIM3CH4_CAPTURE_DOWNVAL<TIM3CH4_CAPTURE_UPVAL)
				{
					tim3_T=65535;
				}
				else tim3_T=0;	

				tempup4=TIM3CH4_CAPTURE_DOWNVAL-TIM3CH4_CAPTURE_UPVAL+tim3_T;//得到总的高电平时间

			   	pwmout4=tempup4;

			    TIM3CH4_CAPTURE_STA=0;	
   				
			   	TIM_OC4PolarityConfig(TIM3,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获				
			}
			else  								//发生捕获事件但不是下降沿,第一次捕获上升沿,清零,定时器开始计数
			{
				TIM3CH4_CAPTURE_UPVAL=TIM_GetCapture4(TIM3);			//获取上升沿的数据
				TIM3CH4_CAPTURE_STA|=0X40;		//标记以捕获到了上升沿
			   	TIM_OC4PolarityConfig(TIM3,TIM_ICPolarity_Falling);		//CC4P=1 设置为下降沿捕获
			
			}		    
		}			     	    					   
 	}							  			 		 
}
示例#23
0
/**
 * @brief Handler for TIM4 global interrupt
 * @details TIM4 handler
 */
void TIM4_IRQHandler(void) {
  if (TIM_GetITStatus(TIM4, TIM_IT_CC1) != RESET) {
    TIM_ClearITPendingBit(TIM4, TIM_IT_CC1);

    _ge_ic_chan_captures_last[IC_CHAN1] = _ge_ic_chan_captures[IC_CHAN1];
    _ge_ic_chan_captures[IC_CHAN1] = TIM_GetCapture1(TIM4);

    // set updated available flag
    _ge_ic_chan_freq_avail[IC_CHAN1] = true;

    //calculate actual counts based on timer overflow count
    if (_ge_ic_chan_captures_last[IC_CHAN1] > _ge_ic_chan_captures[IC_CHAN1]) {
      _ge_ic_chan_period[IC_CHAN1] = (uint32_t) _ge_ic_chan_captures[IC_CHAN1]
                                     + 65536 * (_ge_ic_chan_ovf[IC_CHAN1] - 1)
                                     - _ge_ic_chan_captures_last[IC_CHAN1];
    } else {
      _ge_ic_chan_period[IC_CHAN1] = (uint32_t) _ge_ic_chan_captures[IC_CHAN1]
                                     + 65536 * (_ge_ic_chan_ovf[IC_CHAN1])
                                     - _ge_ic_chan_captures_last[IC_CHAN1];
    }

    _ge_ic_chan_ovf[IC_CHAN1] = 0;

    //reenable chan 1 IC
    TIM_ICInitTypeDef ic_init_struct;
    TIM_ICStructInit(&ic_init_struct);

    ic_init_struct.TIM_Channel = TIM_Channel_1;
    ic_init_struct.TIM_ICPolarity = TIM_ICPolarity_Rising;
    ic_init_struct.TIM_ICSelection = TIM_ICSelection_DirectTI;
    ic_init_struct.TIM_ICPrescaler = TIM_ICPSC_DIV1;
    ic_init_struct.TIM_ICFilter = GE_IC_IFILTER;

    TIM_ICInit(TIM4, &ic_init_struct);
    // _ge_ic_chan_captures[IC_CHAN1] = 3000;
  }

  if (TIM_GetITStatus(TIM4, TIM_IT_CC2) != RESET) {
    TIM_ClearITPendingBit(TIM4, TIM_IT_CC2);

    _ge_ic_chan_captures_last[IC_CHAN2] = _ge_ic_chan_captures[IC_CHAN2];
    _ge_ic_chan_captures[IC_CHAN2] = TIM_GetCapture2(TIM4);

    // set updated available flag
    _ge_ic_chan_freq_avail[IC_CHAN2] = true;

    //calculate actual counts based on timer overflow count
    if (_ge_ic_chan_captures_last[IC_CHAN2] > _ge_ic_chan_captures[IC_CHAN2]) {
      _ge_ic_chan_period[IC_CHAN2] = (uint32_t) _ge_ic_chan_captures[IC_CHAN2]
                                     + 65536 * (_ge_ic_chan_ovf[IC_CHAN2] - 1)
                                     - _ge_ic_chan_captures_last[IC_CHAN2];
    } else {
      _ge_ic_chan_period[IC_CHAN2] = (uint32_t) _ge_ic_chan_captures[IC_CHAN2]
                                     + 65536 * (_ge_ic_chan_ovf[IC_CHAN2])
                                     - _ge_ic_chan_captures_last[IC_CHAN2];
    }

    _ge_ic_chan_ovf[IC_CHAN2] = 0;

    //reenable chan 2 IC
    TIM_ICInitTypeDef ic_init_struct;
    TIM_ICStructInit(&ic_init_struct);

    ic_init_struct.TIM_Channel = TIM_Channel_2;
    ic_init_struct.TIM_ICPolarity = TIM_ICPolarity_Rising;
    ic_init_struct.TIM_ICSelection = TIM_ICSelection_DirectTI;
    ic_init_struct.TIM_ICPrescaler = TIM_ICPSC_DIV1;
    ic_init_struct.TIM_ICFilter = GE_IC_IFILTER;

    TIM_ICInit(TIM4, &ic_init_struct);
  }

  if (TIM_GetITStatus(TIM4, TIM_IT_CC3) != RESET) {
    TIM_ClearITPendingBit(TIM4, TIM_IT_CC3);

    _ge_ic_chan_captures_last[IC_CHAN3] = _ge_ic_chan_captures[IC_CHAN3];
    _ge_ic_chan_captures[IC_CHAN3] = TIM_GetCapture3(TIM4);

    // set updated available flag
    _ge_ic_chan_freq_avail[IC_CHAN3] = true;

    //calculate actual counts based on timer overflow count
    if (_ge_ic_chan_captures_last[IC_CHAN3] > _ge_ic_chan_captures[IC_CHAN3]) {
      _ge_ic_chan_period[IC_CHAN3] = (uint32_t) _ge_ic_chan_captures[IC_CHAN3]
                                     + 65536 * (_ge_ic_chan_ovf[IC_CHAN3] - 1)
                                     - _ge_ic_chan_captures_last[IC_CHAN3];
    } else {
      _ge_ic_chan_period[IC_CHAN3] = (uint32_t) _ge_ic_chan_captures[IC_CHAN3]
                                     + 65536 * (_ge_ic_chan_ovf[IC_CHAN3])
                                     - _ge_ic_chan_captures_last[IC_CHAN3];
    }

    _ge_ic_chan_ovf[IC_CHAN3] = 0;

    //reenable chan 3 IC
    TIM_ICInitTypeDef ic_init_struct;
    TIM_ICStructInit(&ic_init_struct);

    ic_init_struct.TIM_Channel = TIM_Channel_3;
    ic_init_struct.TIM_ICPolarity = TIM_ICPolarity_Rising;
    ic_init_struct.TIM_ICSelection = TIM_ICSelection_DirectTI;
    ic_init_struct.TIM_ICPrescaler = TIM_ICPSC_DIV1;
    ic_init_struct.TIM_ICFilter = GE_IC_IFILTER;

    TIM_ICInit(TIM4, &ic_init_struct);
  }

  if (TIM_GetITStatus(TIM4, TIM_IT_CC4) != RESET) {
    TIM_ClearITPendingBit(TIM4, TIM_IT_CC4);

    _ge_ic_chan_captures_last[IC_CHAN4] = _ge_ic_chan_captures[IC_CHAN4];
    _ge_ic_chan_captures[IC_CHAN4] = TIM_GetCapture4(TIM4);

    // set updated available flag
    _ge_ic_chan_freq_avail[IC_CHAN4] = true;

    //calculate actual counts based on timer overflow count
    if (_ge_ic_chan_captures_last[IC_CHAN4] > _ge_ic_chan_captures[IC_CHAN4]) {
      _ge_ic_chan_period[IC_CHAN4] = (uint32_t) _ge_ic_chan_captures[IC_CHAN4]
                                     + 65536 * (_ge_ic_chan_ovf[IC_CHAN4] - 1)
                                     - _ge_ic_chan_captures_last[IC_CHAN4];
    } else {
      _ge_ic_chan_period[IC_CHAN4] = (uint32_t) _ge_ic_chan_captures[IC_CHAN4]
                                     + 65536 * (_ge_ic_chan_ovf[IC_CHAN4])
                                     - _ge_ic_chan_captures_last[IC_CHAN4];
    }

    _ge_ic_chan_ovf[IC_CHAN4] = 0;

    //reenable chan 4 IC
    TIM_ICInitTypeDef ic_init_struct;
    TIM_ICStructInit(&ic_init_struct);

    ic_init_struct.TIM_Channel = TIM_Channel_4;
    ic_init_struct.TIM_ICPolarity = TIM_ICPolarity_Rising;
    ic_init_struct.TIM_ICSelection = TIM_ICSelection_DirectTI;
    ic_init_struct.TIM_ICPrescaler = TIM_ICPSC_DIV1;
    ic_init_struct.TIM_ICFilter = GE_IC_IFILTER;

    TIM_ICInit(TIM4, &ic_init_struct);
  }

  if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) {
    TIM_ClearITPendingBit(TIM4, TIM_IT_Update);

    for (int i = 0; i < 4; i++) {
      _ge_ic_chan_ovf[i]++;
    }
  }
}
/*********************************************************************************
  *Function      : void TIM2_Tone_Interrupt_Handler(void)
  *Description  : set duty cycle
  *Input          : none
  *Output        : none
  *Return        : none
  *author        : lz
  *date           : 6-December-2013
  *Others        :         
**********************************************************************************/
void TIM2_Tone_Interrupt_Handler(void)
{
    uint16_t capture;

    if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
    {
        TIM_ClearITPendingBit(TIM2, TIM_IT_CC1 );
        capture = TIM_GetCapture1(TIM2);
        TIM_SetCompare1(TIM2, capture + PIN_MAP[30].timer_ccr);
        if(PIN_MAP[30].user_property != -1)
        {
            if (PIN_MAP[30].user_property > 0)
            {
                PIN_MAP[30].user_property -= 1;
            }
            else
            {
                noTone(30);
            }
        }
    }

    if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)
    {
        TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
        capture = TIM_GetCapture2(TIM2);
        TIM_SetCompare2(TIM2, capture + PIN_MAP[31].timer_ccr);
        if(PIN_MAP[31].user_property != -1)
        {
            if (PIN_MAP[31].user_property > 0)
            {
                PIN_MAP[31].user_property -= 1;
            }
            else
            {
                noTone(31);
            }
        }
    }

    if (TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET)
    {
        TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);
        capture = TIM_GetCapture3(TIM2);
        TIM_SetCompare3(TIM2, capture + PIN_MAP[33].timer_ccr);
        if(PIN_MAP[33].user_property != -1)
        {
            if (PIN_MAP[33].user_property > 0)
            {
                PIN_MAP[33].user_property -= 1;
            }
            else
            {
                noTone(33);
            }
        }
    }

    if (TIM_GetITStatus(TIM2, TIM_IT_CC4) != RESET)
    {
        TIM_ClearITPendingBit(TIM2, TIM_IT_CC4);
        capture = TIM_GetCapture4(TIM2);
        TIM_SetCompare4(TIM2, capture + PIN_MAP[32].timer_ccr);
        if(PIN_MAP[32].user_property != -1)
        {
            if (PIN_MAP[32].user_property > 0)
            {
                PIN_MAP[32].user_property -= 1;
            }
            else
            {
                noTone(32);
            }
        }
    }
}
/*********************************************************************************
  *Function      : void TIM3_Tone_Interrupt_Handler(void)
  *Description  : set duty cycle
  *Input          : none
  *Output        : none
  *Return        : none
  *author        : lz
  *date           : 6-December-2013
  *Others        :         
**********************************************************************************/
void TIM3_Tone_Interrupt_Handler(void)
{
    uint16_t capture;

    if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)
    {
        TIM_ClearITPendingBit(TIM3, TIM_IT_CC1 );
        capture = TIM_GetCapture1(TIM3);
        TIM_SetCompare1(TIM3, capture + PIN_MAP[36].timer_ccr);
        if(PIN_MAP[36].user_property != -1)
        {
            if (PIN_MAP[36].user_property > 0)
            {
                PIN_MAP[36].user_property -= 1;
            }
            else
            {
                noTone(36);
            }
        }
    }

    if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)
    {
        TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
        capture = TIM_GetCapture2(TIM3);
        TIM_SetCompare2(TIM3, capture + PIN_MAP[37].timer_ccr);
        if(PIN_MAP[37].user_property != -1)
        {
            if (PIN_MAP[37].user_property > 0)
            {
                PIN_MAP[37].user_property -= 1;
            }
            else
            {
                noTone(37);
            }
        }
    }

    if (TIM_GetITStatus(TIM3, TIM_IT_CC3) != RESET)
    {
        TIM_ClearITPendingBit(TIM3, TIM_IT_CC3);
        capture = TIM_GetCapture3(TIM3);
        TIM_SetCompare3(TIM3, capture + PIN_MAP[38].timer_ccr);
        if(PIN_MAP[38].user_property != -1)
        {
            if (PIN_MAP[38].user_property > 0)
            {
                PIN_MAP[38].user_property -= 1;
            }
            else
            {
                noTone(38);
            }
        }
    }

    if (TIM_GetITStatus(TIM3, TIM_IT_CC4) != RESET)
    {
        TIM_ClearITPendingBit(TIM3, TIM_IT_CC4);
        capture = TIM_GetCapture4(TIM3);
        TIM_SetCompare4(TIM3, capture + PIN_MAP[39].timer_ccr);
        if(PIN_MAP[39].user_property != -1)
        {
            if (PIN_MAP[39].user_property > 0)
            {
                PIN_MAP[39].user_property -= 1;
            }
            else
            {
                noTone(39);
            }
        }
    }
}
void TIM4_IRQHandler(void){
	
	if(function == FREQUENCY_METER)
	{
		RCC_ClocksTypeDef RCC_Clocks;
		RCC_GetClocksFreq(&RCC_Clocks);

		/* Get the Input Capture value */
		IC2Value = TIM_GetCapture2(TIM4);

		if (IC2Value != 0)
		{
			/* Duty cycle computation */
			DutyCycle = (TIM_GetCapture1(TIM4) * 100) / IC2Value;
			
			/* Frequency computation TIM4 counter clock = (RCC_Clocks.HCLK_Frequency)/2 */
			if(freqRange == LESS_THAN_1) {
				low_Frequency = (((RCC_Clocks.HCLK_Frequency)/2 / (double)IC2Value) / (61440 - 1));			/* 0.06 - 1 hz */
			}
			else if(freqRange == ONE_TO_100) {
				Frequency = (((RCC_Clocks.HCLK_Frequency)/2 / IC2Value) / (3840 - 1));			/* 1 - 100 hz */
			}
			else if(freqRange == HUNDRED_TO_10K) {
				Frequency = (((RCC_Clocks.HCLK_Frequency)/2 / IC2Value) / (15 - 1));				/* 100 - 10000 hz */
			}
			else if(freqRange == MORE_THAN_10K) {
				Frequency = (((RCC_Clocks.HCLK_Frequency)/2 / IC2Value) / 1);					/* 10000 - ~10M hz */
			}
			else {
				Frequency = ((RCC_Clocks.HCLK_Frequency)/2 / IC2Value);					/* DEFAULT - 1.28k - 1M hz */
			}
		}
		else
		{
			DutyCycle = 0;
			Frequency = 0;
		}
	}
	else if (function == FREQUENCY_KEY_SHIFT)
	{
		NVIC_InitTypeDef NVIC_InitStructure;
	
		// Set the FSK_Chnage flag to true to signal DDS frequencies need updating
		FSK_Change = true;
		
		// Based on the current toggleBit value, change the DDS frequency
		if (toggleBit == 1)
		{
			FSK_Freq = HIGH;
			toggleBit = 0;
		}
		else
		{
			FSK_Freq = LOW;
			toggleBit = 1;
		}
	
		// Problems encounter with the timers global interrupt flag, so re-enable
		// the interrupt which appears to fix the problem for some reason.
		NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
		NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
		NVIC_Init(&NVIC_InitStructure);
	}
	
	/* Clear TIM4 Capture compare interrupt pending bit */
  TIM_ClearITPendingBit(TIM4, TIM_IT_CC2);
}
//定时器4中断服务程序,用CH1作为超声波转换的通道 即PB6端口
void TIM4_IRQHandler(void)
{
	if ((TIM4CH1_CAPTURE_STA & 0X80) == 0) 		//还未成功捕获	
	{
		if (TIM_GetITStatus(TIM4, TIM_IT_CC1) != RESET) 		//捕获1发生捕获事件
		{
			TIM_ClearITPendingBit(TIM4, TIM_IT_CC1); 		//清除中断标志位
			if (TIM4CH1_CAPTURE_STA & 0X40)		//捕获到一个下降沿
			{
				TIM4CH1_CAPTURE_DOWNVAL = TIM_GetCapture1(TIM4);//记录下此时的定时器计数值
				if (TIM4CH1_CAPTURE_DOWNVAL < TIM4CH1_CAPTURE_UPVAL)
				{/* 如果计数器初始值大于末尾值,说明计数器有溢出 */
					tim4_T1 = 65535;
				}
				else
				tim4_T1 = 0;  
				tempup1 = TIM4CH1_CAPTURE_DOWNVAL - TIM4CH1_CAPTURE_UPVAL
						+ tim4_T1;		//得到总的高电平的时间
				//pwmout1 = tempup1;		//总的高电平的时间
				tempup1 =tempup1 *17/1000;//计算距离&&UltrasonicWave_Distance<85
			
				
				
				TIM4CH1_CAPTURE_STA = 0;		//捕获标志位清零,这一步很重要!
				TIM_OC1PolarityConfig(TIM4, TIM_ICPolarity_Rising); //设置为上升沿捕获		  
			}
			else //发生捕获时间但不是下降沿,第一次捕获到上升沿,记录此时的定时器计数值
			{
				TIM4CH1_CAPTURE_UPVAL = TIM_GetCapture1(TIM4);		//获取上升沿数据
				TIM4CH1_CAPTURE_STA |= 0X40;		//标记已捕获到上升沿
				TIM_OC1PolarityConfig(TIM4, TIM_ICPolarity_Falling);//设置为下降沿捕获
			}
		}
	}

	if ((TIM4CH2_CAPTURE_STA & 0X80) == 0)		//还未成功捕获	
	{
		if (TIM_GetITStatus(TIM4, TIM_IT_CC2) != RESET)		//捕获2发生捕获事件
		{
			TIM_ClearITPendingBit(TIM4, TIM_IT_CC2);		//清除中断标志位
			if (TIM4CH2_CAPTURE_STA & 0X40)		//捕获到一个下降沿
			{
				TIM4CH2_CAPTURE_DOWNVAL = TIM_GetCapture2(TIM4);//记录下此时的定时器计数值
				if (TIM4CH2_CAPTURE_DOWNVAL < TIM4CH2_CAPTURE_UPVAL)
				{
					tim4_T2 = 65535;
				}
				else
					tim4_T2 = 0;
				tempup2 = TIM4CH2_CAPTURE_DOWNVAL - TIM4CH2_CAPTURE_UPVAL
						+ tim4_T2;		//得到总的高电平的时间
				pwmout2 = tempup2;		//总的高电平的时间
				TIM4CH2_CAPTURE_STA = 0;		//捕获标志位清零
				TIM_OC2PolarityConfig(TIM4, TIM_ICPolarity_Rising); //设置为上升沿捕获		  
			}
			else //发生捕获时间但不是下降沿,第一次捕获到上升沿,记录此时的定时器计数值
			{
				TIM4CH2_CAPTURE_UPVAL = TIM_GetCapture2(TIM4);		//获取上升沿数据
				TIM4CH2_CAPTURE_STA |= 0X40;		//标记已捕获到上升沿
				TIM_OC2PolarityConfig(TIM4, TIM_ICPolarity_Falling);//设置为下降沿捕获
			}
		}
	}

	if ((TIM4CH3_CAPTURE_STA & 0X80) == 0)		//还未成功捕获	
	{
		if (TIM_GetITStatus(TIM4, TIM_IT_CC3) != RESET)		//捕获3发生捕获事件
		{
			TIM_ClearITPendingBit(TIM4, TIM_IT_CC3);		//清除中断标志位
			if (TIM4CH3_CAPTURE_STA & 0X40)		//捕获到一个下降沿
			{
				TIM4CH3_CAPTURE_DOWNVAL = TIM_GetCapture3(TIM4);//记录下此时的定时器计数值
				if (TIM4CH3_CAPTURE_DOWNVAL < TIM4CH3_CAPTURE_UPVAL)
				{
					tim4_T3 = 65535;
				}
				else
					tim4_T3 = 0;
				tempup3 = TIM4CH3_CAPTURE_DOWNVAL - TIM4CH3_CAPTURE_UPVAL
						+ tim4_T3;		//得到总的高电平的时间
				pwmout3 = tempup3;		//总的高电平的时间
				TIM4CH3_CAPTURE_STA = 0;		//捕获标志位清零
				TIM_OC3PolarityConfig(TIM4, TIM_ICPolarity_Rising); //设置为上升沿捕获		  
			}
			else //发生捕获时间但不是下降沿,第一次捕获到上升沿,记录此时的定时器计数值
			{
				TIM4CH3_CAPTURE_UPVAL = TIM_GetCapture3(TIM4);		//获取上升沿数据
				TIM4CH3_CAPTURE_STA |= 0X40;		//标记已捕获到上升沿
				TIM_OC3PolarityConfig(TIM4, TIM_ICPolarity_Falling);//设置为下降沿捕获
			}
		}
	}

	if ((TIM4CH4_CAPTURE_STA & 0X80) == 0)		//还未成功捕获	
	{
		if (TIM_GetITStatus(TIM4, TIM_IT_CC4) != RESET)		//捕获4发生捕获事件
		{
			TIM_ClearITPendingBit(TIM4, TIM_IT_CC4);		//清除中断标志位
			if (TIM4CH4_CAPTURE_STA & 0X40)		//捕获到一个下降沿
			{
				TIM4CH4_CAPTURE_DOWNVAL = TIM_GetCapture4(TIM4);//记录下此时的定时器计数值
				if (TIM4CH4_CAPTURE_DOWNVAL < TIM4CH4_CAPTURE_UPVAL)
				{
					tim4_T4 = 65535;
				}
				else
					tim4_T4 = 0;
				tempup4 = TIM4CH4_CAPTURE_DOWNVAL - TIM4CH4_CAPTURE_UPVAL
						+ tim4_T4;		//得到总的高电平的时间
				pwmout4 = tempup4;		//总的高电平的时间
				TIM4CH4_CAPTURE_STA = 0;		//捕获标志位清零
				TIM_OC4PolarityConfig(TIM4, TIM_ICPolarity_Rising); //设置为上升沿捕获		  
			}
			else //发生捕获时间但不是下降沿,第一次捕获到上升沿,记录此时的定时器计数值
			{
				TIM4CH4_CAPTURE_UPVAL = TIM_GetCapture4(TIM4);		//获取上升沿数据
				TIM4CH4_CAPTURE_STA |= 0X40;		//标记已捕获到上升沿
				TIM_OC4PolarityConfig(TIM4, TIM_ICPolarity_Falling);//设置为下降沿捕获
			}
		}
	}
}
示例#28
0
void TIMER_INTERRUPT_FCN(void)
{
  #if TIMEBASE_TIMER == 6 || TIMEBASE_TIMER == 7 || TIMEBASE_TIMER == 18
  if (TIM_GetITStatus(MAKENAME(TIM,TIMEBASE_TIMER), TIM_IT_Update) != RESET)
  {
    TIM_ClearITPendingBit(MAKENAME(TIM,TIMEBASE_TIMER), TIM_IT_Update);
    timerCallback1();
  }
  #endif //TIMEBASE_TIMER == 6 || TIMEBASE_TIMER == 7 || TIMEBASE_TIMER == 18
  
  #if TIMEBASE_TIMER != 6 && TIMEBASE_TIMER != 7 && TIMEBASE_TIMER != 18
  #ifdef TIMEBASE_SIZE
  TIMEBASE_SIZE capture_val = 0;
  TIMEBASE_SIZE next_capture_val = 0;
  TIMEBASE_SIZE clock_val = 0;
  TIMEBASE_SIZE gap_val = 0;
  #endif
  
  if (TIM_GetITStatus(MAKENAME(TIM,TIMEBASE_TIMER), TIM_IT_CC1) != RESET)
  {
    TIM_ClearITPendingBit(MAKENAME(TIM,TIMEBASE_TIMER), TIM_IT_CC1);
    timerCallback1();
	  capture_val = TIM_GetCapture1(MAKENAME(TIM,TIMEBASE_TIMER));
    clock_val = TIM_GetCounter(MAKENAME(TIM,TIMEBASE_TIMER));
    gap_val = (TIMEBASE_SIZE) (SystemCoreClock/TIMEBASE_CLOCK_PSC  / TIMEBASE_INT1_FREQ - 1);
    next_capture_val = capture_val + gap_val;
    while( (((clock_val > next_capture_val) || (clock_val < capture_val)) && (capture_val < next_capture_val)) || ((clock_val > next_capture_val) && (clock_val < capture_val)) )
    {
      //increment capture and next_capture by gap_val
      capture_val += gap_val;
      next_capture_val = capture_val + gap_val;
      clock_val = TIM_GetCounter(MAKENAME(TIM,TIMEBASE_TIMER));
    }
    TIM_SetCompare1(MAKENAME(TIM,TIMEBASE_TIMER), next_capture_val);
  }
  #if defined(TIMEBASE_INT2_FREQ) && TIMEBASE_TIMER != 13 && TIMEBASE_TIMER != 14 && TIMEBASE_TIMER != 16 && TIMEBASE_TIMER != 17
  if (TIM_GetITStatus(MAKENAME(TIM,TIMEBASE_TIMER), TIM_IT_CC2) != RESET)
  {
    TIM_ClearITPendingBit(MAKENAME(TIM,TIMEBASE_TIMER), TIM_IT_CC2);
    timerCallback2();
    capture_val = TIM_GetCapture2(MAKENAME(TIM,TIMEBASE_TIMER));
    clock_val = TIM_GetCounter(MAKENAME(TIM,TIMEBASE_TIMER));
    gap_val = (TIMEBASE_SIZE) (SystemCoreClock/TIMEBASE_CLOCK_PSC  / TIMEBASE_INT2_FREQ - 1);
    next_capture_val = capture_val + gap_val;
    while( (((clock_val > next_capture_val) || (clock_val < capture_val)) && (capture_val < next_capture_val)) || ((clock_val > next_capture_val) && (clock_val < capture_val)) )
    {
      //increment capture and next_capture by gap_val
      capture_val += gap_val;
      next_capture_val = capture_val + gap_val;
      clock_val = TIM_GetCounter(MAKENAME(TIM,TIMEBASE_TIMER));
    }
    TIM_SetCompare2(MAKENAME(TIM,TIMEBASE_TIMER), next_capture_val);
  }
  #if defined(TIMEBASE_INT3_FREQ) && TIMEBASE_TIMER != 12 && TIMEBASE_TIMER != 15
  if (TIM_GetITStatus(MAKENAME(TIM,TIMEBASE_TIMER), TIM_IT_CC3) != RESET)
  {
    TIM_ClearITPendingBit(MAKENAME(TIM,TIMEBASE_TIMER), TIM_IT_CC3);
    timerCallback3();
    capture_val = TIM_GetCapture3(MAKENAME(TIM,TIMEBASE_TIMER));
    clock_val = TIM_GetCounter(MAKENAME(TIM,TIMEBASE_TIMER));
    gap_val = (TIMEBASE_SIZE) (SystemCoreClock/TIMEBASE_CLOCK_PSC  / TIMEBASE_INT3_FREQ - 1);
    next_capture_val = capture_val + gap_val;
    while( (((clock_val > next_capture_val) || (clock_val < capture_val)) && (capture_val < next_capture_val)) || ((clock_val > next_capture_val) && (clock_val < capture_val)) )
    {
      //increment capture and next_capture by gap_val
      capture_val += gap_val;
      next_capture_val = capture_val + gap_val;
      clock_val = TIM_GetCounter(MAKENAME(TIM,TIMEBASE_TIMER));
    }
    TIM_SetCompare3(MAKENAME(TIM,TIMEBASE_TIMER), next_capture_val);
  }
  #ifdef TIMEBASE_INT4_FREQ
  if (TIM_GetITStatus(MAKENAME(TIM,TIMEBASE_TIMER), TIM_IT_CC4) != RESET)
  {
    TIM_ClearITPendingBit(MAKENAME(TIM,TIMEBASE_TIMER), TIM_IT_CC4);
    timerCallback4();
    capture_val = TIM_GetCapture4(MAKENAME(TIM,TIMEBASE_TIMER));
    clock_val = TIM_GetCounter(MAKENAME(TIM,TIMEBASE_TIMER));
    gap_val = (TIMEBASE_SIZE) (SystemCoreClock/TIMEBASE_CLOCK_PSC  / TIMEBASE_INT4_FREQ - 1);
    next_capture_val = capture_val + gap_val;
    while( (((clock_val > next_capture_val) || (clock_val < capture_val)) && (capture_val < next_capture_val)) || ((clock_val > next_capture_val) && (clock_val < capture_val)) )
    {
      //increment capture and next_capture by gap_val
      capture_val += gap_val;
      next_capture_val = capture_val + gap_val;
      clock_val = TIM_GetCounter(MAKENAME(TIM,TIMEBASE_TIMER));
    }
    TIM_SetCompare4(MAKENAME(TIM,TIMEBASE_TIMER), next_capture_val);
  }
  #endif //TIMEBASE_INT4_FREQ
  #endif //defined(TIMEBASE_INT3_FREQ) && TIMEBASE_TIMER != 12 && TIMEBASE_TIMER != 15
  #endif //defined(TIMEBASE_INT2_FREQ) && TIMEBASE_TIMER != 13 && TIMEBASE_TIMER != 14 && TIMEBASE_TIMER != 16 && TIMEBASE_TIMER != 17
  #endif //TIMEBASE_TIMER != 6 || TIMEBASE_TIMER != 7 || TIMEBASE_TIMER != 18

}
示例#29
0
void TIM3_IRQHandler()
{
	
//	int i;
//	i++;
//	TIM_ClearITPendingBit(TIM3, TIM3_IRQn);
//	TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);
//	TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
//	TIM_ClearITPendingBit(TIM3, TIM_IT_CC3);
//	TIM_ClearITPendingBit(TIM3, TIM_IT_CC4);
//	if ( TIM_GetFlagStatus(TIM3, TIM_FLAG_CC1))
//	{i++;}
//	if ( TIM_GetFlagStatus(TIM3, TIM_FLAG_CC2))
//	{i++;}
//	if ( TIM_GetFlagStatus(TIM3, TIM_FLAG_CC3))
//	{i++;}
//	if ( TIM_GetFlagStatus(TIM3, TIM_FLAG_CC4))
//	{i++;}
	
	if (TIM_GetFlagStatus(TIM3, TIM_FLAG_CC1))//проверяем что прерывание вызвал канал 1
	{
		if ( TIM3->CCER & TIM_CCER_CC1P)
		{
			/*проверка что бы проходили циклически по записям массива фронтов*/
			if (modCounter_FallCounter[CH_1]== MEASURE_BUFFER - 1)
				modCounter_FallCounter[CH_1]=0;
			else
				modCounter_FallCounter[CH_1]++;

			modCounter_Falls[CH_1][modCounter_FallCounter[CH_1]] = TIM_GetCapture1(TIM3);//записываем значение захвата
			
			modCounter_WritePending |= CH_1_DOWN;//указываем что произошел новый спад
			TIM3->CCER &= ~(TIM_CCER_CC1P);// перенастройка канала на захват по нарастающему фронту
		}
		else
		{
			/*проверка что бы проходили циклически по записям массива фронтов*/
			if (modCounter_RiseCounter[CH_1]== MEASURE_BUFFER -1)
				modCounter_RiseCounter[CH_1]=0;
			else
				modCounter_RiseCounter[CH_1]++;
			
			modCounter_Rises[CH_1][modCounter_RiseCounter[CH_1]] = TIM_GetCapture1(TIM3);//записываем значение захвата

			modCounter_WritePending |= CH_1_UP;//указываем что произошел подьем
			TIM3->CCER |= TIM_CCER_CC1P;//перенастройка канала на захват по спадающему фронту
		}
		TIM_ClearITPendingBit(TIM3, TIM_Channel_1);
	}
	
	if ( TIM_GetFlagStatus(TIM3, TIM_FLAG_CC2))//проверяем что прерывание вызвал канал 2
	{
		if ( TIM3->CCER & TIM_CCER_CC2P)
		{
			/*проверка что бы проходили циклически по записям массива фронтов*/
			if (modCounter_FallCounter[CH_2]== MEASURE_BUFFER - 1)
				modCounter_FallCounter[CH_2]=0;
			else
				modCounter_FallCounter[CH_2]++;

			modCounter_Falls[CH_2][modCounter_FallCounter[CH_2]] = TIM_GetCapture2(TIM3);//записываем значение захвата
			
			modCounter_WritePending |= CH_2_DOWN;//указываем что произошел новый спад
			TIM3->CCER &= ~(TIM_CCER_CC2P);// перенастройка канала на захват по нарастающему фронту
		}
		else
		{
			/*проверка что бы проходили циклически по записям массива фронтов*/
			if (modCounter_RiseCounter[CH_2] == MEASURE_BUFFER -1)
				modCounter_RiseCounter[CH_2]=0;
			else
				modCounter_RiseCounter[CH_2]++;
			
			modCounter_Rises[CH_2][modCounter_RiseCounter[CH_2]] = TIM_GetCapture2(TIM3);//записываем значение захвата

			modCounter_WritePending |= CH_2_UP;//указываем что произошел подьем
			TIM3->CCER |= TIM_CCER_CC2P;//перенастройка канала на захват по спадающему фронту
		}
		TIM_ClearITPendingBit(TIM3, TIM_Channel_2);
	}
	
	if ( TIM_GetFlagStatus(TIM3, TIM_FLAG_CC3))//проверяем что прерывание вызвал канал 3
	{
		if ( TIM3->CCER & TIM_CCER_CC3P) //если канал 3 настроен на захват спадающего фронта 
		{
			/*проверка что бы проходили циклически по записям массива фронтов*/
			if (modCounter_FallCounter[CH_3]== MEASURE_BUFFER - 1)
				modCounter_FallCounter[CH_3]=0;
			else
				modCounter_FallCounter[CH_3]++;

			modCounter_Falls[CH_3][modCounter_FallCounter[CH_3]] = TIM_GetCapture3(TIM3);//записываем значение захвата
			
			modCounter_WritePending |= CH_3_DOWN;//указываем что произошел новый спад
			TIM3->CCER &= ~(TIM_CCER_CC3P);// перенастройка канала на захват по нарастающему фронту
		}
		else
		{
			/*проверка что бы проходили циклически по записям массива фронтов*/
			if (modCounter_RiseCounter[CH_3]== MEASURE_BUFFER -1)
				modCounter_RiseCounter[CH_3]=0;
			else
				modCounter_RiseCounter[CH_3]++;
			
			modCounter_Rises[CH_3][modCounter_RiseCounter[CH_3]] = TIM_GetCapture3(TIM3);//записываем значение захвата

			modCounter_WritePending |= CH_3_UP;//указываем что произошел подьем
			TIM3->CCER |= TIM_CCER_CC3P;//перенастройка канала на захват по спадающему фронту
		}
		TIM_ClearITPendingBit(TIM3, TIM_Channel_3);//сброс бита прерывания
		
	}
	if ( TIM_GetFlagStatus(TIM3, TIM_FLAG_CC4))//проверяем что прерывание вызвал канал 3
	{
		if ( TIM3->CCER & TIM_CCER_CC4P) //если канал 3 настроен на захват спадающего фронта 
		{
			/*проверка что бы проходили циклически по записям массива фронтов*/
			if (modCounter_FallCounter[CH_4]== MEASURE_BUFFER - 1)
				modCounter_FallCounter[CH_4]=0;
			else
				modCounter_FallCounter[CH_4]++;

			modCounter_Falls[CH_4][modCounter_FallCounter[CH_4]] = TIM_GetCapture4(TIM3);//записываем значение захвата
			
			modCounter_WritePending |= CH_4_DOWN;//указываем что произошел новый спад
			TIM3->CCER &= ~(TIM_CCER_CC4P);// перенастройка канала на захват по нарастающему фронту
		}
		else
		{
			/*проверка что бы проходили циклически по записям массива фронтов*/
			if (modCounter_RiseCounter[CH_4]== MEASURE_BUFFER -1)
				modCounter_RiseCounter[CH_4]=0;
			else
				modCounter_RiseCounter[CH_4]++;
			
			modCounter_Rises[CH_4][modCounter_RiseCounter[CH_4]] = TIM_GetCapture4(TIM3);//записываем значение захвата

			modCounter_WritePending |= CH_4_UP;//указываем что произошел подьемs
			TIM3->CCER |= TIM_CCER_CC4P;//перенастройка канала на захват по спадающему фронту
		}
		TIM_ClearITPendingBit(TIM3, TIM_Channel_4);//сброс бита прерывания
		
	}
	
	
}
示例#30
0
文件: pios_tim.c 项目: Gussy/TauLabs
static void PIOS_TIM_generic_irq_handler(TIM_TypeDef * timer)
{
	/* Iterate over all registered clients of the TIM layer to find channels on this timer */
	for (uint8_t i = 0; i < pios_tim_num_devs; i++) {
		const struct pios_tim_dev * tim_dev = &pios_tim_devs[i];

		if (!tim_dev->channels || tim_dev->num_channels == 0) {
			/* No channels to process on this client */
			continue;
		}

		/* Check for an overflow event on this timer */
		bool overflow_event;
		uint16_t overflow_count;
		if (TIM_GetITStatus(timer, TIM_IT_Update) == SET) {
			TIM_ClearITPendingBit(timer, TIM_IT_Update);
			overflow_count = timer->ARR;
			overflow_event = true;
		} else {
			overflow_count = 0;
			overflow_event = false;
		}

		for (uint8_t j = 0; j < tim_dev->num_channels; j++) {
			const struct pios_tim_channel * chan = &tim_dev->channels[j];

			if (chan->timer != timer) {
				/* channel is not on this timer */
				continue;
			}

			/* Figure out which interrupt bit we should be looking at */
			uint16_t timer_it;
			switch (chan->timer_chan) {
			case TIM_Channel_1:
				timer_it = TIM_IT_CC1;
				break;
			case TIM_Channel_2:
				timer_it = TIM_IT_CC2;
				break;
			case TIM_Channel_3:
				timer_it = TIM_IT_CC3;
				break;
			case TIM_Channel_4:
				timer_it = TIM_IT_CC4;
				break;
			default:
				PIOS_Assert(0);
				break;
			}

			bool edge_event;
			uint16_t edge_count;
			if (TIM_GetITStatus(chan->timer, timer_it) == SET) {
				TIM_ClearITPendingBit(chan->timer, timer_it);

				/* Read the current counter */
				switch(chan->timer_chan) {
				case TIM_Channel_1:
					edge_count = TIM_GetCapture1(chan->timer);
					break;
				case TIM_Channel_2:
					edge_count = TIM_GetCapture2(chan->timer);
					break;
				case TIM_Channel_3:
					edge_count = TIM_GetCapture3(chan->timer);
					break;
				case TIM_Channel_4:
					edge_count = TIM_GetCapture4(chan->timer);
					break;
				default:
					PIOS_Assert(0);
					break;
				}
				edge_event = true;
			} else {
				edge_event = false;
				edge_count = 0;
			}

			if (!tim_dev->callbacks) {
				/* No callbacks registered, we're done with this channel */
				continue;
			}

			/* Generate the appropriate callbacks */
			if (overflow_event & edge_event) {
				/*
				 * When both edge and overflow happen in the same interrupt, we
				 * need a heuristic to determine the order of the edge and overflow
				 * events so that the callbacks happen in the right order.  If we
				 * get the order wrong, our pulse width calculations could be off by up
				 * to ARR ticks.  That could be bad.
				 *
				 * Heuristic: If the edge_count is < 16 ticks above zero then we assume the
				 *            edge happened just after the overflow.
				 */

				if (edge_count < 16) {
					/* Call the overflow callback first */
					if (tim_dev->callbacks->overflow) {
						(*tim_dev->callbacks->overflow)((uintptr_t)tim_dev,
									tim_dev->context,
									j,
									overflow_count);
					}
					/* Call the edge callback second */
					if (tim_dev->callbacks->edge) {
						(*tim_dev->callbacks->edge)((uintptr_t)tim_dev,
									tim_dev->context,
									j,
									edge_count);
					}
				} else {
					/* Call the edge callback first */
					if (tim_dev->callbacks->edge) {
						(*tim_dev->callbacks->edge)((uintptr_t)tim_dev,
									tim_dev->context,
									j,
									edge_count);
					}
					/* Call the overflow callback second */
					if (tim_dev->callbacks->overflow) {
						(*tim_dev->callbacks->overflow)((uintptr_t)tim_dev,
									tim_dev->context,
									j,
									overflow_count);
					}
				}
			} else if (overflow_event && tim_dev->callbacks->overflow) {
				(*tim_dev->callbacks->overflow)((uintptr_t)tim_dev,
								tim_dev->context,
								j,
								overflow_count);
			} else if (edge_event && tim_dev->callbacks->edge) {
				(*tim_dev->callbacks->edge)((uintptr_t)tim_dev,
							tim_dev->context,
							j,
							edge_count);
			}
		}
	}
}