/* USER CODE BEGIN Header */

/**
 ******************************************************************************
 * @file    stm32l4xx_hal_timebase_TIM.c
 * @brief   HAL time base based on the hardware TIM.
 ******************************************************************************
 * @attention
 *
 * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
 * All rights reserved.</center></h2>
 *
 * This software component is licensed by ST under Ultimate Liberty license
 * SLA0044, the "License"; You may not use this file except in compliance with
 * the License. You may obtain a copy of the License at:
 *                             www.st.com/SLA0044
 *
 ******************************************************************************
 */
/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
#include "stm32l4xx_hal.h"
#include "stm32l4xx_hal_tim.h"

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
TIM_HandleTypeDef htim3;
uint32_t uwIncrementState = 0;
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/

/**
 * @brief  This function configures the TIM3 as a time base source.
 *         The time source is configured  to have 1ms time base with a dedicated
 *         Tick interrupt priority.
 * @note   This function is called  automatically at the beginning of program after
 *         reset by HAL_Init() or at any time when clock is configured, by HAL_RCC_ClockConfig().
 * @param  TickPriority: Tick interrupt priority.
 * @retval HAL status
 */
HAL_StatusTypeDef HAL_InitTick( uint32_t TickPriority )
{
    RCC_ClkInitTypeDef clkconfig;
    uint32_t uwTimclock = 0;
    uint32_t uwPrescalerValue = 0;
    uint32_t pFLatency;

    /*Configure the TIM3 IRQ priority */
    HAL_NVIC_SetPriority( TIM3_IRQn, TickPriority, 0 );

    /* Enable the TIM3 global Interrupt */
    HAL_NVIC_EnableIRQ( TIM3_IRQn );

    /* Enable TIM3 clock */
    __HAL_RCC_TIM3_CLK_ENABLE();

    /* Get clock configuration */
    HAL_RCC_GetClockConfig( &clkconfig, &pFLatency );

    /* Compute TIM3 clock */
    uwTimclock = HAL_RCC_GetPCLK1Freq();

    /* Compute the prescaler value to have TIM3 counter clock equal to 1MHz */
    uwPrescalerValue = ( uint32_t ) ( ( uwTimclock / 1000000 ) - 1 );

    /* Initialize TIM3 */
    htim3.Instance = TIM3;

    /* Initialize TIMx peripheral as follow:
     + Period = [(TIM3CLK/1000) - 1]. to have a (1/1000) s time base.
     + Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock.
     + ClockDivision = 0
     + Counter direction = Up
     */
    htim3.Init.Period = ( 1000000 / 1000 ) - 1;
    htim3.Init.Prescaler = uwPrescalerValue;
    htim3.Init.ClockDivision = 0;
    htim3.Init.CounterMode = TIM_COUNTERMODE_UP;

    if( HAL_TIM_Base_Init( &htim3 ) == HAL_OK )
    {
        /* Start the TIM time Base generation in interrupt mode */
        return HAL_TIM_Base_Start_IT( &htim3 );
    }

    /* Return function status */
    return HAL_ERROR;
}

/**
 * @brief  Suspend Tick increment.
 * @note   Disable the tick increment by disabling TIM3 update interrupt.
 * @param  None
 * @retval None
 */
void HAL_SuspendTick( void )
{
    /* Disable TIM3 update Interrupt */
    __HAL_TIM_DISABLE_IT( &htim3, TIM_IT_UPDATE );
}

/**
 * @brief  Resume Tick increment.
 * @note   Enable the tick increment by Enabling TIM3 update interrupt.
 * @param  None
 * @retval None
 */
void HAL_ResumeTick( void )
{
    /* Enable TIM3 Update interrupt */
    __HAL_TIM_ENABLE_IT( &htim3, TIM_IT_UPDATE );
}

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
