text: /**
    ******************************************************************************
    * @file    Examples_LL/LPTIM/LPTIM_PulseCounter_Init/Src/main.c
    * @author  MCD Application Team
    * @brief   This example describes how to use the LPTIM in counter mode
    *          using the STM32F7xx LPTIM LL API.
    *          Peripheral initialization done using LL initialization function.
    ******************************************************************************
    * @attention
    *
    * Copyright (c) 2016 STMicroelectronics.
    * All rights reserved.
    *
    * This software is licensed under terms that can be found in the LICENSE file
    * in the root directory of this software component.
    * If no LICENSE file comes with this software, it is provided AS-IS.
    *
    ******************************************************************************
    */
  
  /* Includes ------------------------------------------------------------------*/
  #include "main.h"
  
  /** @addtogroup STM32F7xx_LL_Examples
    * @{
    */
  
  /** @addtogroup LPTIM_PulseCounter_Init
    * @{
    */
  
  /* Private typedef -----------------------------------------------------------*/
  /* Private define ------------------------------------------------------------*/
  /* Private macro -------------------------------------------------------------*/
  /* Private variables ---------------------------------------------------------*/
  /* Private function prototypes -----------------------------------------------*/
  void     SystemClock_Config(void);
  void     Enable_LSI(void);
  void     Configure_LPTIMCounter(void);
  void     EnterStop1Mode(void);
  void     LED_Init(void);
  static void CPU_CACHE_Enable(void);
  
  /* Private functions ---------------------------------------------------------*/
  
  /**
    * @brief  Main program
    * @param  None
    * @retval None
    */
  int main(void)
  {
    /* Enable the CPU Cache */
    CPU_CACHE_Enable();
  
    /* Configure the system clock to 216 MHz */
    SystemClock_Config();
  
    /* Initialize LED1 */
    LED_Init();
  
    /* Enable the LSI Clock */
    Enable_LSI();
    
    /* Configures LPTIM1 in counter mode */
    Configure_LPTIMCounter();
    
    /* Enter STOP 1 mode */
    EnterStop1Mode();
    
    /* Infinite loop */
    while (1)
    {
    }
  }
  
  /**
    * @brief  Enable Internal Low Speed Clock (LSI)
    * @param  None
    * @retval Status
    */
  void Enable_LSI(void)
  {
    /* Enable LSI Oscillator */
    LL_RCC_LSI_Enable();
    
    while(LL_RCC_LSI_IsReady() != 1) 
    {
    };
  }
  
  /**
    * @brief  Configures the LPTIM1 instance in counter mode. 
    * @param  None
    * @retval None
    */
  void Configure_LPTIMCounter(void)
  {
    LL_LPTIM_InitTypeDef    lptim_initstruct;
    
    /***************************************/
    /* Select LSI as LPTIM1 clock source */
    /***************************************/
    LL_RCC_SetLPTIMClockSource(LL_RCC_LPTIM1_CLKSOURCE_LSI);
    
    /*************************/
    /* GPIO AF configuration */
    /*************************/
    /* Enable the peripheral clock of GPIOs */
    LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOD);
    
    /* GPIO LPTIM1_IN1 configuration */
    LL_GPIO_SetPinMode(GPIOD, LL_GPIO_PIN_12, LL_GPIO_MODE_ALTERNATE);
    LL_GPIO_SetPinPull(GPIOD, LL_GPIO_PIN_12, LL_GPIO_PULL_DOWN);
    LL_GPIO_SetPinSpeed(GPIOD, LL_GPIO_PIN_12, LL_GPIO_SPEED_FREQ_HIGH);
    LL_GPIO_SetAFPin_8_15(GPIOD, LL_GPIO_PIN_12, LL_GPIO_AF_3);
  
    /*************************************************/
    /* Configure the NVIC to handle LPTIM1 interrupt */
    /*************************************************/
    NVIC_SetPriority(LPTIM1_IRQn, 0);
    NVIC_EnableIRQ(LPTIM1_IRQn);
  
    /******************************/
    /* Peripheral clocks enabling */
    /******************************/
    /* Enable the timer peripheral clock */
    LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_LPTIM1); 
  
    /****************************/
    /* LPTIM1 interrupts set-up */
    /****************************/
    /* LPTIM1 Interrupt Configuration: EXTI configuration */
    LL_EXTI_EnableIT_0_31(LL_EXTI_LINE_23);
    LL_EXTI_EnableRisingTrig_0_31(LL_EXTI_LINE_23);
    
    /* Clear LPTIM1 autoreload match flag */
    LL_LPTIM_ClearFLAG_ARRM(LPTIM1);
    
    /* Enable the Autoreload match Interrupt */
    LL_LPTIM_EnableIT_ARRM(LPTIM1);
    
    /*****************************/
    /* LPTIM1 configuration      */
    /*****************************/
    /* Set fields of initialization structure */
    lptim_initstruct.ClockSource = LL_LPTIM_CLK_SOURCE_INTERNAL;
    lptim_initstruct.Prescaler   = LL_LPTIM_PRESCALER_DIV1;
    lptim_initstruct.Waveform    = LL_LPTIM_OUTPUT_WAVEFORM_PWM;
    lptim_initstruct.Polarity    = LL_LPTIM_OUTPUT_POLARITY_REGULAR;
    
    /* Initialize LPTIM instance according to parameters defined in             */
    /* initialization structure.                                                */
    LL_LPTIM_Init(LPTIM1, &lptim_initstruct);
    
    /* The counter is incremented following each valid clock pulse on the LPTIM external Input1 */
    LL_LPTIM_SetCounterMode(LPTIM1, LL_LPTIM_COUNTER_MODE_EXTERNAL);
    
    /*****************************/
    /* Enable the LPTIM1 counter */
    /*****************************/
    LL_LPTIM_Enable(LPTIM1);
    
    /****************************/
    /* Set the Autoreload value */
    /****************************/
    LL_LPTIM_SetAutoReload(LPTIM1, 1000);
    
    /************************/
    /* Start LPTIM1 counter */
    /************************/
    /* Start the LPTIM counter in continuous mode */
    LL_LPTIM_StartCounter(LPTIM1, LL_LPTIM_OPERATING_MODE_CONTINUOUS);
  }
  
  /**
    * @brief  Function to configure and enter in STOP 1 Mode.
    * @param  None
    * @retval None
    */
  void EnterStop1Mode(void)
  {
      /* Enter STOP mode */
      LL_PWR_SetPowerMode(LL_PWR_MODE_STOP_MAINREGU);
  
      /* Set SLEEPDEEP bit of Cortex System Control Register */
      LL_LPM_EnableDeepSleep();  
  
      /* Request Wait For Interrupt */
      __WFI();
  
  }
  
  /**
    * @brief  Initialize LED1.
    * @param  None
    * @retval None
    */
  void LED_Init(void)
  {
    /* Enable the LED1 Clock */
    LED1_GPIO_CLK_ENABLE();
  
    /* Configure IO in output push-pull mode to drive external LED1 */
    LL_GPIO_SetPinMode(LED1_GPIO_PORT, LED1_PIN, LL_GPIO_MODE_OUTPUT);
    /* Reset value is LL_GPIO_OUTPUT_PUSHPULL */
    //LL_GPIO_SetPinOutputType(LED1_GPIO_PORT, LED1_PIN, LL_GPIO_OUTPUT_PUSHPULL);
    /* Reset value is LL_GPIO_SPEED_FREQ_LOW */
    //LL_GPIO_SetPinSpeed(LED1_GPIO_PORT, LED1_PIN, LL_GPIO_SPEED_FREQ_LOW);
    /* Reset value is LL_GPIO_PULL_NO */
    //LL_GPIO_SetPinPull(LED1_GPIO_PORT, LED1_PIN, LL_GPIO_PULL_NO);
  }
  
  /**
    * @brief  System Clock Configuration
    *         The system Clock is configured as follow :
    *            System Clock source            = PLL (HSE)
    *            SYSCLK(Hz)                     = 216000000
    *            HCLK(Hz)                       = 216000000
    *            AHB Prescaler                  = 1
    *            APB1 Prescaler                 = 4
    *            APB2 Prescaler                 = 2
    *            HSI Frequency(Hz)              = 8000000
    *            PLL_M                          = 8
    *            PLL_N                          = 432
    *            PLL_P                          = 2
    *            VDD(V)                         = 3.3
    *            Main regulator output voltage  = Scale1 mode
    *            Flash Latency(WS)              = 7
    * @param  None
    * @retval None
    */
  void SystemClock_Config(void)
  {
    /* Enable HSE clock */
    LL_RCC_HSE_EnableBypass();
    LL_RCC_HSE_Enable();
    while(LL_RCC_HSE_IsReady() != 1)
    {
    };
  
    /* Set FLASH latency */
    LL_FLASH_SetLatency(LL_FLASH_LATENCY_7);
  
    /* Enable PWR clock */
    LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR);
  
    /* Activation OverDrive Mode */
    LL_PWR_EnableOverDriveMode();
    while(LL_PWR_IsActiveFlag_OD() != 1)
    {
    };
  
    /* Activation OverDrive Switching */
    LL_PWR_EnableOverDriveSwitching();
    while(LL_PWR_IsActiveFlag_ODSW() != 1)
    {
    };
  
    /* Main PLL configuration and activation */
    LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSE, LL_RCC_PLLM_DIV_8, 432, LL_RCC_PLLP_DIV_2);
    LL_RCC_PLL_Enable();
    while(LL_RCC_PLL_IsReady() != 1)
    {
    };
  
    /* Sysclk activation on the main PLL */
    LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1);
    LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL);
    while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL)
    {
    };
  
    /* Set APB1 & APB2 prescaler */
    LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_4);
    LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_2);
  
    /* Set systick to 1ms */
    SysTick_Config(216000000 / 1000);
  
    /* Update CMSIS variable (which can be updated also through SystemCoreClockUpdate function) */
    SystemCoreClock = 216000000;
  }
  
  /**
    * @brief  CPU L1-Cache enable.
    * @param  None
    * @retval None
    */
  static void CPU_CACHE_Enable(void)
  {
    /* Enable I-Cache */
    SCB_EnableICache();
  
    /* Enable D-Cache */
    SCB_EnableDCache();
  }
  
  /******************************************************************************/
  /*   USER IRQ HANDLER TREATMENT                                               */
  /******************************************************************************/
  /**
    * @brief  LPTimer Autoreload match interrupt processing
    * @param  None
    * @retval None
    */
  void LPTimerAutoreloadMatch_Callback(void)
  {
    LL_GPIO_TogglePin(LED1_GPIO_PORT, LED1_PIN);  
  }
  
  #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", file, line) */
  
    /* Infinite loop */
    while (1)
    {
    }
  }
  #endif
  
  /**
    * @}
    */
  
  /**
    * @}
    */
  
  