Пример #1
0
/**
  * @brief  Configure TIM1 to to capture the internal clock source (LSI)
  * @param  None
  * @retval None
  */
static void TIM1_Config(void)
{
  TIM1_ICInit( TIM1_CHANNEL_1, TIM1_ICPOLARITY_FALLING, TIM1_ICSELECTION_DIRECTTI,
               TIM1_ICPSC_DIV8, 0x0);
  
  /* Enable TIM1 */
  TIM1_Cmd(ENABLE);

  /* Clear CC1 Flag*/
  TIM1_ClearFlag(TIM1_FLAG_CC1);
  
  /* wait a capture on CC1 */
  while((TIM1->SR1 & TIM1_FLAG_CC1) != TIM1_FLAG_CC1);
  /* Get CCR1 value*/
  ICValue1 = TIM1_GetCapture1();
  TIM1_ClearFlag(TIM1_FLAG_CC1);
  
  /* wait a capture on cc1 */
  while((TIM1->SR1 & TIM1_FLAG_CC1) != TIM1_FLAG_CC1);
  /* Get CCR1 value*/
  ICValue2 = TIM1_GetCapture1();
  TIM1_ClearFlag(TIM1_FLAG_CC1);
}
Пример #2
0
/**
  * @brief Measure the LSI frequency using timer IC1 and update the calibration registers.
  * @par Parameters:
  * None
  * @retval 
	* None
  * @par Required preconditions:
  * It is recommanded to use a timer clock frequency of at least 10MHz in order 
	* to obtain a better in the LSI frequency measurement.
  */
