xref: /btstack/port/stm32-wb55xx-nucleo-freertos/Src/stm32wbxx_hal_timebase_tim.c (revision 0561b2d8d5dba972c7daa57d5e677f7a1327edfd)
1 /**
2   ******************************************************************************
3   * @file    stm32wbxx_hal_timebase_tim.c
4   * @author  MCD Application Team
5   * @brief   HAL time base based on the hardware TIM.
6   *
7   *          This file overrides the native HAL time base functions (defined as weak)
8   *          the TIM time base:
9   *           + Intializes the TIM peripheral to generate a Period elapsed Event each 1ms
10   *           + HAL_IncTick is called inside HAL_TIM_PeriodElapsedCallback ie each 1ms
11   *
12  @verbatim
13   ==============================================================================
14                         ##### How to use this driver #####
15   ==============================================================================
16     [..]
17     This file must be copied to the application folder and modified as follows:
18     (#) Rename it to 'stm32g0xx_hal_timebase_tim.c'
19     (#) Add this file and the TIM HAL driver files to your project and make sure
20        HAL_TIM_MODULE_ENABLED is defined in stm32wbxx_hal_conf.h
21 
22     [..]
23     (@) The application needs to ensure that the time base is always set to 1 millisecond
24        to have correct HAL operation.
25 
26   @endverbatim
27   ******************************************************************************
28   * @attention
29   *
30   * <h2><center>&copy; COPYRIGHT(c) 2019 STMicroelectronics</center></h2>
31   *
32   * Redistribution and use in source and binary forms, with or without modification,
33   * are permitted provided that the following conditions are met:
34   *   1. Redistributions of source code must retain the above copyright notice,
35   *      this list of conditions and the following disclaimer.
36   *   2. Redistributions in binary form must reproduce the above copyright notice,
37   *      this list of conditions and the following disclaimer in the documentation
38   *      and/or other materials provided with the distribution.
39   *   3. Neither the name of STMicroelectronics nor the names of its contributors
40   *      may be used to endorse or promote products derived from this software
41   *      without specific prior written permission.
42   *
43   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
44   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
45   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
46   * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
47   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
48   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
49   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
50   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
51   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
52   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
53   *
54   ******************************************************************************
55   */
56 
57 /* Includes ------------------------------------------------------------------*/
58 #include "stm32wbxx_hal.h"
59 #include "stm32wbxx_hal_tim.h"
60 
61 /* Private typedef -----------------------------------------------------------*/
62 /* Private define ------------------------------------------------------------*/
63 /* Private macro -------------------------------------------------------------*/
64 /* Private variables ---------------------------------------------------------*/
65 TIM_HandleTypeDef        htim17;
66 /* Private function prototypes -----------------------------------------------*/
67 /* Private functions ---------------------------------------------------------*/
68 
69 /**
70   * @brief  This function configures the TIM17 as a time base source.
71   *         The time source is configured  to have 1ms time base with a dedicated
72   *         Tick interrupt priority.
73   * @note   This function is called  automatically at the beginning of program after
74   *         reset by HAL_Init() or at any time when clock is configured, by HAL_RCC_ClockConfig().
75   * @param  TickPriority: Tick interrupt priority.
76   * @retval HAL status
77   */
HAL_InitTick(uint32_t TickPriority)78 HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
79 {
80   RCC_ClkInitTypeDef    clkconfig;
81   uint32_t              uwTimclock = 0;
82   uint32_t              uwPrescalerValue = 0;
83   uint32_t              pFLatency;
84 
85   /*Configure the TIM17 IRQ priority */
86   HAL_NVIC_SetPriority(TIM1_TRG_COM_TIM17_IRQn, TickPriority ,0);
87 
88   /* Enable the TIM17 global Interrupt */
89   HAL_NVIC_EnableIRQ(TIM1_TRG_COM_TIM17_IRQn);
90 
91   /* Enable TIM17 clock */
92   __HAL_RCC_TIM17_CLK_ENABLE();
93 
94   /* Get clock configuration */
95   HAL_RCC_GetClockConfig(&clkconfig, &pFLatency);
96 
97   /* Compute TIM17 clock */
98   uwTimclock = HAL_RCC_GetPCLK2Freq();
99 
100   /* Compute the prescaler value to have TIM17 counter clock equal to 1MHz */
101   uwPrescalerValue = (uint32_t) ((uwTimclock / 1000000) - 1);
102 
103   /* Initialize TIM17 */
104   htim17.Instance = TIM17;
105 
106   /* Initialize TIMx peripheral as follow:
107   + Period = [(TIM17CLK/1000) - 1]. to have a (1/1000) s time base.
108   + Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock.
109   + ClockDivision = 0
110   + Counter direction = Up
111   */
112   htim17.Init.Period = (1000000 / 1000) - 1;
113   htim17.Init.Prescaler = uwPrescalerValue;
114   htim17.Init.ClockDivision = 0;
115   htim17.Init.CounterMode = TIM_COUNTERMODE_UP;
116   if(HAL_TIM_Base_Init(&htim17) == HAL_OK)
117   {
118     /* Start the TIM time Base generation in interrupt mode */
119     return HAL_TIM_Base_Start_IT(&htim17);
120   }
121 
122   /* Return function status */
123   return HAL_ERROR;
124 }
125 
126 /**
127   * @brief  Suspend Tick increment.
128   * @note   Disable the tick increment by disabling TIM17 update interrupt.
129   * @param  None
130   * @retval None
131   */
HAL_SuspendTick(void)132 void HAL_SuspendTick(void)
133 {
134   /* Disable TIM17 update Interrupt */
135   __HAL_TIM_DISABLE_IT(&htim17, TIM_IT_UPDATE);
136 }
137 
138 /**
139   * @brief  Resume Tick increment.
140   * @note   Enable the tick increment by Enabling TIM17 update interrupt.
141   * @param  None
142   * @retval None
143   */
HAL_ResumeTick(void)144 void HAL_ResumeTick(void)
145 {
146   /* Enable TIM17 Update interrupt */
147   __HAL_TIM_ENABLE_IT(&htim17, TIM_IT_UPDATE);
148 }
149 
150 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
151