text: /**
    ******************************************************************************
    * @file    TIM/TIM_TimeBase/main.c 
    * @author  MCD Application Team
    * @version V1.8.0
    * @date    04-November-2016
    * @brief   Main program body
    ******************************************************************************
    * @attention
    *
    * <h2><center>&copy; COPYRIGHT 2016 STMicroelectronics</center></h2>
    *
    * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
    * You may not use this file except in compliance with the License.
    * You may obtain a copy of the License at:
    *
    *        http://www.st.com/software_license_agreement_liberty_v2
    *
    * Unless required by applicable law or agreed to in writing, software 
    * distributed under the License is distributed on an "AS IS" BASIS, 
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    * See the License for the specific language governing permissions and
    * limitations under the License.
    *
    ******************************************************************************
    */
  
  /* Includes ------------------------------------------------------------------*/
  #include "stm32f4xx.h"
  #include "main.h"
  
  /** @addtogroup STM32F4xx_StdPeriph_Examples
    * @{
    */
  
  /** @addtogroup TIM_TimeBase
    * @{
    */ 
  
  /* Private typedef -----------------------------------------------------------*/
  /* Private define ------------------------------------------------------------*/
  /* Private macro -------------------------------------------------------------*/
  /* Private variables ---------------------------------------------------------*/
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_OCInitTypeDef  TIM_OCInitStructure;
  __IO uint16_t CCR1_Val = 40961;
  __IO uint16_t CCR2_Val = 27309;
  __IO uint16_t CCR3_Val = 13654;
  __IO uint16_t CCR4_Val = 6826;
  uint16_t PrescalerValue = 0;
  
  /* Private function prototypes -----------------------------------------------*/
  void TIM_Config(void);
  
  /* Private functions ---------------------------------------------------------*/
  
  /**
    * @brief  Main program
    * @param  None
    * @retval None
    */
  int main(void)
  {
    /*!< At this stage the microcontroller clock setting is already configured, 
         this is done through SystemInit() function which is called from startup
         files (startup_stm32f40_41xxx.s/startup_stm32f427_437xx.s/startup_stm32f429_439xx.s)
         before to branch to application main. 
         To reconfigure the default setting of SystemInit() function, refer to
         system_stm32f4xx.c file
       */
  
    /* TIM Configuration */
    TIM_Config();
    
    /* -----------------------------------------------------------------------
      TIM3 Configuration: Output Compare Timing Mode:
      
      In this example TIM3 input clock (TIM3CLK) is set to 2 * APB1 clock (PCLK1), 
      since APB1 prescaler is different from 1.   
        TIM3CLK = 2 * PCLK1  
        PCLK1 = HCLK / 4 
        => TIM3CLK = HCLK / 2 = SystemCoreClock /2
            
      To get TIM3 counter clock at 6 MHz, the prescaler is computed as follows:
         Prescaler = (TIM3CLK / TIM3 counter clock) - 1
         Prescaler = ((SystemCoreClock /2) /6 MHz) - 1
                                                
      CC1 update rate = TIM3 counter clock / CCR1_Val = 146.48 Hz
      ==> Toggling frequency = 73.24 Hz
      
      C2 update rate = TIM3 counter clock / CCR2_Val = 219.7 Hz
      ==> Toggling frequency = 109.8 Hz
      
      CC3 update rate = TIM3 counter clock / CCR3_Val = 439.4 Hz
      ==> Toggling frequency = 219.7 Hz
      
      CC4 update rate = TIM3 counter clock / CCR4_Val = 878.9 Hz
      ==> Toggling frequency = 439.4 Hz
  
      Note: 
       SystemCoreClock variable holds HCLK frequency and is defined in system_stm32f4xx.c file.
       Each time the core clock (HCLK) changes, user had to call SystemCoreClockUpdate()
       function to update SystemCoreClock variable value. Otherwise, any configuration
       based on this variable will be incorrect.    
    ----------------------------------------------------------------------- */   
  
  
    /* Compute the prescaler value */
    PrescalerValue = (uint16_t) ((SystemCoreClock / 2) / 6000000) - 1;
  
    /* Time base configuration */
    TIM_TimeBaseStructure.TIM_Period = 65535;
    TIM_TimeBaseStructure.TIM_Prescaler = 0;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  
    /* Prescaler configuration */
    TIM_PrescalerConfig(TIM3, PrescalerValue, TIM_PSCReloadMode_Immediate);
  
    /* Output Compare Timing Mode configuration: Channel1 */
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  
    TIM_OC1Init(TIM3, &TIM_OCInitStructure);
  
    TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Disable);
  
    /* Output Compare Timing Mode configuration: Channel2 */
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
  
    TIM_OC2Init(TIM3, &TIM_OCInitStructure);
  
    TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Disable);
  
    /* Output Compare Timing Mode configuration: Channel3 */
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = CCR3_Val;
  
    TIM_OC3Init(TIM3, &TIM_OCInitStructure);
  
    TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Disable);
  
    /* Output Compare Timing Mode configuration: Channel4 */
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = CCR4_Val;
  
    TIM_OC4Init(TIM3, &TIM_OCInitStructure);
  
    TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Disable);
     
    /* TIM Interrupts enable */
    TIM_ITConfig(TIM3, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4, ENABLE);
  
    /* TIM3 enable counter */
    TIM_Cmd(TIM3, ENABLE);
  
    while (1);
  }
  
  /**
    * @brief  Configures the TIM IRQ Handler.
    * @param  None
    * @retval None
    */
  void TIM_Config(void)
  {
    NVIC_InitTypeDef NVIC_InitStructure;
  
    /* TIM3 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);
  
    /* Initialize Leds mounted on STM324xG-EVAL board */
    STM_EVAL_LEDInit(LED1);
    STM_EVAL_LEDInit(LED2);
    STM_EVAL_LEDInit(LED3);
    STM_EVAL_LEDInit(LED4);
  
    /* Turn on LED1, LED2, LED3 and LED4 */
    STM_EVAL_LEDOn(LED1);
    STM_EVAL_LEDOn(LED2);
    STM_EVAL_LEDOn(LED3);
    STM_EVAL_LEDOn(LED4);
  }
  
  #ifdef  USE_FULL_ASSERT
  
  /**
    * @brief  Reports the name of the source file and the source line number
    *         where the assert_param error has occurred.
    * @param  file: pointer to the source file name
    * @param  line: assert_param error line source number
    * @retval None
    */
  void assert_failed(uint8_t* file, uint32_t line)
  {
    /* User can add his own implementation to report the file name and line number,
       ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  
    while (1)
    {}
  }
  #endif
  
  /**
    * @}
    */ 
  
  /**
    * @}
    */ 
  
  /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
  