u32 LSIMeasurment(void)
{

  u32 lsi_freq_hz = 0x0;
  u32 fmaster = 0x0;
  u16 ICValue1 = 0x0;
  u16 ICValue2 = 0x0;

  /* Get master frequency */
  fmaster = CLK_GetClockFreq();

  /* Enable the LSI measurement: LSI clock connected to timer Input Capture 1 */
  AWU->CSR |= AWU_CSR_MSR;

#if defined (STM8S903) || defined (STM8S103)
  /* Measure the LSI frequency with TIMER Input Capture 1 */
  
  /* Capture only every 8 events!!! */
  /* Enable capture of TI1 */
	TIM1_ICInit(TIM1_CHANNEL_1, TIM1_ICPOLARITY_RISING, TIM1_ICSELECTION_DIRECTTI, TIM1_ICPSC_DIV8, 0);
	
  /* Enable TIM1 */
  TIM1_Cmd(ENABLE);
  
  /* wait a capture on cc1 */
  while((TIM1->SR1 & TIM1_FLAG_CC1) != TIM1_FLAG_CC1);
  /* Get CCR1 value*/
  ICValue1 = TIM1_GetCapture1();
  TIM1_ClearFlag(TIM1_FLAG_CC1);
  
  /* wait a capture on cc1 */
  while((TIM1->SR1 & TIM1_FLAG_CC1) != TIM1_FLAG_CC1);
  /* Get CCR1 value*/
  ICValue2 = TIM1_GetCapture1();
  TIM1_ClearFlag(TIM1_FLAG_CC1);
  
  /* Disable IC1 input capture */
  TIM1->CCER1 &= (u8)(~TIM1_CCER1_CC1E);
  /* Disable timer2 */
  TIM1_Cmd(DISABLE);
  
#else  
  /* Measure the LSI frequency with TIMER Input Capture 1 */
  
  /* Capture only every 8 events!!! */
  /* Enable capture of TI1 */
  TIM3_ICInit(TIM3_CHANNEL_1, TIM3_ICPOLARITY_RISING, TIM3_ICSELECTION_DIRECTTI, TIM3_ICPSC_DIV8, 0);

  /* Enable TIM3 */
  TIM3_Cmd(ENABLE);

	/* wait a capture on cc1 */
  while ((TIM3->SR1 & TIM3_FLAG_CC1) != TIM3_FLAG_CC1);
	/* Get CCR1 value*/
  ICValue1 = TIM3_GetCapture1();
  TIM3_ClearFlag(TIM3_FLAG_CC1);

  /* wait a capture on cc1 */
  while ((TIM3->SR1 & TIM3_FLAG_CC1) != TIM3_FLAG_CC1);
    /* Get CCR1 value*/
  ICValue2 = TIM3_GetCapture1();
	TIM3_ClearFlag(TIM3_FLAG_CC1);

  /* Disable IC1 input capture */
  TIM3->CCER1 &= (u8)(~TIM3_CCER1_CC1E);
  /* Disable timer3 */
  TIM3_Cmd(DISABLE);
#endif

  /* Compute LSI clock frequency */
  lsi_freq_hz = (8 * fmaster) / (ICValue2 - ICValue1);
  
  /* Disable the LSI measurement: LSI clock disconnected from timer Input Capture 1 */
  AWU->CSR &= (u8)(~AWU_CSR_MSR);

 return (lsi_freq_hz);
}
Пример #3
0
/* Configures the used Timers. ----------------------------------------------*/
void TIM_Configuration(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure2;
    TIM_OCInitTypeDef  TIM_OCInitStructure3;
    TIM_OCInitTypeDef  TIM_OCInitStructure8;

    /* TIM2 configuration for LED -------------------------------------------*/
    TIM_TimeBaseStructure.TIM_Period = 0x12B; 				//299
    TIM_TimeBaseStructure.TIM_Prescaler = 0xEA5F;       	//59999
    TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
    /* Outoput Compare Init */
    TIM_OCStructInit(&TIM_OCInitStructure2);
    /* Output Compare Timing Mode configuration: Channel1 */
    TIM_OCInitStructure2.TIM_OCMode = TIM_OCMode_Timing;
    TIM_OCInitStructure2.TIM_Pulse = 0x0;
    TIM_OCInit(TIM2, &TIM_OCInitStructure2);
    /* TIM2 enable counter */
    TIM_Cmd(TIM2, ENABLE);
    /* Immediate load of TIM2 Precaler value */
    TIM_PrescalerConfig(TIM2, 0xEA5F, TIM_PSCReloadMode_Immediate);
    /* Clear TIM2 update pending flag */
    TIM_ClearFlag(TIM2, TIM_FLAG_Update);
    /* Enable TIM2 Update interrupt */
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);

    /* TIM3 configuration for Statemachine (main control loop) --------------*/
    TIM_TimeBaseStructure.TIM_Period = 1000; 				//alle 1ms
    TIM_TimeBaseStructure.TIM_Prescaler = 0x48;       	//72
    TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
    /* Outoput Compare Init */
    TIM_OCStructInit(&TIM_OCInitStructure3);
    /* Output Compare Timing Mode configuration: Channel1 */
    TIM_OCInitStructure3.TIM_OCMode = TIM_OCMode_Timing;
    TIM_OCInitStructure3.TIM_Pulse = 0x0;
    TIM_OCInit(TIM3, &TIM_OCInitStructure3);
    /* TIM3 enable counter */
    TIM_Cmd(TIM3, ENABLE);
    /* Immediate load of TIM3 Precaler value */
    TIM_PrescalerConfig(TIM3, 0x48, TIM_PSCReloadMode_Immediate);
    /* Clear TIM3 update pending flag */
    TIM_ClearFlag(TIM3, TIM_FLAG_Update);
    /* Enable TIM3 Update interrupt */
    // enable in main after powerup
    //TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);


    /* Timer for PPM decode ---------------------------------------------------*/
    TIM1_ICInitTypeDef TIM1_ICInitStructure;
    //TIM_ICInitStructure.TIM_ICMode = TIM_ICMode_ICAP;
#ifndef PPM_PA11
    TIM1_ICInitStructure.TIM1_Channel = TIM1_Channel_1;   //Pin: PA8
#else
    TIM1_ICInitStructure.TIM1_Channel = TIM1_Channel_4;   //Pin: PA11
#endif
    TIM1_ICInitStructure.TIM1_ICPolarity = TIM1_ICPolarity_Falling;
    TIM1_ICInitStructure.TIM1_ICSelection = TIM1_ICSelection_DirectTI;
    TIM1_ICInitStructure.TIM1_ICPrescaler = TIM1_ICPSC_DIV1;
    TIM1_ICInitStructure.TIM1_ICFilter = 0x0;
    TIM1_ICInit(&TIM1_ICInitStructure);

    TIM1_SelectInputTrigger(TIM1_TS_TI2FP2);

    TIM1_InternalClockConfig();
    TIM1_TimeBaseInitTypeDef TIM1_TimeBaseStructure;
    TIM1_TimeBaseStructure.TIM1_Period = 0xFFFF;
    TIM1_TimeBaseStructure.TIM1_Prescaler = 17; // fCK_PSC / (17 + 1) 1ms = 4000
    TIM1_TimeBaseStructure.TIM1_ClockDivision = TIM1_CKD_DIV1;
    TIM1_TimeBaseStructure.TIM1_CounterMode = TIM1_CounterMode_Up;
    TIM1_TimeBaseInit(& TIM1_TimeBaseStructure);

    /* TIM enable counter */
    TIM1_Cmd(ENABLE);
    /* Enable the CC1 Interrupt Request */
#ifndef PPM_PA11
    TIM1_ITConfig(TIM_IT_CC1, ENABLE);
#else
    TIM1_ITConfig(TIM_IT_CC4, ENABLE);
#endif

    /* Timer for Servo 0-3 --------------------------------------------------*/
    /* Time base configuration */
    TIM_TimeBaseStructure.TIM_Period = 5999;
    TIM_TimeBaseStructure.TIM_Prescaler = 72;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

    TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);

    /* PWM1 Mode configuration: Channel1 */
    TIM_OCInitStructure8.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure8.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure8.TIM_Channel = TIM_Channel_1;
    TIM_OCInitStructure8.TIM_Pulse = 1500;
    TIM_OCInitStructure8.TIM_OCPolarity = TIM_OCPolarity_High; // maybee it works with TIM_OCPolarity_LOW???

    TIM_OCInit(TIM8, &TIM_OCInitStructure8);

    TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable);

    /* PWM1 Mode configuration: Channel2 */
    TIM_OCInitStructure8.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure8.TIM_Channel = TIM_Channel_2;
    TIM_OCInitStructure8.TIM_Pulse = 1500;

    TIM_OCInit(TIM8, &TIM_OCInitStructure8);

    TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable);

    /* PWM1 Mode configuration: Channel3 */
    TIM_OCInitStructure8.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure8.TIM_Channel = TIM_Channel_3;
    TIM_OCInitStructure8.TIM_Pulse = 1500;

    TIM_OCInit(TIM8, &TIM_OCInitStructure8);

    TIM_OC3PreloadConfig(TIM8, TIM_OCPreload_Enable);

    /* PWM1 Mode configuration: Channel4 */
    TIM_OCInitStructure8.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure8.TIM_Channel = TIM_Channel_4;
    TIM_OCInitStructure8.TIM_Pulse = 1500;

    TIM_OCInit(TIM8, &TIM_OCInitStructure8);

    TIM_OC4PreloadConfig(TIM8, TIM_OCPreload_Enable);

    TIM_ARRPreloadConfig(TIM8, ENABLE);

    /* Enable the TIM Main Output only needed for timer 1 and 8*/
    TIM8->BDTR |= ((u16)0x8000); //BDTR_MOE_Set;

    /* TIM8 enable counter */
    TIM_Cmd(TIM8, ENABLE);
    /* Immediate load of TIM8 Precaler value */
    //TIM_PrescalerConfig(TIM8, 72, TIM_PSCReloadMode_Immediate);
    /* Clear TIM8 update pending flag */
    //TIM_ClearFlag(TIM8, TIM_FLAG_Update);
}