/** * @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); }
/** * @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); }
/* 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); }