| /** | |
| ****************************************************************************** | |
| * @file FreeRTOS/FreeRTOS_AMP_Dual_RTOS/CM7/Src/stm32h7xx_hal_timebase_tim.c | |
| * @author MCD Application Team | |
| * @brief HAL time base based on the hardware TIM. | |
| * | |
| * This file overrides the native HAL time base functions (defined as weak) | |
| * the TIM time base: | |
| * + Intializes the TIM peripheral generate a Period elapsed Event each 1ms | |
| * + HAL_IncTick is called inside HAL_TIM_PeriodElapsedCallback ie each 1ms | |
| * | |
| ****************************************************************************** | |
| * @attention | |
| * | |
| * <h2><center>© Copyright (c) 2019 STMicroelectronics. | |
| * All rights reserved.</center></h2> | |
| * | |
| * This software component is licensed by ST under BSD 3-Clause license, | |
| * the "License"; You may not use this file except in compliance with the | |
| * License. You may obtain a copy of the License at: | |
| * opensource.org/licenses/BSD-3-Clause | |
| * | |
| ****************************************************************************** | |
| */ | |
| /* Includes ------------------------------------------------------------------*/ | |
| #include "stm32h7xx_hal.h" | |
| /* Private typedef -----------------------------------------------------------*/ | |
| /* Private define ------------------------------------------------------------*/ | |
| /* Private macro -------------------------------------------------------------*/ | |
| /* Private variables ---------------------------------------------------------*/ | |
| TIM_HandleTypeDef TimHandle; | |
| /* Private function prototypes -----------------------------------------------*/ | |
| void TIM6_DAC_IRQHandler(void); | |
| /* Private functions ---------------------------------------------------------*/ | |
| /** | |
| * @brief This function configures the TIM6 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, uwAPB1Prescaler = 0U; | |
| uint32_t uwPrescalerValue = 0U; | |
| uint32_t pFLatency; | |
| /*Configure the TIM6 IRQ priority */ | |
| HAL_NVIC_SetPriority(TIM6_DAC_IRQn, TickPriority ,0U); | |
| /* Enable the TIM6 global Interrupt */ | |
| HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn); | |
| /* Enable TIM6 clock */ | |
| __HAL_RCC_TIM6_CLK_ENABLE(); | |
| /* Get clock configuration */ | |
| HAL_RCC_GetClockConfig(&clkconfig, &pFLatency); | |
| /* Get APB1 prescaler */ | |
| uwAPB1Prescaler = clkconfig.APB1CLKDivider; | |
| /* Compute TIM6 clock */ | |
| if (uwAPB1Prescaler == RCC_HCLK_DIV1) | |
| { | |
| uwTimclock = HAL_RCC_GetPCLK1Freq(); | |
| } | |
| else | |
| { | |
| uwTimclock = 2*HAL_RCC_GetPCLK1Freq(); | |
| } | |
| /* Compute the prescaler value to have TIM6 counter clock equal to 1MHz */ | |
| uwPrescalerValue = (uint32_t) ((uwTimclock / 1000000U) - 1U); | |
| /* Initialize TIM6 */ | |
| TimHandle.Instance = TIM6; | |
| /* Initialize TIMx peripheral as follow: | |
| + Period = [(TIM6CLK/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 | |
| */ | |
| TimHandle.Init.Period = (1000000U / 1000U) - 1U; | |
| TimHandle.Init.Prescaler = uwPrescalerValue; | |
| TimHandle.Init.ClockDivision = 0; | |
| TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; | |
| if(HAL_TIM_Base_Init(&TimHandle) == HAL_OK) | |
| { | |
| /* Start the TIM time Base generation in interrupt mode */ | |
| return HAL_TIM_Base_Start_IT(&TimHandle); | |
| } | |
| /* Return function status */ | |
| return HAL_ERROR; | |
| } | |
| /** | |
| * @brief Suspend Tick increment. | |
| * @note Disable the tick increment by disabling TIM6 update interrupt. | |
| * @param None | |
| * @retval None | |
| */ | |
| void HAL_SuspendTick(void) | |
| { | |
| /* Disable TIM6 update Interrupt */ | |
| __HAL_TIM_DISABLE_IT(&TimHandle, TIM_IT_UPDATE); | |
| } | |
| /** | |
| * @brief Resume Tick increment. | |
| * @note Enable the tick increment by Enabling TIM6 update interrupt. | |
| * @param None | |
| * @retval None | |
| */ | |
| void HAL_ResumeTick(void) | |
| { | |
| /* Enable TIM6 Update interrupt */ | |
| __HAL_TIM_ENABLE_IT(&TimHandle, TIM_IT_UPDATE); | |
| } | |
| /** | |
| * @brief Period elapsed callback in non blocking mode | |
| * @note This function is called when TIM6 interrupt took place, inside | |
| * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment | |
| * a global variable "uwTick" used as application time base. | |
| * @param htim : TIM handle | |
| * @retval None | |
| */ | |
| void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) | |
| { | |
| HAL_IncTick(); | |
| } | |
| /** | |
| * @brief This function handles TIM interrupt request. | |
| * @param None | |
| * @retval None | |
| */ | |
| void TIM6_DAC_IRQHandler(void) | |
| { | |
| HAL_TIM_IRQHandler(&TimHandle); | |
| } | |
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |