1 /** 2 ****************************************************************************** 3 * @file stm32f4xx_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 "stm32f4xx_hal.h" 27 28 /** @addtogroup STM32F4xx_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 TIM6_DAC_IRQHandler(void); 43 /* Private functions ---------------------------------------------------------*/ 44 45 /** 46 * @brief This function configures the TIM6 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 */ HAL_InitTick(uint32_t TickPriority)54HAL_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; 61 62 /* Enable TIM6 clock */ 63 __HAL_RCC_TIM6_CLK_ENABLE(); 64 65 /* Get clock configuration */ 66 HAL_RCC_GetClockConfig(&clkconfig, &pFLatency); 67 68 /* Get APB1 prescaler */ 69 uwAPB1Prescaler = clkconfig.APB1CLKDivider; 70 71 /* Compute TIM6 clock */ 72 if (uwAPB1Prescaler == RCC_HCLK_DIV1) 73 { 74 uwTimclock = HAL_RCC_GetPCLK1Freq(); 75 } 76 else 77 { 78 uwTimclock = 2 * HAL_RCC_GetPCLK1Freq(); 79 } 80 81 /* Compute the prescaler value to have TIM6 counter clock equal to 1MHz */ 82 uwPrescalerValue = (uint32_t) ((uwTimclock / 1000000U) - 1U); 83 84 /* Initialize TIM6 */ 85 TimHandle.Instance = TIM6; 86 87 /* Initialize TIMx peripheral as follow: 88 + Period = [(TIM6CLK/1000) - 1]. to have a (1/1000) s time base. 89 + Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock. 90 + ClockDivision = 0 91 + Counter direction = Up 92 */ 93 TimHandle.Init.Period = (1000000U / 1000U) - 1U; 94 TimHandle.Init.Prescaler = uwPrescalerValue; 95 TimHandle.Init.ClockDivision = 0U; 96 TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; 97 TimHandle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; 98 status = HAL_TIM_Base_Init(&TimHandle); 99 if (status == HAL_OK) 100 { 101 /* Start the TIM time Base generation in interrupt mode */ 102 status = HAL_TIM_Base_Start_IT(&TimHandle); 103 if (status == HAL_OK) 104 { 105 /* Enable the TIM6 global Interrupt */ 106 HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn); 107 108 if (TickPriority < (1UL << __NVIC_PRIO_BITS)) 109 { 110 /* Enable the TIM6 global Interrupt */ 111 HAL_NVIC_SetPriority(TIM6_DAC_IRQn, TickPriority, 0); 112 uwTickPrio = TickPriority; 113 } 114 else 115 { 116 status = HAL_ERROR; 117 } 118 } 119 } 120 121 /* Return function status */ 122 return status; 123 } 124 125 /** 126 * @brief Suspend Tick increment. 127 * @note Disable the tick increment by disabling TIM6 update interrupt. 128 * @retval None 129 */ HAL_SuspendTick(void)130void HAL_SuspendTick(void) 131 { 132 /* Disable TIM6 update Interrupt */ 133 __HAL_TIM_DISABLE_IT(&TimHandle, TIM_IT_UPDATE); 134 } 135 136 /** 137 * @brief Resume Tick increment. 138 * @note Enable the tick increment by Enabling TIM6 update interrupt. 139 * @retval None 140 */ HAL_ResumeTick(void)141void HAL_ResumeTick(void) 142 { 143 /* Enable TIM6 Update interrupt */ 144 __HAL_TIM_ENABLE_IT(&TimHandle, TIM_IT_UPDATE); 145 } 146 147 /** 148 * @brief Period elapsed callback in non blocking mode 149 * @note This function is called when TIM6 interrupt took place, inside 150 * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment 151 * a global variable "uwTick" used as application time base. 152 * @param htim TIM handle 153 * @retval None 154 */ HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef * htim)155void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) 156 { 157 HAL_IncTick(); 158 } 159 160 /** 161 * @brief This function handles TIM interrupt request. 162 * @retval None 163 */ TIM6_DAC_IRQHandler(void)164void TIM6_DAC_IRQHandler(void) 165 { 166 HAL_TIM_IRQHandler(&TimHandle); 167 } 168 169 /** 170 * @} 171 */ 172 173 /** 174 * @} 175 */ 176 177 178