Subversion Repositories canSerial

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /**
  2.   ******************************************************************************
  3.   * @file    stm32f1xx_hal_timebase_tim_template.c
  4.   * @author  MCD Application Team
  5.   * @brief   HAL time base based on the hardware TIM Template.
  6.   *
  7.   *          This file overrides the native HAL time base functions (defined as weak)
  8.   *          the TIM time base:
  9.   *           + Initializes the TIM peripheral generate a Period elapsed Event each 1ms
  10.   *           + HAL_IncTick is called inside HAL_TIM_PeriodElapsedCallback ie each 1ms
  11.   *
  12.   ******************************************************************************
  13.   * @attention
  14.   *
  15.   * Copyright (c) 2017 STMicroelectronics.
  16.   * All rights reserved.
  17.   *
  18.   * This software is licensed under terms that can be found in the LICENSE file
  19.   * in the root directory of this software component.
  20.   * If no LICENSE file comes with this software, it is provided AS-IS.
  21.   *
  22.   ******************************************************************************
  23.   */
  24.  
  25. /* Includes ------------------------------------------------------------------*/
  26. #include "stm32f1xx_hal.h"
  27.  
  28. /** @addtogroup STM32F1xx_HAL_Driver
  29.   * @{
  30.   */
  31.  
  32. /** @addtogroup HAL_TimeBase_TIM
  33.   * @{
  34.   */
  35.  
  36. /* Private typedef -----------------------------------------------------------*/
  37. /* Private define ------------------------------------------------------------*/
  38. /* Private macro -------------------------------------------------------------*/
  39. /* Private variables ---------------------------------------------------------*/
  40. TIM_HandleTypeDef        TimHandle;
  41. /* Private function prototypes -----------------------------------------------*/
  42. void TIM2_IRQHandler(void);
  43. /* Private functions ---------------------------------------------------------*/
  44.  
  45. /**
  46.   * @brief  This function configures the TIM2 as a time base source.
  47.   *         The time source is configured to have 1ms time base with a dedicated
  48.   *         Tick interrupt priority.
  49.   * @note   This function is called  automatically at the beginning of program after
  50.   *         reset by HAL_Init() or at any time when clock is configured, by HAL_RCC_ClockConfig().
  51.   * @param  TickPriority Tick interrupt priority.
  52.   * @retval HAL status
  53.   */
  54. HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
  55. {
  56.   RCC_ClkInitTypeDef    clkconfig;
  57.   uint32_t              uwTimclock, uwAPB1Prescaler = 0U;
  58.   uint32_t              uwPrescalerValue = 0U;
  59.   uint32_t              pFLatency;
  60.   HAL_StatusTypeDef     status = HAL_OK;
  61.  
  62.  
  63.   /* Enable TIM2 clock */
  64.   __HAL_RCC_TIM2_CLK_ENABLE();
  65.  
  66.   /* Get clock configuration */
  67.   HAL_RCC_GetClockConfig(&clkconfig, &pFLatency);
  68.  
  69.   /* Get APB1 prescaler */
  70.   uwAPB1Prescaler = clkconfig.APB1CLKDivider;
  71.  
  72.   /* Compute TIM2 clock */
  73.   if (uwAPB1Prescaler == RCC_HCLK_DIV1)
  74.   {
  75.     uwTimclock = HAL_RCC_GetPCLK1Freq();
  76.   }
  77.   else
  78.   {
  79.     uwTimclock = 2 * HAL_RCC_GetPCLK1Freq();
  80.   }
  81.  
  82.   /* Compute the prescaler value to have TIM2 counter clock equal to 1MHz */
  83.   uwPrescalerValue = (uint32_t)((uwTimclock / 1000000U) - 1U);
  84.  
  85.   /* Initialize TIM2 */
  86.   TimHandle.Instance = TIM2;
  87.  
  88.   /* Initialize TIMx peripheral as follow:
  89.   + Period = [(TIM2CLK/1000) - 1]. to have a (1/1000) s time base.
  90.   + Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock.
  91.   + ClockDivision = 0
  92.   + Counter direction = Up
  93.   */
  94.   TimHandle.Init.Period = (1000000U / 1000U) - 1U;
  95.   TimHandle.Init.Prescaler = uwPrescalerValue;
  96.   TimHandle.Init.ClockDivision = 0U;
  97.   TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
  98.   TimHandle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  99.   status = HAL_TIM_Base_Init(&TimHandle);
  100.   if (status == HAL_OK)
  101.   {
  102.     /* Start the TIM time Base generation in interrupt mode */
  103.     status = HAL_TIM_Base_Start_IT(&TimHandle);
  104.     if (status == HAL_OK)
  105.     {
  106.       /* Enable the TIM2 global Interrupt */
  107.       HAL_NVIC_EnableIRQ(TIM2_IRQn);
  108.  
  109.       if (TickPriority < (1UL << __NVIC_PRIO_BITS))
  110.       {
  111.         /*Configure the TIM2 IRQ priority */
  112.         HAL_NVIC_SetPriority(TIM2_IRQn, TickPriority ,0);
  113.         uwTickPrio = TickPriority;
  114.       }
  115.       else
  116.       {
  117.         status = HAL_ERROR;
  118.       }
  119.     }
  120.   }
  121.  
  122.   /* Return function status */
  123.   return status;
  124. }
  125.  
  126. /**
  127.   * @brief  Suspend Tick increment.
  128.   * @note   Disable the tick increment by disabling TIM2 update interrupt.
  129.   * @retval None
  130.   */
  131. void HAL_SuspendTick(void)
  132. {
  133.   /* Disable TIM2 update Interrupt */
  134.   __HAL_TIM_DISABLE_IT(&TimHandle, TIM_IT_UPDATE);
  135. }
  136.  
  137. /**
  138.   * @brief  Resume Tick increment.
  139.   * @note   Enable the tick increment by Enabling TIM2 update interrupt.
  140.   * @retval None
  141.   */
  142. void HAL_ResumeTick(void)
  143. {
  144.   /* Enable TIM2 Update interrupt */
  145.   __HAL_TIM_ENABLE_IT(&TimHandle, TIM_IT_UPDATE);
  146. }
  147.  
  148. /**
  149.   * @brief  Period elapsed callback in non blocking mode
  150.   * @note   This function is called  when TIM2 interrupt took place, inside
  151.   * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment
  152.   * a global variable "uwTick" used as application time base.
  153.   * @param  htim TIM handle
  154.   * @retval None
  155.   */
  156. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  157. {
  158.   HAL_IncTick();
  159. }
  160.  
  161. /**
  162.   * @brief  This function handles TIM interrupt request.
  163.   * @retval None
  164.   */
  165. void TIM2_IRQHandler(void)
  166. {
  167.   HAL_TIM_IRQHandler(&TimHandle);
  168. }
  169.  
  170. /**
  171.   * @}
  172.   */
  173.  
  174. /**
  175.   * @}
  176.   */
  177.  
  178.  
  179.