1 /**
2   ******************************************************************************
3   * @file    stm32h5xx_hal_tim.c
4   * @author  MCD Application Team
5   * @brief   TIM HAL module driver.
6   *          This file provides firmware functions to manage the following
7   *          functionalities of the Timer (TIM) peripheral:
8   *           + TIM Time Base Initialization
9   *           + TIM Time Base Start
10   *           + TIM Time Base Start Interruption
11   *           + TIM Time Base Start DMA
12   *           + TIM Output Compare/PWM Initialization
13   *           + TIM Output Compare/PWM Channel Configuration
14   *           + TIM Output Compare/PWM  Start
15   *           + TIM Output Compare/PWM  Start Interruption
16   *           + TIM Output Compare/PWM Start DMA
17   *           + TIM Input Capture Initialization
18   *           + TIM Input Capture Channel Configuration
19   *           + TIM Input Capture Start
20   *           + TIM Input Capture Start Interruption
21   *           + TIM Input Capture Start DMA
22   *           + TIM One Pulse Initialization
23   *           + TIM One Pulse Channel Configuration
24   *           + TIM One Pulse Start
25   *           + TIM Encoder Interface Initialization
26   *           + TIM Encoder Interface Start
27   *           + TIM Encoder Interface Start Interruption
28   *           + TIM Encoder Interface Start DMA
29   *           + Commutation Event configuration with Interruption and DMA
30   *           + TIM OCRef clear configuration
31   *           + TIM External Clock configuration
32   ******************************************************************************
33   * @attention
34   *
35   * Copyright (c) 2022 STMicroelectronics.
36   * All rights reserved.
37   *
38   * This software is licensed under terms that can be found in the LICENSE file
39   * in the root directory of this software component.
40   * If no LICENSE file comes with this software, it is provided AS-IS.
41   *
42   ******************************************************************************
43   @verbatim
44   ==============================================================================
45                       ##### TIMER Generic features #####
46   ==============================================================================
47   [..] The Timer features include:
48        (#) 16-bit up, down, up/down auto-reload counter.
49        (#) 16-bit programmable prescaler allowing dividing (also on the fly) the
50            counter clock frequency either by any factor between 1 and 65536.
51        (#) Up to 4 independent channels for:
52            (++) Input Capture
53            (++) Output Compare
54            (++) PWM generation (Edge and Center-aligned Mode)
55            (++) One-pulse mode output
56        (#) Synchronization circuit to control the timer with external signals and to interconnect
57             several timers together.
58        (#) Supports incremental encoder for positioning purposes
59 
60             ##### How to use this driver #####
61   ==============================================================================
62     [..]
63      (#) Initialize the TIM low level resources by implementing the following functions
64          depending on the selected feature:
65            (++) Time Base : HAL_TIM_Base_MspInit()
66            (++) Input Capture : HAL_TIM_IC_MspInit()
67            (++) Output Compare : HAL_TIM_OC_MspInit()
68            (++) PWM generation : HAL_TIM_PWM_MspInit()
69            (++) One-pulse mode output : HAL_TIM_OnePulse_MspInit()
70            (++) Encoder mode output : HAL_TIM_Encoder_MspInit()
71 
72      (#) Initialize the TIM low level resources :
73         (##) Enable the TIM interface clock using __HAL_RCC_TIMx_CLK_ENABLE();
74         (##) TIM pins configuration
75             (+++) Enable the clock for the TIM GPIOs using the following function:
76              __HAL_RCC_GPIOx_CLK_ENABLE();
77             (+++) Configure these TIM pins in Alternate function mode using HAL_GPIO_Init();
78 
79      (#) The external Clock can be configured, if needed (the default clock is the
80          internal clock from the APBx), using the following function:
81          HAL_TIM_ConfigClockSource, the clock configuration should be done before
82          any start function.
83 
84      (#) Configure the TIM in the desired functioning mode using one of the
85        Initialization function of this driver:
86        (++) HAL_TIM_Base_Init: to use the Timer to generate a simple time base
87        (++) HAL_TIM_OC_Init, HAL_TIM_OC_ConfigChannel and optionally HAL_TIMEx_OC_ConfigPulseOnCompare:
88             to use the Timer to generate an Output Compare signal.
89        (++) HAL_TIM_PWM_Init and HAL_TIM_PWM_ConfigChannel: to use the Timer to generate a
90             PWM signal.
91        (++) HAL_TIM_IC_Init and HAL_TIM_IC_ConfigChannel: to use the Timer to measure an
92             external signal.
93        (++) HAL_TIM_OnePulse_Init and HAL_TIM_OnePulse_ConfigChannel: to use the Timer
94             in One Pulse Mode.
95        (++) HAL_TIM_Encoder_Init: to use the Timer Encoder Interface.
96 
97      (#) Activate the TIM peripheral using one of the start functions depending from the feature used:
98            (++) Time Base : HAL_TIM_Base_Start(), HAL_TIM_Base_Start_DMA(), HAL_TIM_Base_Start_IT()
99            (++) Input Capture :  HAL_TIM_IC_Start(), HAL_TIM_IC_Start_DMA(), HAL_TIM_IC_Start_IT()
100            (++) Output Compare : HAL_TIM_OC_Start(), HAL_TIM_OC_Start_DMA(), HAL_TIM_OC_Start_IT()
101            (++) PWM generation : HAL_TIM_PWM_Start(), HAL_TIM_PWM_Start_DMA(), HAL_TIM_PWM_Start_IT()
102            (++) One-pulse mode output : HAL_TIM_OnePulse_Start(), HAL_TIM_OnePulse_Start_IT()
103            (++) Encoder mode output : HAL_TIM_Encoder_Start(), HAL_TIM_Encoder_Start_DMA(), HAL_TIM_Encoder_Start_IT().
104 
105      (#) The DMA Burst is managed with the two following functions:
106          HAL_TIM_DMABurst_WriteStart()
107          HAL_TIM_DMABurst_ReadStart()
108 
109     *** Callback registration ***
110   =============================================
111 
112   [..]
113   The compilation define  USE_HAL_TIM_REGISTER_CALLBACKS when set to 1
114   allows the user to configure dynamically the driver callbacks.
115 
116   [..]
117   Use Function HAL_TIM_RegisterCallback() to register a callback.
118   HAL_TIM_RegisterCallback() takes as parameters the HAL peripheral handle,
119   the Callback ID and a pointer to the user callback function.
120 
121   [..]
122   Use function HAL_TIM_UnRegisterCallback() to reset a callback to the default
123   weak function.
124   HAL_TIM_UnRegisterCallback takes as parameters the HAL peripheral handle,
125   and the Callback ID.
126 
127   [..]
128   These functions allow to register/unregister following callbacks:
129     (+) Base_MspInitCallback              : TIM Base Msp Init Callback.
130     (+) Base_MspDeInitCallback            : TIM Base Msp DeInit Callback.
131     (+) IC_MspInitCallback                : TIM IC Msp Init Callback.
132     (+) IC_MspDeInitCallback              : TIM IC Msp DeInit Callback.
133     (+) OC_MspInitCallback                : TIM OC Msp Init Callback.
134     (+) OC_MspDeInitCallback              : TIM OC Msp DeInit Callback.
135     (+) PWM_MspInitCallback               : TIM PWM Msp Init Callback.
136     (+) PWM_MspDeInitCallback             : TIM PWM Msp DeInit Callback.
137     (+) OnePulse_MspInitCallback          : TIM One Pulse Msp Init Callback.
138     (+) OnePulse_MspDeInitCallback        : TIM One Pulse Msp DeInit Callback.
139     (+) Encoder_MspInitCallback           : TIM Encoder Msp Init Callback.
140     (+) Encoder_MspDeInitCallback         : TIM Encoder Msp DeInit Callback.
141     (+) HallSensor_MspInitCallback        : TIM Hall Sensor Msp Init Callback.
142     (+) HallSensor_MspDeInitCallback      : TIM Hall Sensor Msp DeInit Callback.
143     (+) PeriodElapsedCallback             : TIM Period Elapsed Callback.
144     (+) PeriodElapsedHalfCpltCallback     : TIM Period Elapsed half complete Callback.
145     (+) TriggerCallback                   : TIM Trigger Callback.
146     (+) TriggerHalfCpltCallback           : TIM Trigger half complete Callback.
147     (+) IC_CaptureCallback                : TIM Input Capture Callback.
148     (+) IC_CaptureHalfCpltCallback        : TIM Input Capture half complete Callback.
149     (+) OC_DelayElapsedCallback           : TIM Output Compare Delay Elapsed Callback.
150     (+) PWM_PulseFinishedCallback         : TIM PWM Pulse Finished Callback.
151     (+) PWM_PulseFinishedHalfCpltCallback : TIM PWM Pulse Finished half complete Callback.
152     (+) ErrorCallback                     : TIM Error Callback.
153     (+) CommutationCallback               : TIM Commutation Callback.
154     (+) CommutationHalfCpltCallback       : TIM Commutation half complete Callback.
155     (+) BreakCallback                     : TIM Break Callback.
156     (+) Break2Callback                    : TIM Break2 Callback.
157     (+) EncoderIndexCallback              : TIM Encoder Index Callback.
158     (+) DirectionChangeCallback           : TIM Direction Change Callback
159     (+) IndexErrorCallback                : TIM Index Error Callback.
160     (+) TransitionErrorCallback           : TIM Transition Error Callback
161 
162   [..]
163 By default, after the Init and when the state is HAL_TIM_STATE_RESET
164 all interrupt callbacks are set to the corresponding weak functions:
165   examples HAL_TIM_TriggerCallback(), HAL_TIM_ErrorCallback().
166 
167   [..]
168   Exception done for MspInit and MspDeInit functions that are reset to the legacy weak
169   functionalities in the Init / DeInit only when these callbacks are null
170   (not registered beforehand). If not, MspInit or MspDeInit are not null, the Init / DeInit
171     keep and use the user MspInit / MspDeInit callbacks(registered beforehand)
172 
173   [..]
174     Callbacks can be registered / unregistered in HAL_TIM_STATE_READY state only.
175     Exception done MspInit / MspDeInit that can be registered / unregistered
176     in HAL_TIM_STATE_READY or HAL_TIM_STATE_RESET state,
177     thus registered(user) MspInit / DeInit callbacks can be used during the Init / DeInit.
178   In that case first register the MspInit/MspDeInit user callbacks
179       using HAL_TIM_RegisterCallback() before calling DeInit or Init function.
180 
181   [..]
182       When The compilation define USE_HAL_TIM_REGISTER_CALLBACKS is set to 0 or
183       not defined, the callback registration feature is not available and all callbacks
184       are set to the corresponding weak functions.
185 
186   @endverbatim
187   ******************************************************************************
188   */
189 
190 /* Includes ------------------------------------------------------------------*/
191 #include "stm32h5xx_hal.h"
192 
193 /** @addtogroup STM32H5xx_HAL_Driver
194   * @{
195   */
196 
197 /** @defgroup TIM TIM
198   * @brief TIM HAL module driver
199   * @{
200   */
201 
202 #ifdef HAL_TIM_MODULE_ENABLED
203 
204 /* Private typedef -----------------------------------------------------------*/
205 /* Private define ------------------------------------------------------------*/
206 /** @addtogroup TIM_Private_Constants
207   * @{
208   */
209 #define TIMx_AF2_OCRSEL TIM1_AF2_OCRSEL
210 
211 /**
212   * @}
213   */
214 /* Private macros ------------------------------------------------------------*/
215 /* Private variables ---------------------------------------------------------*/
216 /* Private function prototypes -----------------------------------------------*/
217 /** @addtogroup TIM_Private_Functions
218   * @{
219   */
220 static void TIM_OC1_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config);
221 static void TIM_OC3_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config);
222 static void TIM_OC4_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config);
223 static void TIM_OC5_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config);
224 static void TIM_OC6_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config);
225 static void TIM_TI1_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter);
226 static void TIM_TI2_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection,
227                               uint32_t TIM_ICFilter);
228 static void TIM_TI2_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter);
229 static void TIM_TI3_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection,
230                               uint32_t TIM_ICFilter);
231 static void TIM_TI4_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection,
232                               uint32_t TIM_ICFilter);
233 static void TIM_ITRx_SetConfig(TIM_TypeDef *TIMx, uint32_t InputTriggerSource);
234 static void TIM_DMAPeriodElapsedCplt(DMA_HandleTypeDef *hdma);
235 static void TIM_DMAPeriodElapsedHalfCplt(DMA_HandleTypeDef *hdma);
236 static void TIM_DMADelayPulseCplt(DMA_HandleTypeDef *hdma);
237 static void TIM_DMATriggerCplt(DMA_HandleTypeDef *hdma);
238 static void TIM_DMATriggerHalfCplt(DMA_HandleTypeDef *hdma);
239 static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim,
240                                                   const TIM_SlaveConfigTypeDef *sSlaveConfig);
241 /**
242   * @}
243   */
244 /* Exported functions --------------------------------------------------------*/
245 
246 /** @defgroup TIM_Exported_Functions TIM Exported Functions
247   * @{
248   */
249 
250 /** @defgroup TIM_Exported_Functions_Group1 TIM Time Base functions
251   *  @brief    Time Base functions
252   *
253 @verbatim
254   ==============================================================================
255               ##### Time Base functions #####
256   ==============================================================================
257   [..]
258     This section provides functions allowing to:
259     (+) Initialize and configure the TIM base.
260     (+) De-initialize the TIM base.
261     (+) Start the Time Base.
262     (+) Stop the Time Base.
263     (+) Start the Time Base and enable interrupt.
264     (+) Stop the Time Base and disable interrupt.
265     (+) Start the Time Base and enable DMA transfer.
266     (+) Stop the Time Base and disable DMA transfer.
267 
268 @endverbatim
269   * @{
270   */
271 /**
272   * @brief  Initializes the TIM Time base Unit according to the specified
273   *         parameters in the TIM_HandleTypeDef and initialize the associated handle.
274   * @note   Switching from Center Aligned counter mode to Edge counter mode (or reverse)
275   *         requires a timer reset to avoid unexpected direction
276   *         due to DIR bit readonly in center aligned mode.
277   *         Ex: call @ref HAL_TIM_Base_DeInit() before HAL_TIM_Base_Init()
278   * @param  htim TIM Base handle
279   * @retval HAL status
280   */
HAL_TIM_Base_Init(TIM_HandleTypeDef * htim)281 HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim)
282 {
283   /* Check the TIM handle allocation */
284   if (htim == NULL)
285   {
286     return HAL_ERROR;
287   }
288 
289   /* Check the parameters */
290   assert_param(IS_TIM_INSTANCE(htim->Instance));
291   assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode));
292   assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision));
293   assert_param(IS_TIM_PERIOD(htim, htim->Init.Period));
294   assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload));
295 
296   if (htim->State == HAL_TIM_STATE_RESET)
297   {
298     /* Allocate lock resource and initialize it */
299     htim->Lock = HAL_UNLOCKED;
300 
301 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
302     /* Reset interrupt callbacks to legacy weak callbacks */
303     TIM_ResetCallback(htim);
304 
305     if (htim->Base_MspInitCallback == NULL)
306     {
307       htim->Base_MspInitCallback = HAL_TIM_Base_MspInit;
308     }
309     /* Init the low level hardware : GPIO, CLOCK, NVIC */
310     htim->Base_MspInitCallback(htim);
311 #else
312     /* Init the low level hardware : GPIO, CLOCK, NVIC */
313     HAL_TIM_Base_MspInit(htim);
314 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
315   }
316 
317   /* Set the TIM state */
318   htim->State = HAL_TIM_STATE_BUSY;
319 
320   /* Set the Time Base configuration */
321   TIM_Base_SetConfig(htim->Instance, &htim->Init);
322 
323   /* Initialize the DMA burst operation state */
324   htim->DMABurstState = HAL_DMA_BURST_STATE_READY;
325 
326   /* Initialize the TIM channels state */
327   TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY);
328   TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY);
329 
330   /* Initialize the TIM state*/
331   htim->State = HAL_TIM_STATE_READY;
332 
333   return HAL_OK;
334 }
335 
336 /**
337   * @brief  DeInitializes the TIM Base peripheral
338   * @param  htim TIM Base handle
339   * @retval HAL status
340   */
HAL_TIM_Base_DeInit(TIM_HandleTypeDef * htim)341 HAL_StatusTypeDef HAL_TIM_Base_DeInit(TIM_HandleTypeDef *htim)
342 {
343   /* Check the parameters */
344   assert_param(IS_TIM_INSTANCE(htim->Instance));
345 
346   htim->State = HAL_TIM_STATE_BUSY;
347 
348   /* Disable the TIM Peripheral Clock */
349   __HAL_TIM_DISABLE(htim);
350 
351 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
352   if (htim->Base_MspDeInitCallback == NULL)
353   {
354     htim->Base_MspDeInitCallback = HAL_TIM_Base_MspDeInit;
355   }
356   /* DeInit the low level hardware */
357   htim->Base_MspDeInitCallback(htim);
358 #else
359   /* DeInit the low level hardware: GPIO, CLOCK, NVIC */
360   HAL_TIM_Base_MspDeInit(htim);
361 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
362 
363   /* Change the DMA burst operation state */
364   htim->DMABurstState = HAL_DMA_BURST_STATE_RESET;
365 
366   /* Change the TIM channels state */
367   TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET);
368   TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET);
369 
370   /* Change TIM state */
371   htim->State = HAL_TIM_STATE_RESET;
372 
373   /* Release Lock */
374   __HAL_UNLOCK(htim);
375 
376   return HAL_OK;
377 }
378 
379 /**
380   * @brief  Initializes the TIM Base MSP.
381   * @param  htim TIM Base handle
382   * @retval None
383   */
HAL_TIM_Base_MspInit(TIM_HandleTypeDef * htim)384 __weak void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
385 {
386   /* Prevent unused argument(s) compilation warning */
387   UNUSED(htim);
388 
389   /* NOTE : This function should not be modified, when the callback is needed,
390             the HAL_TIM_Base_MspInit could be implemented in the user file
391    */
392 }
393 
394 /**
395   * @brief  DeInitializes TIM Base MSP.
396   * @param  htim TIM Base handle
397   * @retval None
398   */
HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef * htim)399 __weak void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim)
400 {
401   /* Prevent unused argument(s) compilation warning */
402   UNUSED(htim);
403 
404   /* NOTE : This function should not be modified, when the callback is needed,
405             the HAL_TIM_Base_MspDeInit could be implemented in the user file
406    */
407 }
408 
409 
410 /**
411   * @brief  Starts the TIM Base generation.
412   * @param  htim TIM Base handle
413   * @retval HAL status
414   */
HAL_TIM_Base_Start(TIM_HandleTypeDef * htim)415 HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim)
416 {
417   uint32_t tmpsmcr;
418 
419   /* Check the parameters */
420   assert_param(IS_TIM_INSTANCE(htim->Instance));
421 
422   /* Check the TIM state */
423   if (htim->State != HAL_TIM_STATE_READY)
424   {
425     return HAL_ERROR;
426   }
427 
428   /* Set the TIM state */
429   htim->State = HAL_TIM_STATE_BUSY;
430 
431   /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */
432   if (IS_TIM_SLAVE_INSTANCE(htim->Instance))
433   {
434     tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
435     if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
436     {
437       __HAL_TIM_ENABLE(htim);
438     }
439   }
440   else
441   {
442     __HAL_TIM_ENABLE(htim);
443   }
444 
445   /* Return function status */
446   return HAL_OK;
447 }
448 
449 /**
450   * @brief  Stops the TIM Base generation.
451   * @param  htim TIM Base handle
452   * @retval HAL status
453   */
HAL_TIM_Base_Stop(TIM_HandleTypeDef * htim)454 HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim)
455 {
456   /* Check the parameters */
457   assert_param(IS_TIM_INSTANCE(htim->Instance));
458 
459   /* Disable the Peripheral */
460   __HAL_TIM_DISABLE(htim);
461 
462   /* Set the TIM state */
463   htim->State = HAL_TIM_STATE_READY;
464 
465   /* Return function status */
466   return HAL_OK;
467 }
468 
469 /**
470   * @brief  Starts the TIM Base generation in interrupt mode.
471   * @param  htim TIM Base handle
472   * @retval HAL status
473   */
HAL_TIM_Base_Start_IT(TIM_HandleTypeDef * htim)474 HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim)
475 {
476   uint32_t tmpsmcr;
477 
478   /* Check the parameters */
479   assert_param(IS_TIM_INSTANCE(htim->Instance));
480 
481   /* Check the TIM state */
482   if (htim->State != HAL_TIM_STATE_READY)
483   {
484     return HAL_ERROR;
485   }
486 
487   /* Set the TIM state */
488   htim->State = HAL_TIM_STATE_BUSY;
489 
490   /* Enable the TIM Update interrupt */
491   __HAL_TIM_ENABLE_IT(htim, TIM_IT_UPDATE);
492 
493   /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */
494   if (IS_TIM_SLAVE_INSTANCE(htim->Instance))
495   {
496     tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
497     if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
498     {
499       __HAL_TIM_ENABLE(htim);
500     }
501   }
502   else
503   {
504     __HAL_TIM_ENABLE(htim);
505   }
506 
507   /* Return function status */
508   return HAL_OK;
509 }
510 
511 /**
512   * @brief  Stops the TIM Base generation in interrupt mode.
513   * @param  htim TIM Base handle
514   * @retval HAL status
515   */
HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef * htim)516 HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim)
517 {
518   /* Check the parameters */
519   assert_param(IS_TIM_INSTANCE(htim->Instance));
520 
521   /* Disable the TIM Update interrupt */
522   __HAL_TIM_DISABLE_IT(htim, TIM_IT_UPDATE);
523 
524   /* Disable the Peripheral */
525   __HAL_TIM_DISABLE(htim);
526 
527   /* Set the TIM state */
528   htim->State = HAL_TIM_STATE_READY;
529 
530   /* Return function status */
531   return HAL_OK;
532 }
533 
534 /**
535   * @brief  Starts the TIM Base generation in DMA mode.
536   * @param  htim TIM Base handle
537   * @param  pData The source Buffer address.
538   * @param  Length The length of data to be transferred from memory to peripheral.
539   * @retval HAL status
540   */
HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef * htim,const uint32_t * pData,uint16_t Length)541 HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, const uint32_t *pData, uint16_t Length)
542 {
543   uint32_t tmpsmcr;
544 
545   /* Check the parameters */
546   assert_param(IS_TIM_DMA_INSTANCE(htim->Instance));
547 
548   /* Set the TIM state */
549   if (htim->State == HAL_TIM_STATE_BUSY)
550   {
551     return HAL_BUSY;
552   }
553   else if (htim->State == HAL_TIM_STATE_READY)
554   {
555     if ((pData == NULL) || (Length == 0U))
556     {
557       return HAL_ERROR;
558     }
559     else
560     {
561       htim->State = HAL_TIM_STATE_BUSY;
562     }
563   }
564   else
565   {
566     return HAL_ERROR;
567   }
568 
569   /* Set the DMA Period elapsed callbacks */
570   htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt;
571   htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt;
572 
573   /* Set the DMA error callback */
574   htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ;
575 
576   /* Enable the DMA channel */
577   if (TIM_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)pData, (uint32_t)&htim->Instance->ARR,
578                        Length) != HAL_OK)
579   {
580     /* Return error status */
581     return HAL_ERROR;
582   }
583 
584   /* Enable the TIM Update DMA request */
585   __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_UPDATE);
586 
587   /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */
588   if (IS_TIM_SLAVE_INSTANCE(htim->Instance))
589   {
590     tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
591     if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
592     {
593       __HAL_TIM_ENABLE(htim);
594     }
595   }
596   else
597   {
598     __HAL_TIM_ENABLE(htim);
599   }
600 
601   /* Return function status */
602   return HAL_OK;
603 }
604 
605 /**
606   * @brief  Stops the TIM Base generation in DMA mode.
607   * @param  htim TIM Base handle
608   * @retval HAL status
609   */
HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef * htim)610 HAL_StatusTypeDef HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef *htim)
611 {
612   /* Check the parameters */
613   assert_param(IS_TIM_DMA_INSTANCE(htim->Instance));
614 
615   /* Disable the TIM Update DMA request */
616   __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_UPDATE);
617 
618   (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]);
619 
620   /* Disable the Peripheral */
621   __HAL_TIM_DISABLE(htim);
622 
623   /* Set the TIM state */
624   htim->State = HAL_TIM_STATE_READY;
625 
626   /* Return function status */
627   return HAL_OK;
628 }
629 
630 /**
631   * @}
632   */
633 
634 /** @defgroup TIM_Exported_Functions_Group2 TIM Output Compare functions
635   *  @brief    TIM Output Compare functions
636   *
637 @verbatim
638   ==============================================================================
639                   ##### TIM Output Compare functions #####
640   ==============================================================================
641   [..]
642     This section provides functions allowing to:
643     (+) Initialize and configure the TIM Output Compare.
644     (+) De-initialize the TIM Output Compare.
645     (+) Start the TIM Output Compare.
646     (+) Stop the TIM Output Compare.
647     (+) Start the TIM Output Compare and enable interrupt.
648     (+) Stop the TIM Output Compare and disable interrupt.
649     (+) Start the TIM Output Compare and enable DMA transfer.
650     (+) Stop the TIM Output Compare and disable DMA transfer.
651 
652 @endverbatim
653   * @{
654   */
655 /**
656   * @brief  Initializes the TIM Output Compare according to the specified
657   *         parameters in the TIM_HandleTypeDef and initializes the associated handle.
658   * @note   Switching from Center Aligned counter mode to Edge counter mode (or reverse)
659   *         requires a timer reset to avoid unexpected direction
660   *         due to DIR bit readonly in center aligned mode.
661   *         Ex: call @ref HAL_TIM_OC_DeInit() before HAL_TIM_OC_Init()
662   * @param  htim TIM Output Compare handle
663   * @retval HAL status
664   */
HAL_TIM_OC_Init(TIM_HandleTypeDef * htim)665 HAL_StatusTypeDef HAL_TIM_OC_Init(TIM_HandleTypeDef *htim)
666 {
667   /* Check the TIM handle allocation */
668   if (htim == NULL)
669   {
670     return HAL_ERROR;
671   }
672 
673   /* Check the parameters */
674   assert_param(IS_TIM_INSTANCE(htim->Instance));
675   assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode));
676   assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision));
677   assert_param(IS_TIM_PERIOD(htim, htim->Init.Period));
678   assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload));
679 
680   if (htim->State == HAL_TIM_STATE_RESET)
681   {
682     /* Allocate lock resource and initialize it */
683     htim->Lock = HAL_UNLOCKED;
684 
685 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
686     /* Reset interrupt callbacks to legacy weak callbacks */
687     TIM_ResetCallback(htim);
688 
689     if (htim->OC_MspInitCallback == NULL)
690     {
691       htim->OC_MspInitCallback = HAL_TIM_OC_MspInit;
692     }
693     /* Init the low level hardware : GPIO, CLOCK, NVIC */
694     htim->OC_MspInitCallback(htim);
695 #else
696     /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */
697     HAL_TIM_OC_MspInit(htim);
698 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
699   }
700 
701   /* Set the TIM state */
702   htim->State = HAL_TIM_STATE_BUSY;
703 
704   /* Init the base time for the Output Compare */
705   TIM_Base_SetConfig(htim->Instance,  &htim->Init);
706 
707   /* Initialize the DMA burst operation state */
708   htim->DMABurstState = HAL_DMA_BURST_STATE_READY;
709 
710   /* Initialize the TIM channels state */
711   TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY);
712   TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY);
713 
714   /* Initialize the TIM state*/
715   htim->State = HAL_TIM_STATE_READY;
716 
717   return HAL_OK;
718 }
719 
720 /**
721   * @brief  DeInitializes the TIM peripheral
722   * @param  htim TIM Output Compare handle
723   * @retval HAL status
724   */
HAL_TIM_OC_DeInit(TIM_HandleTypeDef * htim)725 HAL_StatusTypeDef HAL_TIM_OC_DeInit(TIM_HandleTypeDef *htim)
726 {
727   /* Check the parameters */
728   assert_param(IS_TIM_INSTANCE(htim->Instance));
729 
730   htim->State = HAL_TIM_STATE_BUSY;
731 
732   /* Disable the TIM Peripheral Clock */
733   __HAL_TIM_DISABLE(htim);
734 
735 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
736   if (htim->OC_MspDeInitCallback == NULL)
737   {
738     htim->OC_MspDeInitCallback = HAL_TIM_OC_MspDeInit;
739   }
740   /* DeInit the low level hardware */
741   htim->OC_MspDeInitCallback(htim);
742 #else
743   /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */
744   HAL_TIM_OC_MspDeInit(htim);
745 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
746 
747   /* Change the DMA burst operation state */
748   htim->DMABurstState = HAL_DMA_BURST_STATE_RESET;
749 
750   /* Change the TIM channels state */
751   TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET);
752   TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET);
753 
754   /* Change TIM state */
755   htim->State = HAL_TIM_STATE_RESET;
756 
757   /* Release Lock */
758   __HAL_UNLOCK(htim);
759 
760   return HAL_OK;
761 }
762 
763 /**
764   * @brief  Initializes the TIM Output Compare MSP.
765   * @param  htim TIM Output Compare handle
766   * @retval None
767   */
HAL_TIM_OC_MspInit(TIM_HandleTypeDef * htim)768 __weak void HAL_TIM_OC_MspInit(TIM_HandleTypeDef *htim)
769 {
770   /* Prevent unused argument(s) compilation warning */
771   UNUSED(htim);
772 
773   /* NOTE : This function should not be modified, when the callback is needed,
774             the HAL_TIM_OC_MspInit could be implemented in the user file
775    */
776 }
777 
778 /**
779   * @brief  DeInitializes TIM Output Compare MSP.
780   * @param  htim TIM Output Compare handle
781   * @retval None
782   */
HAL_TIM_OC_MspDeInit(TIM_HandleTypeDef * htim)783 __weak void HAL_TIM_OC_MspDeInit(TIM_HandleTypeDef *htim)
784 {
785   /* Prevent unused argument(s) compilation warning */
786   UNUSED(htim);
787 
788   /* NOTE : This function should not be modified, when the callback is needed,
789             the HAL_TIM_OC_MspDeInit could be implemented in the user file
790    */
791 }
792 
793 /**
794   * @brief  Starts the TIM Output Compare signal generation.
795   * @param  htim TIM Output Compare handle
796   * @param  Channel TIM Channel to be enabled
797   *          This parameter can be one of the following values:
798   *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
799   *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
800   *            @arg TIM_CHANNEL_3: TIM Channel 3 selected
801   *            @arg TIM_CHANNEL_4: TIM Channel 4 selected
802   *            @arg TIM_CHANNEL_5: TIM Channel 5 selected
803   *            @arg TIM_CHANNEL_6: TIM Channel 6 selected
804   * @retval HAL status
805   */
HAL_TIM_OC_Start(TIM_HandleTypeDef * htim,uint32_t Channel)806 HAL_StatusTypeDef HAL_TIM_OC_Start(TIM_HandleTypeDef *htim, uint32_t Channel)
807 {
808   uint32_t tmpsmcr;
809 
810   /* Check the parameters */
811   assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel));
812 
813   /* Check the TIM channel state */
814   if (TIM_CHANNEL_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY)
815   {
816     return HAL_ERROR;
817   }
818 
819   /* Set the TIM channel state */
820   TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY);
821 
822   /* Enable the Output compare channel */
823   TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE);
824 
825   if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)
826   {
827     /* Enable the main output */
828     __HAL_TIM_MOE_ENABLE(htim);
829   }
830 
831   /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */
832   if (IS_TIM_SLAVE_INSTANCE(htim->Instance))
833   {
834     tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
835     if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
836     {
837       __HAL_TIM_ENABLE(htim);
838     }
839   }
840   else
841   {
842     __HAL_TIM_ENABLE(htim);
843   }
844 
845   /* Return function status */
846   return HAL_OK;
847 }
848 
849 /**
850   * @brief  Stops the TIM Output Compare signal generation.
851   * @param  htim TIM Output Compare handle
852   * @param  Channel TIM Channel to be disabled
853   *          This parameter can be one of the following values:
854   *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
855   *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
856   *            @arg TIM_CHANNEL_3: TIM Channel 3 selected
857   *            @arg TIM_CHANNEL_4: TIM Channel 4 selected
858   *            @arg TIM_CHANNEL_5: TIM Channel 5 selected
859   *            @arg TIM_CHANNEL_6: TIM Channel 6 selected
860   * @retval HAL status
861   */
HAL_TIM_OC_Stop(TIM_HandleTypeDef * htim,uint32_t Channel)862 HAL_StatusTypeDef HAL_TIM_OC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel)
863 {
864   /* Check the parameters */
865   assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel));
866 
867   /* Disable the Output compare channel */
868   TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE);
869 
870   if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)
871   {
872     /* Disable the Main Output */
873     __HAL_TIM_MOE_DISABLE(htim);
874   }
875 
876   /* Disable the Peripheral */
877   __HAL_TIM_DISABLE(htim);
878 
879   /* Set the TIM channel state */
880   TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY);
881 
882   /* Return function status */
883   return HAL_OK;
884 }
885 
886 /**
887   * @brief  Starts the TIM Output Compare signal generation in interrupt mode.
888   * @param  htim TIM Output Compare handle
889   * @param  Channel TIM Channel to be enabled
890   *          This parameter can be one of the following values:
891   *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
892   *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
893   *            @arg TIM_CHANNEL_3: TIM Channel 3 selected
894   *            @arg TIM_CHANNEL_4: TIM Channel 4 selected
895   * @retval HAL status
896   */
HAL_TIM_OC_Start_IT(TIM_HandleTypeDef * htim,uint32_t Channel)897 HAL_StatusTypeDef HAL_TIM_OC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel)
898 {
899   HAL_StatusTypeDef status = HAL_OK;
900   uint32_t tmpsmcr;
901 
902   /* Check the parameters */
903   assert_param(IS_TIM_CCX_CHANNEL(htim->Instance, Channel));
904 
905   /* Check the TIM channel state */
906   if (TIM_CHANNEL_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY)
907   {
908     return HAL_ERROR;
909   }
910 
911   /* Set the TIM channel state */
912   TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY);
913 
914   switch (Channel)
915   {
916     case TIM_CHANNEL_1:
917     {
918       /* Enable the TIM Capture/Compare 1 interrupt */
919       __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1);
920       break;
921     }
922 
923     case TIM_CHANNEL_2:
924     {
925       /* Enable the TIM Capture/Compare 2 interrupt */
926       __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2);
927       break;
928     }
929 
930     case TIM_CHANNEL_3:
931     {
932       /* Enable the TIM Capture/Compare 3 interrupt */
933       __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3);
934       break;
935     }
936 
937     case TIM_CHANNEL_4:
938     {
939       /* Enable the TIM Capture/Compare 4 interrupt */
940       __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4);
941       break;
942     }
943 
944     default:
945       status = HAL_ERROR;
946       break;
947   }
948 
949   if (status == HAL_OK)
950   {
951     /* Enable the Output compare channel */
952     TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE);
953 
954     if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)
955     {
956       /* Enable the main output */
957       __HAL_TIM_MOE_ENABLE(htim);
958     }
959 
960     /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */
961     if (IS_TIM_SLAVE_INSTANCE(htim->Instance))
962     {
963       tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
964       if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
965       {
966         __HAL_TIM_ENABLE(htim);
967       }
968     }
969     else
970     {
971       __HAL_TIM_ENABLE(htim);
972     }
973   }
974 
975   /* Return function status */
976   return status;
977 }
978 
979 /**
980   * @brief  Stops the TIM Output Compare signal generation in interrupt mode.
981   * @param  htim TIM Output Compare handle
982   * @param  Channel TIM Channel to be disabled
983   *          This parameter can be one of the following values:
984   *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
985   *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
986   *            @arg TIM_CHANNEL_3: TIM Channel 3 selected
987   *            @arg TIM_CHANNEL_4: TIM Channel 4 selected
988   * @retval HAL status
989   */
HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef * htim,uint32_t Channel)990 HAL_StatusTypeDef HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel)
991 {
992   HAL_StatusTypeDef status = HAL_OK;
993 
994   /* Check the parameters */
995   assert_param(IS_TIM_CCX_CHANNEL(htim->Instance, Channel));
996 
997   switch (Channel)
998   {
999     case TIM_CHANNEL_1:
1000     {
1001       /* Disable the TIM Capture/Compare 1 interrupt */
1002       __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1);
1003       break;
1004     }
1005 
1006     case TIM_CHANNEL_2:
1007     {
1008       /* Disable the TIM Capture/Compare 2 interrupt */
1009       __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2);
1010       break;
1011     }
1012 
1013     case TIM_CHANNEL_3:
1014     {
1015       /* Disable the TIM Capture/Compare 3 interrupt */
1016       __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3);
1017       break;
1018     }
1019 
1020     case TIM_CHANNEL_4:
1021     {
1022       /* Disable the TIM Capture/Compare 4 interrupt */
1023       __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4);
1024       break;
1025     }
1026 
1027     default:
1028       status = HAL_ERROR;
1029       break;
1030   }
1031 
1032   if (status == HAL_OK)
1033   {
1034     /* Disable the Output compare channel */
1035     TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE);
1036 
1037     if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)
1038     {
1039       /* Disable the Main Output */
1040       __HAL_TIM_MOE_DISABLE(htim);
1041     }
1042 
1043     /* Disable the Peripheral */
1044     __HAL_TIM_DISABLE(htim);
1045 
1046     /* Set the TIM channel state */
1047     TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY);
1048   }
1049 
1050   /* Return function status */
1051   return status;
1052 }
1053 
1054 /**
1055   * @brief  Starts the TIM Output Compare signal generation in DMA mode.
1056   * @param  htim TIM Output Compare handle
1057   * @param  Channel TIM Channel to be enabled
1058   *          This parameter can be one of the following values:
1059   *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
1060   *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
1061   *            @arg TIM_CHANNEL_3: TIM Channel 3 selected
1062   *            @arg TIM_CHANNEL_4: TIM Channel 4 selected
1063   * @param  pData The source Buffer address.
1064   * @param  Length The length of data to be transferred from memory to TIM peripheral
1065   * @retval HAL status
1066   */
HAL_TIM_OC_Start_DMA(TIM_HandleTypeDef * htim,uint32_t Channel,const uint32_t * pData,uint16_t Length)1067 HAL_StatusTypeDef HAL_TIM_OC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData,
1068                                        uint16_t Length)
1069 {
1070   HAL_StatusTypeDef status = HAL_OK;
1071   uint32_t tmpsmcr;
1072 
1073   /* Check the parameters */
1074   assert_param(IS_TIM_CCX_CHANNEL(htim->Instance, Channel));
1075 
1076   /* Set the TIM channel state */
1077   if (TIM_CHANNEL_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_BUSY)
1078   {
1079     return HAL_BUSY;
1080   }
1081   else if (TIM_CHANNEL_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_READY)
1082   {
1083     if ((pData == NULL) || (Length == 0U))
1084     {
1085       return HAL_ERROR;
1086     }
1087     else
1088     {
1089       TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY);
1090     }
1091   }
1092   else
1093   {
1094     return HAL_ERROR;
1095   }
1096 
1097   switch (Channel)
1098   {
1099     case TIM_CHANNEL_1:
1100     {
1101       /* Set the DMA compare callbacks */
1102       htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt;
1103       htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;
1104 
1105       /* Set the DMA error callback */
1106       htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ;
1107 
1108       /* Enable the DMA channel */
1109       if (TIM_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1,
1110                            Length) != HAL_OK)
1111       {
1112         /* Return error status */
1113         return HAL_ERROR;
1114       }
1115 
1116       /* Enable the TIM Capture/Compare 1 DMA request */
1117       __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1);
1118       break;
1119     }
1120 
1121     case TIM_CHANNEL_2:
1122     {
1123       /* Set the DMA compare callbacks */
1124       htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt;
1125       htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;
1126 
1127       /* Set the DMA error callback */
1128       htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ;
1129 
1130       /* Enable the DMA channel */
1131       if (TIM_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2,
1132                            Length) != HAL_OK)
1133       {
1134         /* Return error status */
1135         return HAL_ERROR;
1136       }
1137 
1138       /* Enable the TIM Capture/Compare 2 DMA request */
1139       __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2);
1140       break;
1141     }
1142 
1143     case TIM_CHANNEL_3:
1144     {
1145       /* Set the DMA compare callbacks */
1146       htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt;
1147       htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;
1148 
1149       /* Set the DMA error callback */
1150       htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ;
1151 
1152       /* Enable the DMA channel */
1153       if (TIM_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3,
1154                            Length) != HAL_OK)
1155       {
1156         /* Return error status */
1157         return HAL_ERROR;
1158       }
1159       /* Enable the TIM Capture/Compare 3 DMA request */
1160       __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3);
1161       break;
1162     }
1163 
1164     case TIM_CHANNEL_4:
1165     {
1166       /* Set the DMA compare callbacks */
1167       htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt;
1168       htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;
1169 
1170       /* Set the DMA error callback */
1171       htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ;
1172 
1173       /* Enable the DMA channel */
1174       if (TIM_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)pData, (uint32_t)&htim->Instance->CCR4,
1175                            Length) != HAL_OK)
1176       {
1177         /* Return error status */
1178         return HAL_ERROR;
1179       }
1180       /* Enable the TIM Capture/Compare 4 DMA request */
1181       __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4);
1182       break;
1183     }
1184 
1185     default:
1186       status = HAL_ERROR;
1187       break;
1188   }
1189 
1190   if (status == HAL_OK)
1191   {
1192     /* Enable the Output compare channel */
1193     TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE);
1194 
1195     if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)
1196     {
1197       /* Enable the main output */
1198       __HAL_TIM_MOE_ENABLE(htim);
1199     }
1200 
1201     /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */
1202     if (IS_TIM_SLAVE_INSTANCE(htim->Instance))
1203     {
1204       tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
1205       if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
1206       {
1207         __HAL_TIM_ENABLE(htim);
1208       }
1209     }
1210     else
1211     {
1212       __HAL_TIM_ENABLE(htim);
1213     }
1214   }
1215 
1216   /* Return function status */
1217   return status;
1218 }
1219 
1220 /**
1221   * @brief  Stops the TIM Output Compare signal generation in DMA mode.
1222   * @param  htim TIM Output Compare handle
1223   * @param  Channel TIM Channel to be disabled
1224   *          This parameter can be one of the following values:
1225   *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
1226   *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
1227   *            @arg TIM_CHANNEL_3: TIM Channel 3 selected
1228   *            @arg TIM_CHANNEL_4: TIM Channel 4 selected
1229   * @retval HAL status
1230   */
HAL_TIM_OC_Stop_DMA(TIM_HandleTypeDef * htim,uint32_t Channel)1231 HAL_StatusTypeDef HAL_TIM_OC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel)
1232 {
1233   HAL_StatusTypeDef status = HAL_OK;
1234 
1235   /* Check the parameters */
1236   assert_param(IS_TIM_CCX_CHANNEL(htim->Instance, Channel));
1237 
1238   switch (Channel)
1239   {
1240     case TIM_CHANNEL_1:
1241     {
1242       /* Disable the TIM Capture/Compare 1 DMA request */
1243       __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1);
1244       (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]);
1245       break;
1246     }
1247 
1248     case TIM_CHANNEL_2:
1249     {
1250       /* Disable the TIM Capture/Compare 2 DMA request */
1251       __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2);
1252       (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]);
1253       break;
1254     }
1255 
1256     case TIM_CHANNEL_3:
1257     {
1258       /* Disable the TIM Capture/Compare 3 DMA request */
1259       __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3);
1260       (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]);
1261       break;
1262     }
1263 
1264     case TIM_CHANNEL_4:
1265     {
1266       /* Disable the TIM Capture/Compare 4 interrupt */
1267       __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4);
1268       (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]);
1269       break;
1270     }
1271 
1272     default:
1273       status = HAL_ERROR;
1274       break;
1275   }
1276 
1277   if (status == HAL_OK)
1278   {
1279     /* Disable the Output compare channel */
1280     TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE);
1281 
1282     if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)
1283     {
1284       /* Disable the Main Output */
1285       __HAL_TIM_MOE_DISABLE(htim);
1286     }
1287 
1288     /* Disable the Peripheral */
1289     __HAL_TIM_DISABLE(htim);
1290 
1291     /* Set the TIM channel state */
1292     TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY);
1293   }
1294 
1295   /* Return function status */
1296   return status;
1297 }
1298 
1299 /**
1300   * @}
1301   */
1302 
1303 /** @defgroup TIM_Exported_Functions_Group3 TIM PWM functions
1304   *  @brief    TIM PWM functions
1305   *
1306 @verbatim
1307   ==============================================================================
1308                           ##### TIM PWM functions #####
1309   ==============================================================================
1310   [..]
1311     This section provides functions allowing to:
1312     (+) Initialize and configure the TIM PWM.
1313     (+) De-initialize the TIM PWM.
1314     (+) Start the TIM PWM.
1315     (+) Stop the TIM PWM.
1316     (+) Start the TIM PWM and enable interrupt.
1317     (+) Stop the TIM PWM and disable interrupt.
1318     (+) Start the TIM PWM and enable DMA transfer.
1319     (+) Stop the TIM PWM and disable DMA transfer.
1320 
1321 @endverbatim
1322   * @{
1323   */
1324 /**
1325   * @brief  Initializes the TIM PWM Time Base according to the specified
1326   *         parameters in the TIM_HandleTypeDef and initializes the associated handle.
1327   * @note   Switching from Center Aligned counter mode to Edge counter mode (or reverse)
1328   *         requires a timer reset to avoid unexpected direction
1329   *         due to DIR bit readonly in center aligned mode.
1330   *         Ex: call @ref HAL_TIM_PWM_DeInit() before HAL_TIM_PWM_Init()
1331   * @param  htim TIM PWM handle
1332   * @retval HAL status
1333   */
HAL_TIM_PWM_Init(TIM_HandleTypeDef * htim)1334 HAL_StatusTypeDef HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim)
1335 {
1336   /* Check the TIM handle allocation */
1337   if (htim == NULL)
1338   {
1339     return HAL_ERROR;
1340   }
1341 
1342   /* Check the parameters */
1343   assert_param(IS_TIM_INSTANCE(htim->Instance));
1344   assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode));
1345   assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision));
1346   assert_param(IS_TIM_PERIOD(htim, htim->Init.Period));
1347   assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload));
1348 
1349   if (htim->State == HAL_TIM_STATE_RESET)
1350   {
1351     /* Allocate lock resource and initialize it */
1352     htim->Lock = HAL_UNLOCKED;
1353 
1354 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
1355     /* Reset interrupt callbacks to legacy weak callbacks */
1356     TIM_ResetCallback(htim);
1357 
1358     if (htim->PWM_MspInitCallback == NULL)
1359     {
1360       htim->PWM_MspInitCallback = HAL_TIM_PWM_MspInit;
1361     }
1362     /* Init the low level hardware : GPIO, CLOCK, NVIC */
1363     htim->PWM_MspInitCallback(htim);
1364 #else
1365     /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */
1366     HAL_TIM_PWM_MspInit(htim);
1367 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
1368   }
1369 
1370   /* Set the TIM state */
1371   htim->State = HAL_TIM_STATE_BUSY;
1372 
1373   /* Init the base time for the PWM */
1374   TIM_Base_SetConfig(htim->Instance, &htim->Init);
1375 
1376   /* Initialize the DMA burst operation state */
1377   htim->DMABurstState = HAL_DMA_BURST_STATE_READY;
1378 
1379   /* Initialize the TIM channels state */
1380   TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY);
1381   TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY);
1382 
1383   /* Initialize the TIM state*/
1384   htim->State = HAL_TIM_STATE_READY;
1385 
1386   return HAL_OK;
1387 }
1388 
1389 /**
1390   * @brief  DeInitializes the TIM peripheral
1391   * @param  htim TIM PWM handle
1392   * @retval HAL status
1393   */
HAL_TIM_PWM_DeInit(TIM_HandleTypeDef * htim)1394 HAL_StatusTypeDef HAL_TIM_PWM_DeInit(TIM_HandleTypeDef *htim)
1395 {
1396   /* Check the parameters */
1397   assert_param(IS_TIM_INSTANCE(htim->Instance));
1398 
1399   htim->State = HAL_TIM_STATE_BUSY;
1400 
1401   /* Disable the TIM Peripheral Clock */
1402   __HAL_TIM_DISABLE(htim);
1403 
1404 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
1405   if (htim->PWM_MspDeInitCallback == NULL)
1406   {
1407     htim->PWM_MspDeInitCallback = HAL_TIM_PWM_MspDeInit;
1408   }
1409   /* DeInit the low level hardware */
1410   htim->PWM_MspDeInitCallback(htim);
1411 #else
1412   /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */
1413   HAL_TIM_PWM_MspDeInit(htim);
1414 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
1415 
1416   /* Change the DMA burst operation state */
1417   htim->DMABurstState = HAL_DMA_BURST_STATE_RESET;
1418 
1419   /* Change the TIM channels state */
1420   TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET);
1421   TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET);
1422 
1423   /* Change TIM state */
1424   htim->State = HAL_TIM_STATE_RESET;
1425 
1426   /* Release Lock */
1427   __HAL_UNLOCK(htim);
1428 
1429   return HAL_OK;
1430 }
1431 
1432 /**
1433   * @brief  Initializes the TIM PWM MSP.
1434   * @param  htim TIM PWM handle
1435   * @retval None
1436   */
HAL_TIM_PWM_MspInit(TIM_HandleTypeDef * htim)1437 __weak void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
1438 {
1439   /* Prevent unused argument(s) compilation warning */
1440   UNUSED(htim);
1441 
1442   /* NOTE : This function should not be modified, when the callback is needed,
1443             the HAL_TIM_PWM_MspInit could be implemented in the user file
1444    */
1445 }
1446 
1447 /**
1448   * @brief  DeInitializes TIM PWM MSP.
1449   * @param  htim TIM PWM handle
1450   * @retval None
1451   */
HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef * htim)1452 __weak void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef *htim)
1453 {
1454   /* Prevent unused argument(s) compilation warning */
1455   UNUSED(htim);
1456 
1457   /* NOTE : This function should not be modified, when the callback is needed,
1458             the HAL_TIM_PWM_MspDeInit could be implemented in the user file
1459    */
1460 }
1461 
1462 /**
1463   * @brief  Starts the PWM signal generation.
1464   * @param  htim TIM handle
1465   * @param  Channel TIM Channels to be enabled
1466   *          This parameter can be one of the following values:
1467   *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
1468   *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
1469   *            @arg TIM_CHANNEL_3: TIM Channel 3 selected
1470   *            @arg TIM_CHANNEL_4: TIM Channel 4 selected
1471   *            @arg TIM_CHANNEL_5: TIM Channel 5 selected
1472   *            @arg TIM_CHANNEL_6: TIM Channel 6 selected
1473   * @retval HAL status
1474   */
HAL_TIM_PWM_Start(TIM_HandleTypeDef * htim,uint32_t Channel)1475 HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel)
1476 {
1477   uint32_t tmpsmcr;
1478 
1479   /* Check the parameters */
1480   assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel));
1481 
1482   /* Check the TIM channel state */
1483   if (TIM_CHANNEL_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY)
1484   {
1485     return HAL_ERROR;
1486   }
1487 
1488   /* Set the TIM channel state */
1489   TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY);
1490 
1491   /* Enable the Capture compare channel */
1492   TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE);
1493 
1494   if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)
1495   {
1496     /* Enable the main output */
1497     __HAL_TIM_MOE_ENABLE(htim);
1498   }
1499 
1500   /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */
1501   if (IS_TIM_SLAVE_INSTANCE(htim->Instance))
1502   {
1503     tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
1504     if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
1505     {
1506       __HAL_TIM_ENABLE(htim);
1507     }
1508   }
1509   else
1510   {
1511     __HAL_TIM_ENABLE(htim);
1512   }
1513 
1514   /* Return function status */
1515   return HAL_OK;
1516 }
1517 
1518 /**
1519   * @brief  Stops the PWM signal generation.
1520   * @param  htim TIM PWM handle
1521   * @param  Channel TIM Channels to be disabled
1522   *          This parameter can be one of the following values:
1523   *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
1524   *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
1525   *            @arg TIM_CHANNEL_3: TIM Channel 3 selected
1526   *            @arg TIM_CHANNEL_4: TIM Channel 4 selected
1527   *            @arg TIM_CHANNEL_5: TIM Channel 5 selected
1528   *            @arg TIM_CHANNEL_6: TIM Channel 6 selected
1529   * @retval HAL status
1530   */
HAL_TIM_PWM_Stop(TIM_HandleTypeDef * htim,uint32_t Channel)1531 HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel)
1532 {
1533   /* Check the parameters */
1534   assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel));
1535 
1536   /* Disable the Capture compare channel */
1537   TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE);
1538 
1539   if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)
1540   {
1541     /* Disable the Main Output */
1542     __HAL_TIM_MOE_DISABLE(htim);
1543   }
1544 
1545   /* Disable the Peripheral */
1546   __HAL_TIM_DISABLE(htim);
1547 
1548   /* Set the TIM channel state */
1549   TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY);
1550 
1551   /* Return function status */
1552   return HAL_OK;
1553 }
1554 
1555 /**
1556   * @brief  Starts the PWM signal generation in interrupt mode.
1557   * @param  htim TIM PWM handle
1558   * @param  Channel TIM Channel to be enabled
1559   *          This parameter can be one of the following values:
1560   *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
1561   *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
1562   *            @arg TIM_CHANNEL_3: TIM Channel 3 selected
1563   *            @arg TIM_CHANNEL_4: TIM Channel 4 selected
1564   * @retval HAL status
1565   */
HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef * htim,uint32_t Channel)1566 HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel)
1567 {
1568   HAL_StatusTypeDef status = HAL_OK;
1569   uint32_t tmpsmcr;
1570 
1571   /* Check the parameters */
1572   assert_param(IS_TIM_CCX_CHANNEL(htim->Instance, Channel));
1573 
1574   /* Check the TIM channel state */
1575   if (TIM_CHANNEL_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY)
1576   {
1577     return HAL_ERROR;
1578   }
1579 
1580   /* Set the TIM channel state */
1581   TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY);
1582 
1583   switch (Channel)
1584   {
1585     case TIM_CHANNEL_1:
1586     {
1587       /* Enable the TIM Capture/Compare 1 interrupt */
1588       __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1);
1589       break;
1590     }
1591 
1592     case TIM_CHANNEL_2:
1593     {
1594       /* Enable the TIM Capture/Compare 2 interrupt */
1595       __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2);
1596       break;
1597     }
1598 
1599     case TIM_CHANNEL_3:
1600     {
1601       /* Enable the TIM Capture/Compare 3 interrupt */
1602       __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3);
1603       break;
1604     }
1605 
1606     case TIM_CHANNEL_4:
1607     {
1608       /* Enable the TIM Capture/Compare 4 interrupt */
1609       __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4);
1610       break;
1611     }
1612 
1613     default:
1614       status = HAL_ERROR;
1615       break;
1616   }
1617 
1618   if (status == HAL_OK)
1619   {
1620     /* Enable the Capture compare channel */
1621     TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE);
1622 
1623     if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)
1624     {
1625       /* Enable the main output */
1626       __HAL_TIM_MOE_ENABLE(htim);
1627     }
1628 
1629     /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */
1630     if (IS_TIM_SLAVE_INSTANCE(htim->Instance))
1631     {
1632       tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
1633       if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
1634       {
1635         __HAL_TIM_ENABLE(htim);
1636       }
1637     }
1638     else
1639     {
1640       __HAL_TIM_ENABLE(htim);
1641     }
1642   }
1643 
1644   /* Return function status */
1645   return status;
1646 }
1647 
1648 /**
1649   * @brief  Stops the PWM signal generation in interrupt mode.
1650   * @param  htim TIM PWM handle
1651   * @param  Channel TIM Channels to be disabled
1652   *          This parameter can be one of the following values:
1653   *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
1654   *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
1655   *            @arg TIM_CHANNEL_3: TIM Channel 3 selected
1656   *            @arg TIM_CHANNEL_4: TIM Channel 4 selected
1657   * @retval HAL status
1658   */
HAL_TIM_PWM_Stop_IT(TIM_HandleTypeDef * htim,uint32_t Channel)1659 HAL_StatusTypeDef HAL_TIM_PWM_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel)
1660 {
1661   HAL_StatusTypeDef status = HAL_OK;
1662 
1663   /* Check the parameters */
1664   assert_param(IS_TIM_CCX_CHANNEL(htim->Instance, Channel));
1665 
1666   switch (Channel)
1667   {
1668     case TIM_CHANNEL_1:
1669     {
1670       /* Disable the TIM Capture/Compare 1 interrupt */
1671       __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1);
1672       break;
1673     }
1674 
1675     case TIM_CHANNEL_2:
1676     {
1677       /* Disable the TIM Capture/Compare 2 interrupt */
1678       __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2);
1679       break;
1680     }
1681 
1682     case TIM_CHANNEL_3:
1683     {
1684       /* Disable the TIM Capture/Compare 3 interrupt */
1685       __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3);
1686       break;
1687     }
1688 
1689     case TIM_CHANNEL_4:
1690     {
1691       /* Disable the TIM Capture/Compare 4 interrupt */
1692       __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4);
1693       break;
1694     }
1695 
1696     default:
1697       status = HAL_ERROR;
1698       break;
1699   }
1700 
1701   if (status == HAL_OK)
1702   {
1703     /* Disable the Capture compare channel */
1704     TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE);
1705 
1706     if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)
1707     {
1708       /* Disable the Main Output */
1709       __HAL_TIM_MOE_DISABLE(htim);
1710     }
1711 
1712     /* Disable the Peripheral */
1713     __HAL_TIM_DISABLE(htim);
1714 
1715     /* Set the TIM channel state */
1716     TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY);
1717   }
1718 
1719   /* Return function status */
1720   return status;
1721 }
1722 
1723 /**
1724   * @brief  Starts the TIM PWM signal generation in DMA mode.
1725   * @param  htim TIM PWM handle
1726   * @param  Channel TIM Channels to be enabled
1727   *          This parameter can be one of the following values:
1728   *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
1729   *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
1730   *            @arg TIM_CHANNEL_3: TIM Channel 3 selected
1731   *            @arg TIM_CHANNEL_4: TIM Channel 4 selected
1732   * @param  pData The source Buffer address.
1733   * @param  Length The length of data to be transferred from memory to TIM peripheral
1734   * @retval HAL status
1735   */
HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef * htim,uint32_t Channel,const uint32_t * pData,uint16_t Length)1736 HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, const uint32_t *pData,
1737                                         uint16_t Length)
1738 {
1739   HAL_StatusTypeDef status = HAL_OK;
1740   uint32_t tmpsmcr;
1741 
1742   /* Check the parameters */
1743   assert_param(IS_TIM_CCX_CHANNEL(htim->Instance, Channel));
1744 
1745   /* Set the TIM channel state */
1746   if (TIM_CHANNEL_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_BUSY)
1747   {
1748     return HAL_BUSY;
1749   }
1750   else if (TIM_CHANNEL_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_READY)
1751   {
1752     if ((pData == NULL) || (Length == 0U))
1753     {
1754       return HAL_ERROR;
1755     }
1756     else
1757     {
1758       TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY);
1759     }
1760   }
1761   else
1762   {
1763     return HAL_ERROR;
1764   }
1765 
1766   switch (Channel)
1767   {
1768     case TIM_CHANNEL_1:
1769     {
1770       /* Set the DMA compare callbacks */
1771       htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt;
1772       htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;
1773 
1774       /* Set the DMA error callback */
1775       htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ;
1776 
1777       /* Enable the DMA channel */
1778       if (TIM_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1,
1779                            Length) != HAL_OK)
1780       {
1781         /* Return error status */
1782         return HAL_ERROR;
1783       }
1784 
1785       /* Enable the TIM Capture/Compare 1 DMA request */
1786       __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1);
1787       break;
1788     }
1789 
1790     case TIM_CHANNEL_2:
1791     {
1792       /* Set the DMA compare callbacks */
1793       htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt;
1794       htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;
1795 
1796       /* Set the DMA error callback */
1797       htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ;
1798 
1799       /* Enable the DMA channel */
1800       if (TIM_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2,
1801                            Length) != HAL_OK)
1802       {
1803         /* Return error status */
1804         return HAL_ERROR;
1805       }
1806       /* Enable the TIM Capture/Compare 2 DMA request */
1807       __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2);
1808       break;
1809     }
1810 
1811     case TIM_CHANNEL_3:
1812     {
1813       /* Set the DMA compare callbacks */
1814       htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt;
1815       htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;
1816 
1817       /* Set the DMA error callback */
1818       htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ;
1819 
1820       /* Enable the DMA channel */
1821       if (TIM_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3,
1822                            Length) != HAL_OK)
1823       {
1824         /* Return error status */
1825         return HAL_ERROR;
1826       }
1827       /* Enable the TIM Output Capture/Compare 3 request */
1828       __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3);
1829       break;
1830     }
1831 
1832     case TIM_CHANNEL_4:
1833     {
1834       /* Set the DMA compare callbacks */
1835       htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt;
1836       htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;
1837 
1838       /* Set the DMA error callback */
1839       htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ;
1840 
1841       /* Enable the DMA channel */
1842       if (TIM_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)pData, (uint32_t)&htim->Instance->CCR4,
1843                            Length) != HAL_OK)
1844       {
1845         /* Return error status */
1846         return HAL_ERROR;
1847       }
1848       /* Enable the TIM Capture/Compare 4 DMA request */
1849       __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4);
1850       break;
1851     }
1852 
1853     default:
1854       status = HAL_ERROR;
1855       break;
1856   }
1857 
1858   if (status == HAL_OK)
1859   {
1860     /* Enable the Capture compare channel */
1861     TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE);
1862 
1863     if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)
1864     {
1865       /* Enable the main output */
1866       __HAL_TIM_MOE_ENABLE(htim);
1867     }
1868 
1869     /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */
1870     if (IS_TIM_SLAVE_INSTANCE(htim->Instance))
1871     {
1872       tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
1873       if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
1874       {
1875         __HAL_TIM_ENABLE(htim);
1876       }
1877     }
1878     else
1879     {
1880       __HAL_TIM_ENABLE(htim);
1881     }
1882   }
1883 
1884   /* Return function status */
1885   return status;
1886 }
1887 
1888 /**
1889   * @brief  Stops the TIM PWM signal generation in DMA mode.
1890   * @param  htim TIM PWM handle
1891   * @param  Channel TIM Channels to be disabled
1892   *          This parameter can be one of the following values:
1893   *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
1894   *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
1895   *            @arg TIM_CHANNEL_3: TIM Channel 3 selected
1896   *            @arg TIM_CHANNEL_4: TIM Channel 4 selected
1897   * @retval HAL status
1898   */
HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef * htim,uint32_t Channel)1899 HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel)
1900 {
1901   HAL_StatusTypeDef status = HAL_OK;
1902 
1903   /* Check the parameters */
1904   assert_param(IS_TIM_CCX_CHANNEL(htim->Instance, Channel));
1905 
1906   switch (Channel)
1907   {
1908     case TIM_CHANNEL_1:
1909     {
1910       /* Disable the TIM Capture/Compare 1 DMA request */
1911       __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1);
1912       (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]);
1913       break;
1914     }
1915 
1916     case TIM_CHANNEL_2:
1917     {
1918       /* Disable the TIM Capture/Compare 2 DMA request */
1919       __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2);
1920       (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]);
1921       break;
1922     }
1923 
1924     case TIM_CHANNEL_3:
1925     {
1926       /* Disable the TIM Capture/Compare 3 DMA request */
1927       __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3);
1928       (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]);
1929       break;
1930     }
1931 
1932     case TIM_CHANNEL_4:
1933     {
1934       /* Disable the TIM Capture/Compare 4 interrupt */
1935       __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4);
1936       (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]);
1937       break;
1938     }
1939 
1940     default:
1941       status = HAL_ERROR;
1942       break;
1943   }
1944 
1945   if (status == HAL_OK)
1946   {
1947     /* Disable the Capture compare channel */
1948     TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE);
1949 
1950     if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)
1951     {
1952       /* Disable the Main Output */
1953       __HAL_TIM_MOE_DISABLE(htim);
1954     }
1955 
1956     /* Disable the Peripheral */
1957     __HAL_TIM_DISABLE(htim);
1958 
1959     /* Set the TIM channel state */
1960     TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY);
1961   }
1962 
1963   /* Return function status */
1964   return status;
1965 }
1966 
1967 /**
1968   * @}
1969   */
1970 
1971 /** @defgroup TIM_Exported_Functions_Group4 TIM Input Capture functions
1972   *  @brief    TIM Input Capture functions
1973   *
1974 @verbatim
1975   ==============================================================================
1976               ##### TIM Input Capture functions #####
1977   ==============================================================================
1978  [..]
1979    This section provides functions allowing to:
1980    (+) Initialize and configure the TIM Input Capture.
1981    (+) De-initialize the TIM Input Capture.
1982    (+) Start the TIM Input Capture.
1983    (+) Stop the TIM Input Capture.
1984    (+) Start the TIM Input Capture and enable interrupt.
1985    (+) Stop the TIM Input Capture and disable interrupt.
1986    (+) Start the TIM Input Capture and enable DMA transfer.
1987    (+) Stop the TIM Input Capture and disable DMA transfer.
1988 
1989 @endverbatim
1990   * @{
1991   */
1992 /**
1993   * @brief  Initializes the TIM Input Capture Time base according to the specified
1994   *         parameters in the TIM_HandleTypeDef and initializes the associated handle.
1995   * @note   Switching from Center Aligned counter mode to Edge counter mode (or reverse)
1996   *         requires a timer reset to avoid unexpected direction
1997   *         due to DIR bit readonly in center aligned mode.
1998   *         Ex: call @ref HAL_TIM_IC_DeInit() before HAL_TIM_IC_Init()
1999   * @param  htim TIM Input Capture handle
2000   * @retval HAL status
2001   */
HAL_TIM_IC_Init(TIM_HandleTypeDef * htim)2002 HAL_StatusTypeDef HAL_TIM_IC_Init(TIM_HandleTypeDef *htim)
2003 {
2004   /* Check the TIM handle allocation */
2005   if (htim == NULL)
2006   {
2007     return HAL_ERROR;
2008   }
2009 
2010   /* Check the parameters */
2011   assert_param(IS_TIM_INSTANCE(htim->Instance));
2012   assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode));
2013   assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision));
2014   assert_param(IS_TIM_PERIOD(htim, htim->Init.Period));
2015   assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload));
2016 
2017   if (htim->State == HAL_TIM_STATE_RESET)
2018   {
2019     /* Allocate lock resource and initialize it */
2020     htim->Lock = HAL_UNLOCKED;
2021 
2022 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
2023     /* Reset interrupt callbacks to legacy weak callbacks */
2024     TIM_ResetCallback(htim);
2025 
2026     if (htim->IC_MspInitCallback == NULL)
2027     {
2028       htim->IC_MspInitCallback = HAL_TIM_IC_MspInit;
2029     }
2030     /* Init the low level hardware : GPIO, CLOCK, NVIC */
2031     htim->IC_MspInitCallback(htim);
2032 #else
2033     /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */
2034     HAL_TIM_IC_MspInit(htim);
2035 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
2036   }
2037 
2038   /* Set the TIM state */
2039   htim->State = HAL_TIM_STATE_BUSY;
2040 
2041   /* Init the base time for the input capture */
2042   TIM_Base_SetConfig(htim->Instance, &htim->Init);
2043 
2044   /* Initialize the DMA burst operation state */
2045   htim->DMABurstState = HAL_DMA_BURST_STATE_READY;
2046 
2047   /* Initialize the TIM channels state */
2048   TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY);
2049   TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY);
2050 
2051   /* Initialize the TIM state*/
2052   htim->State = HAL_TIM_STATE_READY;
2053 
2054   return HAL_OK;
2055 }
2056 
2057 /**
2058   * @brief  DeInitializes the TIM peripheral
2059   * @param  htim TIM Input Capture handle
2060   * @retval HAL status
2061   */
HAL_TIM_IC_DeInit(TIM_HandleTypeDef * htim)2062 HAL_StatusTypeDef HAL_TIM_IC_DeInit(TIM_HandleTypeDef *htim)
2063 {
2064   /* Check the parameters */
2065   assert_param(IS_TIM_INSTANCE(htim->Instance));
2066 
2067   htim->State = HAL_TIM_STATE_BUSY;
2068 
2069   /* Disable the TIM Peripheral Clock */
2070   __HAL_TIM_DISABLE(htim);
2071 
2072 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
2073   if (htim->IC_MspDeInitCallback == NULL)
2074   {
2075     htim->IC_MspDeInitCallback = HAL_TIM_IC_MspDeInit;
2076   }
2077   /* DeInit the low level hardware */
2078   htim->IC_MspDeInitCallback(htim);
2079 #else
2080   /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */
2081   HAL_TIM_IC_MspDeInit(htim);
2082 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
2083 
2084   /* Change the DMA burst operation state */
2085   htim->DMABurstState = HAL_DMA_BURST_STATE_RESET;
2086 
2087   /* Change the TIM channels state */
2088   TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET);
2089   TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET);
2090 
2091   /* Change TIM state */
2092   htim->State = HAL_TIM_STATE_RESET;
2093 
2094   /* Release Lock */
2095   __HAL_UNLOCK(htim);
2096 
2097   return HAL_OK;
2098 }
2099 
2100 /**
2101   * @brief  Initializes the TIM Input Capture MSP.
2102   * @param  htim TIM Input Capture handle
2103   * @retval None
2104   */
HAL_TIM_IC_MspInit(TIM_HandleTypeDef * htim)2105 __weak void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim)
2106 {
2107   /* Prevent unused argument(s) compilation warning */
2108   UNUSED(htim);
2109 
2110   /* NOTE : This function should not be modified, when the callback is needed,
2111             the HAL_TIM_IC_MspInit could be implemented in the user file
2112    */
2113 }
2114 
2115 /**
2116   * @brief  DeInitializes TIM Input Capture MSP.
2117   * @param  htim TIM handle
2118   * @retval None
2119   */
HAL_TIM_IC_MspDeInit(TIM_HandleTypeDef * htim)2120 __weak void HAL_TIM_IC_MspDeInit(TIM_HandleTypeDef *htim)
2121 {
2122   /* Prevent unused argument(s) compilation warning */
2123   UNUSED(htim);
2124 
2125   /* NOTE : This function should not be modified, when the callback is needed,
2126             the HAL_TIM_IC_MspDeInit could be implemented in the user file
2127    */
2128 }
2129 
2130 /**
2131   * @brief  Starts the TIM Input Capture measurement.
2132   * @param  htim TIM Input Capture handle
2133   * @param  Channel TIM Channels to be enabled
2134   *          This parameter can be one of the following values:
2135   *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
2136   *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
2137   *            @arg TIM_CHANNEL_3: TIM Channel 3 selected
2138   *            @arg TIM_CHANNEL_4: TIM Channel 4 selected
2139   * @retval HAL status
2140   */
HAL_TIM_IC_Start(TIM_HandleTypeDef * htim,uint32_t Channel)2141 HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel)
2142 {
2143   uint32_t tmpsmcr;
2144   HAL_TIM_ChannelStateTypeDef channel_state = TIM_CHANNEL_STATE_GET(htim, Channel);
2145   HAL_TIM_ChannelStateTypeDef complementary_channel_state = TIM_CHANNEL_N_STATE_GET(htim, Channel);
2146 
2147   /* Check the parameters */
2148   assert_param(IS_TIM_CCX_CHANNEL(htim->Instance, Channel));
2149 
2150   /* Check the TIM channel state */
2151   if ((channel_state != HAL_TIM_CHANNEL_STATE_READY)
2152       || (complementary_channel_state != HAL_TIM_CHANNEL_STATE_READY))
2153   {
2154     return HAL_ERROR;
2155   }
2156 
2157   /* Set the TIM channel state */
2158   TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY);
2159   TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY);
2160 
2161   /* Enable the Input Capture channel */
2162   TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE);
2163 
2164   /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */
2165   if (IS_TIM_SLAVE_INSTANCE(htim->Instance))
2166   {
2167     tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
2168     if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
2169     {
2170       __HAL_TIM_ENABLE(htim);
2171     }
2172   }
2173   else
2174   {
2175     __HAL_TIM_ENABLE(htim);
2176   }
2177 
2178   /* Return function status */
2179   return HAL_OK;
2180 }
2181 
2182 /**
2183   * @brief  Stops the TIM Input Capture measurement.
2184   * @param  htim TIM Input Capture handle
2185   * @param  Channel TIM Channels to be disabled
2186   *          This parameter can be one of the following values:
2187   *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
2188   *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
2189   *            @arg TIM_CHANNEL_3: TIM Channel 3 selected
2190   *            @arg TIM_CHANNEL_4: TIM Channel 4 selected
2191   * @retval HAL status
2192   */
HAL_TIM_IC_Stop(TIM_HandleTypeDef * htim,uint32_t Channel)2193 HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel)
2194 {
2195   /* Check the parameters */
2196   assert_param(IS_TIM_CCX_CHANNEL(htim->Instance, Channel));
2197 
2198   /* Disable the Input Capture channel */
2199   TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE);
2200 
2201   /* Disable the Peripheral */
2202   __HAL_TIM_DISABLE(htim);
2203 
2204   /* Set the TIM channel state */
2205   TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY);
2206   TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY);
2207 
2208   /* Return function status */
2209   return HAL_OK;
2210 }
2211 
2212 /**
2213   * @brief  Starts the TIM Input Capture measurement in interrupt mode.
2214   * @param  htim TIM Input Capture handle
2215   * @param  Channel TIM Channels to be enabled
2216   *          This parameter can be one of the following values:
2217   *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
2218   *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
2219   *            @arg TIM_CHANNEL_3: TIM Channel 3 selected
2220   *            @arg TIM_CHANNEL_4: TIM Channel 4 selected
2221   * @retval HAL status
2222   */
HAL_TIM_IC_Start_IT(TIM_HandleTypeDef * htim,uint32_t Channel)2223 HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel)
2224 {
2225   HAL_StatusTypeDef status = HAL_OK;
2226   uint32_t tmpsmcr;
2227 
2228   HAL_TIM_ChannelStateTypeDef channel_state = TIM_CHANNEL_STATE_GET(htim, Channel);
2229   HAL_TIM_ChannelStateTypeDef complementary_channel_state = TIM_CHANNEL_N_STATE_GET(htim, Channel);
2230 
2231   /* Check the parameters */
2232   assert_param(IS_TIM_CCX_CHANNEL(htim->Instance, Channel));
2233 
2234   /* Check the TIM channel state */
2235   if ((channel_state != HAL_TIM_CHANNEL_STATE_READY)
2236       || (complementary_channel_state != HAL_TIM_CHANNEL_STATE_READY))
2237   {
2238     return HAL_ERROR;
2239   }
2240 
2241   /* Set the TIM channel state */
2242   TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY);
2243   TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY);
2244 
2245   switch (Channel)
2246   {
2247     case TIM_CHANNEL_1:
2248     {
2249       /* Enable the TIM Capture/Compare 1 interrupt */
2250       __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1);
2251       break;
2252     }
2253 
2254     case TIM_CHANNEL_2:
2255     {
2256       /* Enable the TIM Capture/Compare 2 interrupt */
2257       __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2);
2258       break;
2259     }
2260 
2261     case TIM_CHANNEL_3:
2262     {
2263       /* Enable the TIM Capture/Compare 3 interrupt */
2264       __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3);
2265       break;
2266     }
2267 
2268     case TIM_CHANNEL_4:
2269     {
2270       /* Enable the TIM Capture/Compare 4 interrupt */
2271       __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4);
2272       break;
2273     }
2274 
2275     default:
2276       status = HAL_ERROR;
2277       break;
2278   }
2279 
2280   if (status == HAL_OK)
2281   {
2282     /* Enable the Input Capture channel */
2283     TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE);
2284 
2285     /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */
2286     if (IS_TIM_SLAVE_INSTANCE(htim->Instance))
2287     {
2288       tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
2289       if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
2290       {
2291         __HAL_TIM_ENABLE(htim);
2292       }
2293     }
2294     else
2295     {
2296       __HAL_TIM_ENABLE(htim);
2297     }
2298   }
2299 
2300   /* Return function status */
2301   return status;
2302 }
2303 
2304 /**
2305   * @brief  Stops the TIM Input Capture measurement in interrupt mode.
2306   * @param  htim TIM Input Capture handle
2307   * @param  Channel TIM Channels to be disabled
2308   *          This parameter can be one of the following values:
2309   *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
2310   *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
2311   *            @arg TIM_CHANNEL_3: TIM Channel 3 selected
2312   *            @arg TIM_CHANNEL_4: TIM Channel 4 selected
2313   * @retval HAL status
2314   */
HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef * htim,uint32_t Channel)2315 HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel)
2316 {
2317   HAL_StatusTypeDef status = HAL_OK;
2318 
2319   /* Check the parameters */
2320   assert_param(IS_TIM_CCX_CHANNEL(htim->Instance, Channel));
2321 
2322   switch (Channel)
2323   {
2324     case TIM_CHANNEL_1:
2325     {
2326       /* Disable the TIM Capture/Compare 1 interrupt */
2327       __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1);
2328       break;
2329     }
2330 
2331     case TIM_CHANNEL_2:
2332     {
2333       /* Disable the TIM Capture/Compare 2 interrupt */
2334       __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2);
2335       break;
2336     }
2337 
2338     case TIM_CHANNEL_3:
2339     {
2340       /* Disable the TIM Capture/Compare 3 interrupt */
2341       __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3);
2342       break;
2343     }
2344 
2345     case TIM_CHANNEL_4:
2346     {
2347       /* Disable the TIM Capture/Compare 4 interrupt */
2348       __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4);
2349       break;
2350     }
2351 
2352     default:
2353       status = HAL_ERROR;
2354       break;
2355   }
2356 
2357   if (status == HAL_OK)
2358   {
2359     /* Disable the Input Capture channel */
2360     TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE);
2361 
2362     /* Disable the Peripheral */
2363     __HAL_TIM_DISABLE(htim);
2364 
2365     /* Set the TIM channel state */
2366     TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY);
2367     TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY);
2368   }
2369 
2370   /* Return function status */
2371   return status;
2372 }
2373 
2374 /**
2375   * @brief  Starts the TIM Input Capture measurement in DMA mode.
2376   * @param  htim TIM Input Capture handle
2377   * @param  Channel TIM Channels to be enabled
2378   *          This parameter can be one of the following values:
2379   *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
2380   *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
2381   *            @arg TIM_CHANNEL_3: TIM Channel 3 selected
2382   *            @arg TIM_CHANNEL_4: TIM Channel 4 selected
2383   * @param  pData The destination Buffer address.
2384   * @param  Length The length of data to be transferred from TIM peripheral to memory.
2385   * @retval HAL status
2386   */
HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef * htim,uint32_t Channel,uint32_t * pData,uint16_t Length)2387 HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length)
2388 {
2389   HAL_StatusTypeDef status = HAL_OK;
2390   uint32_t tmpsmcr;
2391 
2392   HAL_TIM_ChannelStateTypeDef channel_state = TIM_CHANNEL_STATE_GET(htim, Channel);
2393   HAL_TIM_ChannelStateTypeDef complementary_channel_state = TIM_CHANNEL_N_STATE_GET(htim, Channel);
2394 
2395   /* Check the parameters */
2396   assert_param(IS_TIM_CCX_CHANNEL(htim->Instance, Channel));
2397   assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance));
2398 
2399   /* Set the TIM channel state */
2400   if ((channel_state == HAL_TIM_CHANNEL_STATE_BUSY)
2401       || (complementary_channel_state == HAL_TIM_CHANNEL_STATE_BUSY))
2402   {
2403     return HAL_BUSY;
2404   }
2405   else if ((channel_state == HAL_TIM_CHANNEL_STATE_READY)
2406            && (complementary_channel_state == HAL_TIM_CHANNEL_STATE_READY))
2407   {
2408     if ((pData == NULL) || (Length == 0U))
2409     {
2410       return HAL_ERROR;
2411     }
2412     else
2413     {
2414       TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY);
2415       TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY);
2416     }
2417   }
2418   else
2419   {
2420     return HAL_ERROR;
2421   }
2422 
2423   /* Enable the Input Capture channel */
2424   TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE);
2425 
2426   switch (Channel)
2427   {
2428     case TIM_CHANNEL_1:
2429     {
2430       /* Set the DMA capture callbacks */
2431       htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt;
2432       htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt;
2433 
2434       /* Set the DMA error callback */
2435       htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ;
2436 
2437       /* Enable the DMA channel */
2438       if (TIM_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData,
2439                            Length) != HAL_OK)
2440       {
2441         /* Return error status */
2442         return HAL_ERROR;
2443       }
2444       /* Enable the TIM Capture/Compare 1 DMA request */
2445       __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1);
2446       break;
2447     }
2448 
2449     case TIM_CHANNEL_2:
2450     {
2451       /* Set the DMA capture callbacks */
2452       htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt;
2453       htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt;
2454 
2455       /* Set the DMA error callback */
2456       htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ;
2457 
2458       /* Enable the DMA channel */
2459       if (TIM_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData,
2460                            Length) != HAL_OK)
2461       {
2462         /* Return error status */
2463         return HAL_ERROR;
2464       }
2465       /* Enable the TIM Capture/Compare 2  DMA request */
2466       __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2);
2467       break;
2468     }
2469 
2470     case TIM_CHANNEL_3:
2471     {
2472       /* Set the DMA capture callbacks */
2473       htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMACaptureCplt;
2474       htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt;
2475 
2476       /* Set the DMA error callback */
2477       htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ;
2478 
2479       /* Enable the DMA channel */
2480       if (TIM_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)&htim->Instance->CCR3, (uint32_t)pData,
2481                            Length) != HAL_OK)
2482       {
2483         /* Return error status */
2484         return HAL_ERROR;
2485       }
2486       /* Enable the TIM Capture/Compare 3  DMA request */
2487       __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3);
2488       break;
2489     }
2490 
2491     case TIM_CHANNEL_4:
2492     {
2493       /* Set the DMA capture callbacks */
2494       htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMACaptureCplt;
2495       htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt;
2496 
2497       /* Set the DMA error callback */
2498       htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ;
2499 
2500       /* Enable the DMA channel */
2501       if (TIM_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)&htim->Instance->CCR4, (uint32_t)pData,
2502                            Length) != HAL_OK)
2503       {
2504         /* Return error status */
2505         return HAL_ERROR;
2506       }
2507       /* Enable the TIM Capture/Compare 4  DMA request */
2508       __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4);
2509       break;
2510     }
2511 
2512     default:
2513       status = HAL_ERROR;
2514       break;
2515   }
2516 
2517   /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */
2518   if (IS_TIM_SLAVE_INSTANCE(htim->Instance))
2519   {
2520     tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
2521     if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
2522     {
2523       __HAL_TIM_ENABLE(htim);
2524     }
2525   }
2526   else
2527   {
2528     __HAL_TIM_ENABLE(htim);
2529   }
2530 
2531   /* Return function status */
2532   return status;
2533 }
2534 
2535 /**
2536   * @brief  Stops the TIM Input Capture measurement in DMA mode.
2537   * @param  htim TIM Input Capture handle
2538   * @param  Channel TIM Channels to be disabled
2539   *          This parameter can be one of the following values:
2540   *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
2541   *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
2542   *            @arg TIM_CHANNEL_3: TIM Channel 3 selected
2543   *            @arg TIM_CHANNEL_4: TIM Channel 4 selected
2544   * @retval HAL status
2545   */
HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef * htim,uint32_t Channel)2546 HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel)
2547 {
2548   HAL_StatusTypeDef status = HAL_OK;
2549 
2550   /* Check the parameters */
2551   assert_param(IS_TIM_CCX_CHANNEL(htim->Instance, Channel));
2552   assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance));
2553 
2554   /* Disable the Input Capture channel */
2555   TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE);
2556 
2557   switch (Channel)
2558   {
2559     case TIM_CHANNEL_1:
2560     {
2561       /* Disable the TIM Capture/Compare 1 DMA request */
2562       __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1);
2563       (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]);
2564       break;
2565     }
2566 
2567     case TIM_CHANNEL_2:
2568     {
2569       /* Disable the TIM Capture/Compare 2 DMA request */
2570       __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2);
2571       (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]);
2572       break;
2573     }
2574 
2575     case TIM_CHANNEL_3:
2576     {
2577       /* Disable the TIM Capture/Compare 3  DMA request */
2578       __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3);
2579       (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]);
2580       break;
2581     }
2582 
2583     case TIM_CHANNEL_4:
2584     {
2585       /* Disable the TIM Capture/Compare 4  DMA request */
2586       __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4);
2587       (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]);
2588       break;
2589     }
2590 
2591     default:
2592       status = HAL_ERROR;
2593       break;
2594   }
2595 
2596   if (status == HAL_OK)
2597   {
2598     /* Disable the Peripheral */
2599     __HAL_TIM_DISABLE(htim);
2600 
2601     /* Set the TIM channel state */
2602     TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY);
2603     TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY);
2604   }
2605 
2606   /* Return function status */
2607   return status;
2608 }
2609 /**
2610   * @}
2611   */
2612 
2613 /** @defgroup TIM_Exported_Functions_Group5 TIM One Pulse functions
2614   *  @brief    TIM One Pulse functions
2615   *
2616 @verbatim
2617   ==============================================================================
2618                         ##### TIM One Pulse functions #####
2619   ==============================================================================
2620   [..]
2621     This section provides functions allowing to:
2622     (+) Initialize and configure the TIM One Pulse.
2623     (+) De-initialize the TIM One Pulse.
2624     (+) Start the TIM One Pulse.
2625     (+) Stop the TIM One Pulse.
2626     (+) Start the TIM One Pulse and enable interrupt.
2627     (+) Stop the TIM One Pulse and disable interrupt.
2628     (+) Start the TIM One Pulse and enable DMA transfer.
2629     (+) Stop the TIM One Pulse and disable DMA transfer.
2630 
2631 @endverbatim
2632   * @{
2633   */
2634 /**
2635   * @brief  Initializes the TIM One Pulse Time Base according to the specified
2636   *         parameters in the TIM_HandleTypeDef and initializes the associated handle.
2637   * @note   Switching from Center Aligned counter mode to Edge counter mode (or reverse)
2638   *         requires a timer reset to avoid unexpected direction
2639   *         due to DIR bit readonly in center aligned mode.
2640   *         Ex: call @ref HAL_TIM_OnePulse_DeInit() before HAL_TIM_OnePulse_Init()
2641   * @note   When the timer instance is initialized in One Pulse mode, timer
2642   *         channels 1 and channel 2 are reserved and cannot be used for other
2643   *         purpose.
2644   * @param  htim TIM One Pulse handle
2645   * @param  OnePulseMode Select the One pulse mode.
2646   *         This parameter can be one of the following values:
2647   *            @arg TIM_OPMODE_SINGLE: Only one pulse will be generated.
2648   *            @arg TIM_OPMODE_REPETITIVE: Repetitive pulses will be generated.
2649   * @retval HAL status
2650   */
HAL_TIM_OnePulse_Init(TIM_HandleTypeDef * htim,uint32_t OnePulseMode)2651 HAL_StatusTypeDef HAL_TIM_OnePulse_Init(TIM_HandleTypeDef *htim, uint32_t OnePulseMode)
2652 {
2653   /* Check the TIM handle allocation */
2654   if (htim == NULL)
2655   {
2656     return HAL_ERROR;
2657   }
2658 
2659   /* Check the parameters */
2660   assert_param(IS_TIM_INSTANCE(htim->Instance));
2661   assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode));
2662   assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision));
2663   assert_param(IS_TIM_OPM_MODE(OnePulseMode));
2664   assert_param(IS_TIM_PERIOD(htim, htim->Init.Period));
2665   assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload));
2666 
2667   if (htim->State == HAL_TIM_STATE_RESET)
2668   {
2669     /* Allocate lock resource and initialize it */
2670     htim->Lock = HAL_UNLOCKED;
2671 
2672 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
2673     /* Reset interrupt callbacks to legacy weak callbacks */
2674     TIM_ResetCallback(htim);
2675 
2676     if (htim->OnePulse_MspInitCallback == NULL)
2677     {
2678       htim->OnePulse_MspInitCallback = HAL_TIM_OnePulse_MspInit;
2679     }
2680     /* Init the low level hardware : GPIO, CLOCK, NVIC */
2681     htim->OnePulse_MspInitCallback(htim);
2682 #else
2683     /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */
2684     HAL_TIM_OnePulse_MspInit(htim);
2685 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
2686   }
2687 
2688   /* Set the TIM state */
2689   htim->State = HAL_TIM_STATE_BUSY;
2690 
2691   /* Configure the Time base in the One Pulse Mode */
2692   TIM_Base_SetConfig(htim->Instance, &htim->Init);
2693 
2694   /* Reset the OPM Bit */
2695   htim->Instance->CR1 &= ~TIM_CR1_OPM;
2696 
2697   /* Configure the OPM Mode */
2698   htim->Instance->CR1 |= OnePulseMode;
2699 
2700   /* Initialize the DMA burst operation state */
2701   htim->DMABurstState = HAL_DMA_BURST_STATE_READY;
2702 
2703   /* Initialize the TIM channels state */
2704   TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY);
2705   TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY);
2706   TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY);
2707   TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY);
2708 
2709   /* Initialize the TIM state*/
2710   htim->State = HAL_TIM_STATE_READY;
2711 
2712   return HAL_OK;
2713 }
2714 
2715 /**
2716   * @brief  DeInitializes the TIM One Pulse
2717   * @param  htim TIM One Pulse handle
2718   * @retval HAL status
2719   */
HAL_TIM_OnePulse_DeInit(TIM_HandleTypeDef * htim)2720 HAL_StatusTypeDef HAL_TIM_OnePulse_DeInit(TIM_HandleTypeDef *htim)
2721 {
2722   /* Check the parameters */
2723   assert_param(IS_TIM_INSTANCE(htim->Instance));
2724 
2725   htim->State = HAL_TIM_STATE_BUSY;
2726 
2727   /* Disable the TIM Peripheral Clock */
2728   __HAL_TIM_DISABLE(htim);
2729 
2730 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
2731   if (htim->OnePulse_MspDeInitCallback == NULL)
2732   {
2733     htim->OnePulse_MspDeInitCallback = HAL_TIM_OnePulse_MspDeInit;
2734   }
2735   /* DeInit the low level hardware */
2736   htim->OnePulse_MspDeInitCallback(htim);
2737 #else
2738   /* DeInit the low level hardware: GPIO, CLOCK, NVIC */
2739   HAL_TIM_OnePulse_MspDeInit(htim);
2740 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
2741 
2742   /* Change the DMA burst operation state */
2743   htim->DMABurstState = HAL_DMA_BURST_STATE_RESET;
2744 
2745   /* Set the TIM channel state */
2746   TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET);
2747   TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET);
2748   TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET);
2749   TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET);
2750 
2751   /* Change TIM state */
2752   htim->State = HAL_TIM_STATE_RESET;
2753 
2754   /* Release Lock */
2755   __HAL_UNLOCK(htim);
2756 
2757   return HAL_OK;
2758 }
2759 
2760 /**
2761   * @brief  Initializes the TIM One Pulse MSP.
2762   * @param  htim TIM One Pulse handle
2763   * @retval None
2764   */
HAL_TIM_OnePulse_MspInit(TIM_HandleTypeDef * htim)2765 __weak void HAL_TIM_OnePulse_MspInit(TIM_HandleTypeDef *htim)
2766 {
2767   /* Prevent unused argument(s) compilation warning */
2768   UNUSED(htim);
2769 
2770   /* NOTE : This function should not be modified, when the callback is needed,
2771             the HAL_TIM_OnePulse_MspInit could be implemented in the user file
2772    */
2773 }
2774 
2775 /**
2776   * @brief  DeInitializes TIM One Pulse MSP.
2777   * @param  htim TIM One Pulse handle
2778   * @retval None
2779   */
HAL_TIM_OnePulse_MspDeInit(TIM_HandleTypeDef * htim)2780 __weak void HAL_TIM_OnePulse_MspDeInit(TIM_HandleTypeDef *htim)
2781 {
2782   /* Prevent unused argument(s) compilation warning */
2783   UNUSED(htim);
2784 
2785   /* NOTE : This function should not be modified, when the callback is needed,
2786             the HAL_TIM_OnePulse_MspDeInit could be implemented in the user file
2787    */
2788 }
2789 
2790 /**
2791   * @brief  Starts the TIM One Pulse signal generation.
2792   * @note Though OutputChannel parameter is deprecated and ignored by the function
2793   *        it has been kept to avoid HAL_TIM API compatibility break.
2794   * @note The pulse output channel is determined when calling
2795   *       @ref HAL_TIM_OnePulse_ConfigChannel().
2796   * @param  htim TIM One Pulse handle
2797   * @param  OutputChannel See note above
2798   * @retval HAL status
2799   */
HAL_TIM_OnePulse_Start(TIM_HandleTypeDef * htim,uint32_t OutputChannel)2800 HAL_StatusTypeDef HAL_TIM_OnePulse_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel)
2801 {
2802   HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1);
2803   HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2);
2804   HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1);
2805   HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2);
2806 
2807   /* Prevent unused argument(s) compilation warning */
2808   UNUSED(OutputChannel);
2809 
2810   /* Check the TIM channels state */
2811   if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY)
2812       || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY)
2813       || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY)
2814       || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY))
2815   {
2816     return HAL_ERROR;
2817   }
2818 
2819   /* Set the TIM channels state */
2820   TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY);
2821   TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY);
2822   TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY);
2823   TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY);
2824 
2825   /* Enable the Capture compare and the Input Capture channels
2826     (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2)
2827     if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and
2828     if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output
2829     whatever the combination, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be enabled together
2830 
2831     No need to enable the counter, it's enabled automatically by hardware
2832     (the counter starts in response to a stimulus and generate a pulse */
2833 
2834   TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE);
2835   TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE);
2836 
2837   if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)
2838   {
2839     /* Enable the main output */
2840     __HAL_TIM_MOE_ENABLE(htim);
2841   }
2842 
2843   /* Return function status */
2844   return HAL_OK;
2845 }
2846 
2847 /**
2848   * @brief  Stops the TIM One Pulse signal generation.
2849   * @note Though OutputChannel parameter is deprecated and ignored by the function
2850   *        it has been kept to avoid HAL_TIM API compatibility break.
2851   * @note The pulse output channel is determined when calling
2852   *       @ref HAL_TIM_OnePulse_ConfigChannel().
2853   * @param  htim TIM One Pulse handle
2854   * @param  OutputChannel See note above
2855   * @retval HAL status
2856   */
HAL_TIM_OnePulse_Stop(TIM_HandleTypeDef * htim,uint32_t OutputChannel)2857 HAL_StatusTypeDef HAL_TIM_OnePulse_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel)
2858 {
2859   /* Prevent unused argument(s) compilation warning */
2860   UNUSED(OutputChannel);
2861 
2862   /* Disable the Capture compare and the Input Capture channels
2863   (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2)
2864   if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and
2865   if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output
2866   whatever the combination, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be disabled together */
2867 
2868   TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE);
2869   TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE);
2870 
2871   if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)
2872   {
2873     /* Disable the Main Output */
2874     __HAL_TIM_MOE_DISABLE(htim);
2875   }
2876 
2877   /* Disable the Peripheral */
2878   __HAL_TIM_DISABLE(htim);
2879 
2880   /* Set the TIM channels state */
2881   TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY);
2882   TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY);
2883   TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY);
2884   TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY);
2885 
2886   /* Return function status */
2887   return HAL_OK;
2888 }
2889 
2890 /**
2891   * @brief  Starts the TIM One Pulse signal generation in interrupt mode.
2892   * @note Though OutputChannel parameter is deprecated and ignored by the function
2893   *        it has been kept to avoid HAL_TIM API compatibility break.
2894   * @note The pulse output channel is determined when calling
2895   *       @ref HAL_TIM_OnePulse_ConfigChannel().
2896   * @param  htim TIM One Pulse handle
2897   * @param  OutputChannel See note above
2898   * @retval HAL status
2899   */
HAL_TIM_OnePulse_Start_IT(TIM_HandleTypeDef * htim,uint32_t OutputChannel)2900 HAL_StatusTypeDef HAL_TIM_OnePulse_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel)
2901 {
2902   HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1);
2903   HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2);
2904   HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1);
2905   HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2);
2906 
2907   /* Prevent unused argument(s) compilation warning */
2908   UNUSED(OutputChannel);
2909 
2910   /* Check the TIM channels state */
2911   if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY)
2912       || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY)
2913       || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY)
2914       || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY))
2915   {
2916     return HAL_ERROR;
2917   }
2918 
2919   /* Set the TIM channels state */
2920   TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY);
2921   TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY);
2922   TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY);
2923   TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY);
2924 
2925   /* Enable the Capture compare and the Input Capture channels
2926     (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2)
2927     if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and
2928     if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output
2929     whatever the combination, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be enabled together
2930 
2931     No need to enable the counter, it's enabled automatically by hardware
2932     (the counter starts in response to a stimulus and generate a pulse */
2933 
2934   /* Enable the TIM Capture/Compare 1 interrupt */
2935   __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1);
2936 
2937   /* Enable the TIM Capture/Compare 2 interrupt */
2938   __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2);
2939 
2940   TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE);
2941   TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE);
2942 
2943   if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)
2944   {
2945     /* Enable the main output */
2946     __HAL_TIM_MOE_ENABLE(htim);
2947   }
2948 
2949   /* Return function status */
2950   return HAL_OK;
2951 }
2952 
2953 /**
2954   * @brief  Stops the TIM One Pulse signal generation in interrupt mode.
2955   * @note Though OutputChannel parameter is deprecated and ignored by the function
2956   *        it has been kept to avoid HAL_TIM API compatibility break.
2957   * @note The pulse output channel is determined when calling
2958   *       @ref HAL_TIM_OnePulse_ConfigChannel().
2959   * @param  htim TIM One Pulse handle
2960   * @param  OutputChannel See note above
2961   * @retval HAL status
2962   */
HAL_TIM_OnePulse_Stop_IT(TIM_HandleTypeDef * htim,uint32_t OutputChannel)2963 HAL_StatusTypeDef HAL_TIM_OnePulse_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel)
2964 {
2965   /* Prevent unused argument(s) compilation warning */
2966   UNUSED(OutputChannel);
2967 
2968   /* Disable the TIM Capture/Compare 1 interrupt */
2969   __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1);
2970 
2971   /* Disable the TIM Capture/Compare 2 interrupt */
2972   __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2);
2973 
2974   /* Disable the Capture compare and the Input Capture channels
2975   (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2)
2976   if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and
2977   if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output
2978   whatever the combination, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be disabled together */
2979   TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE);
2980   TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE);
2981 
2982   if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)
2983   {
2984     /* Disable the Main Output */
2985     __HAL_TIM_MOE_DISABLE(htim);
2986   }
2987 
2988   /* Disable the Peripheral */
2989   __HAL_TIM_DISABLE(htim);
2990 
2991   /* Set the TIM channels state */
2992   TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY);
2993   TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY);
2994   TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY);
2995   TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY);
2996 
2997   /* Return function status */
2998   return HAL_OK;
2999 }
3000 
3001 /**
3002   * @}
3003   */
3004 
3005 /** @defgroup TIM_Exported_Functions_Group6 TIM Encoder functions
3006   *  @brief    TIM Encoder functions
3007   *
3008 @verbatim
3009   ==============================================================================
3010                           ##### TIM Encoder functions #####
3011   ==============================================================================
3012   [..]
3013     This section provides functions allowing to:
3014     (+) Initialize and configure the TIM Encoder.
3015     (+) De-initialize the TIM Encoder.
3016     (+) Start the TIM Encoder.
3017     (+) Stop the TIM Encoder.
3018     (+) Start the TIM Encoder and enable interrupt.
3019     (+) Stop the TIM Encoder and disable interrupt.
3020     (+) Start the TIM Encoder and enable DMA transfer.
3021     (+) Stop the TIM Encoder and disable DMA transfer.
3022 
3023 @endverbatim
3024   * @{
3025   */
3026 /**
3027   * @brief  Initializes the TIM Encoder Interface and initialize the associated handle.
3028   * @note   Switching from Center Aligned counter mode to Edge counter mode (or reverse)
3029   *         requires a timer reset to avoid unexpected direction
3030   *         due to DIR bit readonly in center aligned mode.
3031   *         Ex: call @ref HAL_TIM_Encoder_DeInit() before HAL_TIM_Encoder_Init()
3032   * @note   Encoder mode and External clock mode 2 are not compatible and must not be selected together
3033   *         Ex: A call for @ref HAL_TIM_Encoder_Init will erase the settings of @ref HAL_TIM_ConfigClockSource
3034   *         using TIM_CLOCKSOURCE_ETRMODE2 and vice versa
3035   * @note   When the timer instance is initialized in Encoder mode, timer
3036   *         channels 1 and channel 2 are reserved and cannot be used for other
3037   *         purpose.
3038   * @param  htim TIM Encoder Interface handle
3039   * @param  sConfig TIM Encoder Interface configuration structure
3040   * @retval HAL status
3041   */
HAL_TIM_Encoder_Init(TIM_HandleTypeDef * htim,TIM_Encoder_InitTypeDef * sConfig)3042 HAL_StatusTypeDef HAL_TIM_Encoder_Init(TIM_HandleTypeDef *htim,  TIM_Encoder_InitTypeDef *sConfig)
3043 {
3044   uint32_t tmpsmcr;
3045   uint32_t tmpccmr1;
3046   uint32_t tmpccer;
3047 
3048   /* Check the TIM handle allocation */
3049   if (htim == NULL)
3050   {
3051     return HAL_ERROR;
3052   }
3053 
3054   /* Check the parameters */
3055   assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance));
3056   assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode));
3057   assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision));
3058   assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload));
3059   assert_param(IS_TIM_ENCODER_MODE(sConfig->EncoderMode));
3060   assert_param(IS_TIM_IC_SELECTION(sConfig->IC1Selection));
3061   assert_param(IS_TIM_IC_SELECTION(sConfig->IC2Selection));
3062   assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC1Polarity));
3063   assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC2Polarity));
3064   assert_param(IS_TIM_IC_PRESCALER(sConfig->IC1Prescaler));
3065   assert_param(IS_TIM_IC_PRESCALER(sConfig->IC2Prescaler));
3066   assert_param(IS_TIM_IC_FILTER(sConfig->IC1Filter));
3067   assert_param(IS_TIM_IC_FILTER(sConfig->IC2Filter));
3068   assert_param(IS_TIM_PERIOD(htim, htim->Init.Period));
3069 
3070   if (htim->State == HAL_TIM_STATE_RESET)
3071   {
3072     /* Allocate lock resource and initialize it */
3073     htim->Lock = HAL_UNLOCKED;
3074 
3075 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
3076     /* Reset interrupt callbacks to legacy weak callbacks */
3077     TIM_ResetCallback(htim);
3078 
3079     if (htim->Encoder_MspInitCallback == NULL)
3080     {
3081       htim->Encoder_MspInitCallback = HAL_TIM_Encoder_MspInit;
3082     }
3083     /* Init the low level hardware : GPIO, CLOCK, NVIC */
3084     htim->Encoder_MspInitCallback(htim);
3085 #else
3086     /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */
3087     HAL_TIM_Encoder_MspInit(htim);
3088 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
3089   }
3090 
3091   /* Set the TIM state */
3092   htim->State = HAL_TIM_STATE_BUSY;
3093 
3094   /* Reset the SMS and ECE bits */
3095   htim->Instance->SMCR &= ~(TIM_SMCR_SMS | TIM_SMCR_ECE);
3096 
3097   /* Configure the Time base in the Encoder Mode */
3098   TIM_Base_SetConfig(htim->Instance, &htim->Init);
3099 
3100   /* Get the TIMx SMCR register value */
3101   tmpsmcr = htim->Instance->SMCR;
3102 
3103   /* Get the TIMx CCMR1 register value */
3104   tmpccmr1 = htim->Instance->CCMR1;
3105 
3106   /* Get the TIMx CCER register value */
3107   tmpccer = htim->Instance->CCER;
3108 
3109   /* Set the encoder Mode */
3110   tmpsmcr |= sConfig->EncoderMode;
3111 
3112   /* Select the Capture Compare 1 and the Capture Compare 2 as input */
3113   tmpccmr1 &= ~(TIM_CCMR1_CC1S | TIM_CCMR1_CC2S);
3114   tmpccmr1 |= (sConfig->IC1Selection | (sConfig->IC2Selection << 8U));
3115 
3116   /* Set the Capture Compare 1 and the Capture Compare 2 prescalers and filters */
3117   tmpccmr1 &= ~(TIM_CCMR1_IC1PSC | TIM_CCMR1_IC2PSC);
3118   tmpccmr1 &= ~(TIM_CCMR1_IC1F | TIM_CCMR1_IC2F);
3119   tmpccmr1 |= sConfig->IC1Prescaler | (sConfig->IC2Prescaler << 8U);
3120   tmpccmr1 |= (sConfig->IC1Filter << 4U) | (sConfig->IC2Filter << 12U);
3121 
3122   /* Set the TI1 and the TI2 Polarities */
3123   tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC2P);
3124   tmpccer &= ~(TIM_CCER_CC1NP | TIM_CCER_CC2NP);
3125   tmpccer |= sConfig->IC1Polarity | (sConfig->IC2Polarity << 4U);
3126 
3127   /* Write to TIMx SMCR */
3128   htim->Instance->SMCR = tmpsmcr;
3129 
3130   /* Write to TIMx CCMR1 */
3131   htim->Instance->CCMR1 = tmpccmr1;
3132 
3133   /* Write to TIMx CCER */
3134   htim->Instance->CCER = tmpccer;
3135 
3136   /* Initialize the DMA burst operation state */
3137   htim->DMABurstState = HAL_DMA_BURST_STATE_READY;
3138 
3139   /* Set the TIM channels state */
3140   TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY);
3141   TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY);
3142   TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY);
3143   TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY);
3144 
3145   /* Initialize the TIM state*/
3146   htim->State = HAL_TIM_STATE_READY;
3147 
3148   return HAL_OK;
3149 }
3150 
3151 
3152 /**
3153   * @brief  DeInitializes the TIM Encoder interface
3154   * @param  htim TIM Encoder Interface handle
3155   * @retval HAL status
3156   */
HAL_TIM_Encoder_DeInit(TIM_HandleTypeDef * htim)3157 HAL_StatusTypeDef HAL_TIM_Encoder_DeInit(TIM_HandleTypeDef *htim)
3158 {
3159   /* Check the parameters */
3160   assert_param(IS_TIM_INSTANCE(htim->Instance));
3161 
3162   htim->State = HAL_TIM_STATE_BUSY;
3163 
3164   /* Disable the TIM Peripheral Clock */
3165   __HAL_TIM_DISABLE(htim);
3166 
3167 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
3168   if (htim->Encoder_MspDeInitCallback == NULL)
3169   {
3170     htim->Encoder_MspDeInitCallback = HAL_TIM_Encoder_MspDeInit;
3171   }
3172   /* DeInit the low level hardware */
3173   htim->Encoder_MspDeInitCallback(htim);
3174 #else
3175   /* DeInit the low level hardware: GPIO, CLOCK, NVIC */
3176   HAL_TIM_Encoder_MspDeInit(htim);
3177 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
3178 
3179   /* Change the DMA burst operation state */
3180   htim->DMABurstState = HAL_DMA_BURST_STATE_RESET;
3181 
3182   /* Set the TIM channels state */
3183   TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET);
3184   TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET);
3185   TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET);
3186   TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET);
3187 
3188   /* Change TIM state */
3189   htim->State = HAL_TIM_STATE_RESET;
3190 
3191   /* Release Lock */
3192   __HAL_UNLOCK(htim);
3193 
3194   return HAL_OK;
3195 }
3196 
3197 /**
3198   * @brief  Initializes the TIM Encoder Interface MSP.
3199   * @param  htim TIM Encoder Interface handle
3200   * @retval None
3201   */
HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef * htim)3202 __weak void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim)
3203 {
3204   /* Prevent unused argument(s) compilation warning */
3205   UNUSED(htim);
3206 
3207   /* NOTE : This function should not be modified, when the callback is needed,
3208             the HAL_TIM_Encoder_MspInit could be implemented in the user file
3209    */
3210 }
3211 
3212 /**
3213   * @brief  DeInitializes TIM Encoder Interface MSP.
3214   * @param  htim TIM Encoder Interface handle
3215   * @retval None
3216   */
HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef * htim)3217 __weak void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef *htim)
3218 {
3219   /* Prevent unused argument(s) compilation warning */
3220   UNUSED(htim);
3221 
3222   /* NOTE : This function should not be modified, when the callback is needed,
3223             the HAL_TIM_Encoder_MspDeInit could be implemented in the user file
3224    */
3225 }
3226 
3227 /**
3228   * @brief  Starts the TIM Encoder Interface.
3229   * @param  htim TIM Encoder Interface handle
3230   * @param  Channel TIM Channels to be enabled
3231   *          This parameter can be one of the following values:
3232   *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
3233   *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
3234   *            @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected
3235   * @retval HAL status
3236   */
HAL_TIM_Encoder_Start(TIM_HandleTypeDef * htim,uint32_t Channel)3237 HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channel)
3238 {
3239   HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1);
3240   HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2);
3241   HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1);
3242   HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2);
3243 
3244   /* Check the parameters */
3245   assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance));
3246 
3247   /* Set the TIM channel(s) state */
3248   if (Channel == TIM_CHANNEL_1)
3249   {
3250     if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY)
3251         || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY))
3252     {
3253       return HAL_ERROR;
3254     }
3255     else
3256     {
3257       TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY);
3258       TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY);
3259     }
3260   }
3261   else if (Channel == TIM_CHANNEL_2)
3262   {
3263     if ((channel_2_state != HAL_TIM_CHANNEL_STATE_READY)
3264         || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY))
3265     {
3266       return HAL_ERROR;
3267     }
3268     else
3269     {
3270       TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY);
3271       TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY);
3272     }
3273   }
3274   else
3275   {
3276     if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY)
3277         || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY)
3278         || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY)
3279         || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY))
3280     {
3281       return HAL_ERROR;
3282     }
3283     else
3284     {
3285       TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY);
3286       TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY);
3287       TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY);
3288       TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY);
3289     }
3290   }
3291 
3292   /* Enable the encoder interface channels */
3293   switch (Channel)
3294   {
3295     case TIM_CHANNEL_1:
3296     {
3297       TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE);
3298       break;
3299     }
3300 
3301     case TIM_CHANNEL_2:
3302     {
3303       TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE);
3304       break;
3305     }
3306 
3307     default :
3308     {
3309       TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE);
3310       TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE);
3311       break;
3312     }
3313   }
3314   /* Enable the Peripheral */
3315   __HAL_TIM_ENABLE(htim);
3316 
3317   /* Return function status */
3318   return HAL_OK;
3319 }
3320 
3321 /**
3322   * @brief  Stops the TIM Encoder Interface.
3323   * @param  htim TIM Encoder Interface handle
3324   * @param  Channel TIM Channels to be disabled
3325   *          This parameter can be one of the following values:
3326   *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
3327   *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
3328   *            @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected
3329   * @retval HAL status
3330   */
HAL_TIM_Encoder_Stop(TIM_HandleTypeDef * htim,uint32_t Channel)3331 HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel)
3332 {
3333   /* Check the parameters */
3334   assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance));
3335 
3336   /* Disable the Input Capture channels 1 and 2
3337     (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */
3338   switch (Channel)
3339   {
3340     case TIM_CHANNEL_1:
3341     {
3342       TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE);
3343       break;
3344     }
3345 
3346     case TIM_CHANNEL_2:
3347     {
3348       TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE);
3349       break;
3350     }
3351 
3352     default :
3353     {
3354       TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE);
3355       TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE);
3356       break;
3357     }
3358   }
3359 
3360   /* Disable the Peripheral */
3361   __HAL_TIM_DISABLE(htim);
3362 
3363   /* Set the TIM channel(s) state */
3364   if ((Channel == TIM_CHANNEL_1) || (Channel == TIM_CHANNEL_2))
3365   {
3366     TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY);
3367     TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY);
3368   }
3369   else
3370   {
3371     TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY);
3372     TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY);
3373     TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY);
3374     TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY);
3375   }
3376 
3377   /* Return function status */
3378   return HAL_OK;
3379 }
3380 
3381 /**
3382   * @brief  Starts the TIM Encoder Interface in interrupt mode.
3383   * @param  htim TIM Encoder Interface handle
3384   * @param  Channel TIM Channels to be enabled
3385   *          This parameter can be one of the following values:
3386   *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
3387   *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
3388   *            @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected
3389   * @retval HAL status
3390   */
HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef * htim,uint32_t Channel)3391 HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel)
3392 {
3393   HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1);
3394   HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2);
3395   HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1);
3396   HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2);
3397 
3398   /* Check the parameters */
3399   assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance));
3400 
3401   /* Set the TIM channel(s) state */
3402   if (Channel == TIM_CHANNEL_1)
3403   {
3404     if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY)
3405         || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY))
3406     {
3407       return HAL_ERROR;
3408     }
3409     else
3410     {
3411       TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY);
3412       TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY);
3413     }
3414   }
3415   else if (Channel == TIM_CHANNEL_2)
3416   {
3417     if ((channel_2_state != HAL_TIM_CHANNEL_STATE_READY)
3418         || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY))
3419     {
3420       return HAL_ERROR;
3421     }
3422     else
3423     {
3424       TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY);
3425       TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY);
3426     }
3427   }
3428   else
3429   {
3430     if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY)
3431         || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY)
3432         || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY)
3433         || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY))
3434     {
3435       return HAL_ERROR;
3436     }
3437     else
3438     {
3439       TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY);
3440       TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY);
3441       TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY);
3442       TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY);
3443     }
3444   }
3445 
3446   /* Enable the encoder interface channels */
3447   /* Enable the capture compare Interrupts 1 and/or 2 */
3448   switch (Channel)
3449   {
3450     case TIM_CHANNEL_1:
3451     {
3452       TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE);
3453       __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1);
3454       break;
3455     }
3456 
3457     case TIM_CHANNEL_2:
3458     {
3459       TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE);
3460       __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2);
3461       break;
3462     }
3463 
3464     default :
3465     {
3466       TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE);
3467       TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE);
3468       __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1);
3469       __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2);
3470       break;
3471     }
3472   }
3473 
3474   /* Enable the Peripheral */
3475   __HAL_TIM_ENABLE(htim);
3476 
3477   /* Return function status */
3478   return HAL_OK;
3479 }
3480 
3481 /**
3482   * @brief  Stops the TIM Encoder Interface in interrupt mode.
3483   * @param  htim TIM Encoder Interface handle
3484   * @param  Channel TIM Channels to be disabled
3485   *          This parameter can be one of the following values:
3486   *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
3487   *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
3488   *            @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected
3489   * @retval HAL status
3490   */
HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef * htim,uint32_t Channel)3491 HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel)
3492 {
3493   /* Check the parameters */
3494   assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance));
3495 
3496   /* Disable the Input Capture channels 1 and 2
3497     (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */
3498   if (Channel == TIM_CHANNEL_1)
3499   {
3500     TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE);
3501 
3502     /* Disable the capture compare Interrupts 1 */
3503     __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1);
3504   }
3505   else if (Channel == TIM_CHANNEL_2)
3506   {
3507     TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE);
3508 
3509     /* Disable the capture compare Interrupts 2 */
3510     __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2);
3511   }
3512   else
3513   {
3514     TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE);
3515     TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE);
3516 
3517     /* Disable the capture compare Interrupts 1 and 2 */
3518     __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1);
3519     __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2);
3520   }
3521 
3522   /* Disable the Peripheral */
3523   __HAL_TIM_DISABLE(htim);
3524 
3525   /* Set the TIM channel(s) state */
3526   if ((Channel == TIM_CHANNEL_1) || (Channel == TIM_CHANNEL_2))
3527   {
3528     TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY);
3529     TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY);
3530   }
3531   else
3532   {
3533     TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY);
3534     TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY);
3535     TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY);
3536     TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY);
3537   }
3538 
3539   /* Return function status */
3540   return HAL_OK;
3541 }
3542 
3543 /**
3544   * @brief  Starts the TIM Encoder Interface in DMA mode.
3545   * @param  htim TIM Encoder Interface handle
3546   * @param  Channel TIM Channels to be enabled
3547   *          This parameter can be one of the following values:
3548   *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
3549   *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
3550   *            @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected
3551   * @param  pData1 The destination Buffer address for IC1.
3552   * @param  pData2 The destination Buffer address for IC2.
3553   * @param  Length The length of data to be transferred from TIM peripheral to memory.
3554   * @retval HAL status
3555   */
HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef * htim,uint32_t Channel,uint32_t * pData1,uint32_t * pData2,uint16_t Length)3556 HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1,
3557                                             uint32_t *pData2, uint16_t Length)
3558 {
3559   HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1);
3560   HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2);
3561   HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1);
3562   HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2);
3563 
3564   /* Check the parameters */
3565   assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance));
3566 
3567   /* Set the TIM channel(s) state */
3568   if (Channel == TIM_CHANNEL_1)
3569   {
3570     if ((channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY)
3571         || (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY))
3572     {
3573       return HAL_BUSY;
3574     }
3575     else if ((channel_1_state == HAL_TIM_CHANNEL_STATE_READY)
3576              && (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_READY))
3577     {
3578       if ((pData1 == NULL) || (Length == 0U))
3579       {
3580         return HAL_ERROR;
3581       }
3582       else
3583       {
3584         TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY);
3585         TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY);
3586       }
3587     }
3588     else
3589     {
3590       return HAL_ERROR;
3591     }
3592   }
3593   else if (Channel == TIM_CHANNEL_2)
3594   {
3595     if ((channel_2_state == HAL_TIM_CHANNEL_STATE_BUSY)
3596         || (complementary_channel_2_state == HAL_TIM_CHANNEL_STATE_BUSY))
3597     {
3598       return HAL_BUSY;
3599     }
3600     else if ((channel_2_state == HAL_TIM_CHANNEL_STATE_READY)
3601              && (complementary_channel_2_state == HAL_TIM_CHANNEL_STATE_READY))
3602     {
3603       if ((pData2 == NULL) || (Length == 0U))
3604       {
3605         return HAL_ERROR;
3606       }
3607       else
3608       {
3609         TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY);
3610         TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY);
3611       }
3612     }
3613     else
3614     {
3615       return HAL_ERROR;
3616     }
3617   }
3618   else
3619   {
3620     if ((channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY)
3621         || (channel_2_state == HAL_TIM_CHANNEL_STATE_BUSY)
3622         || (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY)
3623         || (complementary_channel_2_state == HAL_TIM_CHANNEL_STATE_BUSY))
3624     {
3625       return HAL_BUSY;
3626     }
3627     else if ((channel_1_state == HAL_TIM_CHANNEL_STATE_READY)
3628              && (channel_2_state == HAL_TIM_CHANNEL_STATE_READY)
3629              && (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_READY)
3630              && (complementary_channel_2_state == HAL_TIM_CHANNEL_STATE_READY))
3631     {
3632       if ((((pData1 == NULL) || (pData2 == NULL))) || (Length == 0U))
3633       {
3634         return HAL_ERROR;
3635       }
3636       else
3637       {
3638         TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY);
3639         TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY);
3640         TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY);
3641         TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY);
3642       }
3643     }
3644     else
3645     {
3646       return HAL_ERROR;
3647     }
3648   }
3649 
3650   switch (Channel)
3651   {
3652     case TIM_CHANNEL_1:
3653     {
3654       /* Set the DMA capture callbacks */
3655       htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt;
3656       htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt;
3657 
3658       /* Set the DMA error callback */
3659       htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ;
3660 
3661       /* Enable the DMA channel */
3662       if (TIM_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData1,
3663                            Length) != HAL_OK)
3664       {
3665         /* Return error status */
3666         return HAL_ERROR;
3667       }
3668       /* Enable the TIM Input Capture DMA request */
3669       __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1);
3670 
3671       /* Enable the Capture compare channel */
3672       TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE);
3673 
3674       /* Enable the Peripheral */
3675       __HAL_TIM_ENABLE(htim);
3676 
3677       break;
3678     }
3679 
3680     case TIM_CHANNEL_2:
3681     {
3682       /* Set the DMA capture callbacks */
3683       htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt;
3684       htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt;
3685 
3686       /* Set the DMA error callback */
3687       htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError;
3688       /* Enable the DMA channel */
3689       if (TIM_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData2,
3690                            Length) != HAL_OK)
3691       {
3692         /* Return error status */
3693         return HAL_ERROR;
3694       }
3695       /* Enable the TIM Input Capture  DMA request */
3696       __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2);
3697 
3698       /* Enable the Capture compare channel */
3699       TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE);
3700 
3701       /* Enable the Peripheral */
3702       __HAL_TIM_ENABLE(htim);
3703 
3704       break;
3705     }
3706 
3707     default:
3708     {
3709       /* Set the DMA capture callbacks */
3710       htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt;
3711       htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt;
3712 
3713       /* Set the DMA error callback */
3714       htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ;
3715 
3716       /* Enable the DMA channel */
3717       if (TIM_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData1,
3718                            Length) != HAL_OK)
3719       {
3720         /* Return error status */
3721         return HAL_ERROR;
3722       }
3723 
3724       /* Set the DMA capture callbacks */
3725       htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt;
3726       htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt;
3727 
3728       /* Set the DMA error callback */
3729       htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ;
3730 
3731       /* Enable the DMA channel */
3732       if (TIM_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData2,
3733                            Length) != HAL_OK)
3734       {
3735         /* Return error status */
3736         return HAL_ERROR;
3737       }
3738 
3739       /* Enable the TIM Input Capture  DMA request */
3740       __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1);
3741       /* Enable the TIM Input Capture  DMA request */
3742       __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2);
3743 
3744       /* Enable the Capture compare channel */
3745       TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE);
3746       TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE);
3747 
3748       /* Enable the Peripheral */
3749       __HAL_TIM_ENABLE(htim);
3750 
3751       break;
3752     }
3753   }
3754 
3755   /* Return function status */
3756   return HAL_OK;
3757 }
3758 
3759 /**
3760   * @brief  Stops the TIM Encoder Interface in DMA mode.
3761   * @param  htim TIM Encoder Interface handle
3762   * @param  Channel TIM Channels to be enabled
3763   *          This parameter can be one of the following values:
3764   *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
3765   *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
3766   *            @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected
3767   * @retval HAL status
3768   */
HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef * htim,uint32_t Channel)3769 HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel)
3770 {
3771   /* Check the parameters */
3772   assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance));
3773 
3774   /* Disable the Input Capture channels 1 and 2
3775     (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */
3776   if (Channel == TIM_CHANNEL_1)
3777   {
3778     TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE);
3779 
3780     /* Disable the capture compare DMA Request 1 */
3781     __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1);
3782     (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]);
3783   }
3784   else if (Channel == TIM_CHANNEL_2)
3785   {
3786     TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE);
3787 
3788     /* Disable the capture compare DMA Request 2 */
3789     __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2);
3790     (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]);
3791   }
3792   else
3793   {
3794     TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE);
3795     TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE);
3796 
3797     /* Disable the capture compare DMA Request 1 and 2 */
3798     __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1);
3799     __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2);
3800     (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]);
3801     (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]);
3802   }
3803 
3804   /* Disable the Peripheral */
3805   __HAL_TIM_DISABLE(htim);
3806 
3807   /* Set the TIM channel(s) state */
3808   if ((Channel == TIM_CHANNEL_1) || (Channel == TIM_CHANNEL_2))
3809   {
3810     TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY);
3811     TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY);
3812   }
3813   else
3814   {
3815     TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY);
3816     TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY);
3817     TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY);
3818     TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY);
3819   }
3820 
3821   /* Return function status */
3822   return HAL_OK;
3823 }
3824 
3825 /**
3826   * @}
3827   */
3828 /** @defgroup TIM_Exported_Functions_Group7 TIM IRQ handler management
3829   *  @brief    TIM IRQ handler management
3830   *
3831 @verbatim
3832   ==============================================================================
3833                         ##### IRQ handler management #####
3834   ==============================================================================
3835   [..]
3836     This section provides Timer IRQ handler function.
3837 
3838 @endverbatim
3839   * @{
3840   */
3841 /**
3842   * @brief  This function handles TIM interrupts requests.
3843   * @param  htim TIM  handle
3844   * @retval None
3845   */
HAL_TIM_IRQHandler(TIM_HandleTypeDef * htim)3846 void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim)
3847 {
3848   uint32_t itsource = htim->Instance->DIER;
3849   uint32_t itflag   = htim->Instance->SR;
3850 
3851   /* Capture compare 1 event */
3852   if ((itflag & (TIM_FLAG_CC1)) == (TIM_FLAG_CC1))
3853   {
3854     if ((itsource & (TIM_IT_CC1)) == (TIM_IT_CC1))
3855     {
3856       {
3857         __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC1);
3858         htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1;
3859 
3860         /* Input capture event */
3861         if ((htim->Instance->CCMR1 & TIM_CCMR1_CC1S) != 0x00U)
3862         {
3863 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
3864           htim->IC_CaptureCallback(htim);
3865 #else
3866           HAL_TIM_IC_CaptureCallback(htim);
3867 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
3868         }
3869         /* Output compare event */
3870         else
3871         {
3872 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
3873           htim->OC_DelayElapsedCallback(htim);
3874           htim->PWM_PulseFinishedCallback(htim);
3875 #else
3876           HAL_TIM_OC_DelayElapsedCallback(htim);
3877           HAL_TIM_PWM_PulseFinishedCallback(htim);
3878 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
3879         }
3880         htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;
3881       }
3882     }
3883   }
3884   /* Capture compare 2 event */
3885   if ((itflag & (TIM_FLAG_CC2)) == (TIM_FLAG_CC2))
3886   {
3887     if ((itsource & (TIM_IT_CC2)) == (TIM_IT_CC2))
3888     {
3889       __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC2);
3890       htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2;
3891       /* Input capture event */
3892       if ((htim->Instance->CCMR1 & TIM_CCMR1_CC2S) != 0x00U)
3893       {
3894 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
3895         htim->IC_CaptureCallback(htim);
3896 #else
3897         HAL_TIM_IC_CaptureCallback(htim);
3898 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
3899       }
3900       /* Output compare event */
3901       else
3902       {
3903 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
3904         htim->OC_DelayElapsedCallback(htim);
3905         htim->PWM_PulseFinishedCallback(htim);
3906 #else
3907         HAL_TIM_OC_DelayElapsedCallback(htim);
3908         HAL_TIM_PWM_PulseFinishedCallback(htim);
3909 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
3910       }
3911       htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;
3912     }
3913   }
3914   /* Capture compare 3 event */
3915   if ((itflag & (TIM_FLAG_CC3)) == (TIM_FLAG_CC3))
3916   {
3917     if ((itsource & (TIM_IT_CC3)) == (TIM_IT_CC3))
3918     {
3919       __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC3);
3920       htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3;
3921       /* Input capture event */
3922       if ((htim->Instance->CCMR2 & TIM_CCMR2_CC3S) != 0x00U)
3923       {
3924 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
3925         htim->IC_CaptureCallback(htim);
3926 #else
3927         HAL_TIM_IC_CaptureCallback(htim);
3928 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
3929       }
3930       /* Output compare event */
3931       else
3932       {
3933 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
3934         htim->OC_DelayElapsedCallback(htim);
3935         htim->PWM_PulseFinishedCallback(htim);
3936 #else
3937         HAL_TIM_OC_DelayElapsedCallback(htim);
3938         HAL_TIM_PWM_PulseFinishedCallback(htim);
3939 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
3940       }
3941       htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;
3942     }
3943   }
3944   /* Capture compare 4 event */
3945   if ((itflag & (TIM_FLAG_CC4)) == (TIM_FLAG_CC4))
3946   {
3947     if ((itsource & (TIM_IT_CC4)) == (TIM_IT_CC4))
3948     {
3949       __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC4);
3950       htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4;
3951       /* Input capture event */
3952       if ((htim->Instance->CCMR2 & TIM_CCMR2_CC4S) != 0x00U)
3953       {
3954 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
3955         htim->IC_CaptureCallback(htim);
3956 #else
3957         HAL_TIM_IC_CaptureCallback(htim);
3958 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
3959       }
3960       /* Output compare event */
3961       else
3962       {
3963 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
3964         htim->OC_DelayElapsedCallback(htim);
3965         htim->PWM_PulseFinishedCallback(htim);
3966 #else
3967         HAL_TIM_OC_DelayElapsedCallback(htim);
3968         HAL_TIM_PWM_PulseFinishedCallback(htim);
3969 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
3970       }
3971       htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;
3972     }
3973   }
3974   /* TIM Update event */
3975   if ((itflag & (TIM_FLAG_UPDATE)) == (TIM_FLAG_UPDATE))
3976   {
3977     if ((itsource & (TIM_IT_UPDATE)) == (TIM_IT_UPDATE))
3978     {
3979       __HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE);
3980 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
3981       htim->PeriodElapsedCallback(htim);
3982 #else
3983       HAL_TIM_PeriodElapsedCallback(htim);
3984 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
3985     }
3986   }
3987   /* TIM Break input event */
3988   if ((itflag & (TIM_FLAG_BREAK)) == (TIM_FLAG_BREAK))
3989   {
3990     if ((itsource & (TIM_IT_BREAK)) == (TIM_IT_BREAK))
3991     {
3992       __HAL_TIM_CLEAR_IT(htim, TIM_IT_BREAK);
3993 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
3994       htim->BreakCallback(htim);
3995 #else
3996       HAL_TIMEx_BreakCallback(htim);
3997 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
3998     }
3999   }
4000   /* TIM Break2 input event */
4001   if ((itflag & (TIM_FLAG_BREAK2)) == (TIM_FLAG_BREAK2))
4002   {
4003     if ((itsource & (TIM_IT_BREAK)) == (TIM_IT_BREAK))
4004     {
4005       __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_BREAK2);
4006 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
4007       htim->Break2Callback(htim);
4008 #else
4009       HAL_TIMEx_Break2Callback(htim);
4010 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
4011     }
4012   }
4013   /* TIM Trigger detection event */
4014   if ((itflag & (TIM_FLAG_TRIGGER)) == (TIM_FLAG_TRIGGER))
4015   {
4016     if ((itsource & (TIM_IT_TRIGGER)) == (TIM_IT_TRIGGER))
4017     {
4018       __HAL_TIM_CLEAR_IT(htim, TIM_IT_TRIGGER);
4019 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
4020       htim->TriggerCallback(htim);
4021 #else
4022       HAL_TIM_TriggerCallback(htim);
4023 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
4024     }
4025   }
4026   /* TIM commutation event */
4027   if ((itflag & (TIM_FLAG_COM)) == (TIM_FLAG_COM))
4028   {
4029     if ((itsource & (TIM_IT_COM)) == (TIM_IT_COM))
4030     {
4031       __HAL_TIM_CLEAR_IT(htim, TIM_FLAG_COM);
4032 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
4033       htim->CommutationCallback(htim);
4034 #else
4035       HAL_TIMEx_CommutCallback(htim);
4036 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
4037     }
4038   }
4039   /* TIM Encoder index event */
4040   if ((itflag & (TIM_FLAG_IDX)) == (TIM_FLAG_IDX))
4041   {
4042     if ((itsource & (TIM_IT_IDX)) == (TIM_IT_IDX))
4043     {
4044       __HAL_TIM_CLEAR_IT(htim, TIM_FLAG_IDX);
4045 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
4046       htim->EncoderIndexCallback(htim);
4047 #else
4048       HAL_TIMEx_EncoderIndexCallback(htim);
4049 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
4050     }
4051   }
4052   /* TIM Direction change event */
4053   if ((itflag & (TIM_FLAG_DIR)) == (TIM_FLAG_DIR))
4054   {
4055     if ((itsource & (TIM_IT_DIR)) == (TIM_IT_DIR))
4056     {
4057       __HAL_TIM_CLEAR_IT(htim, TIM_FLAG_DIR);
4058 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
4059       htim->DirectionChangeCallback(htim);
4060 #else
4061       HAL_TIMEx_DirectionChangeCallback(htim);
4062 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
4063     }
4064   }
4065   /* TIM Index error event */
4066   if ((itflag & (TIM_FLAG_IERR)) == (TIM_FLAG_IERR))
4067   {
4068     if ((itsource & (TIM_IT_IERR)) == (TIM_IT_IERR))
4069     {
4070       __HAL_TIM_CLEAR_IT(htim, TIM_FLAG_IERR);
4071 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
4072       htim->IndexErrorCallback(htim);
4073 #else
4074       HAL_TIMEx_IndexErrorCallback(htim);
4075 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
4076     }
4077   }
4078   /* TIM Transition error event */
4079   if ((itflag & (TIM_FLAG_TERR)) == (TIM_FLAG_TERR))
4080   {
4081     if ((itsource & (TIM_IT_TERR)) == (TIM_IT_TERR))
4082     {
4083       __HAL_TIM_CLEAR_IT(htim, TIM_FLAG_TERR);
4084 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
4085       htim->TransitionErrorCallback(htim);
4086 #else
4087       HAL_TIMEx_TransitionErrorCallback(htim);
4088 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
4089     }
4090   }
4091 }
4092 
4093 /**
4094   * @}
4095   */
4096 
4097 /** @defgroup TIM_Exported_Functions_Group8 TIM Peripheral Control functions
4098   *  @brief    TIM Peripheral Control functions
4099   *
4100 @verbatim
4101   ==============================================================================
4102                    ##### Peripheral Control functions #####
4103   ==============================================================================
4104  [..]
4105    This section provides functions allowing to:
4106       (+) Configure The Input Output channels for OC, PWM, IC or One Pulse mode.
4107       (+) Configure External Clock source.
4108       (+) Configure Complementary channels, break features and dead time.
4109       (+) Configure Master and the Slave synchronization.
4110       (+) Configure the DMA Burst Mode.
4111 
4112 @endverbatim
4113   * @{
4114   */
4115 
4116 /**
4117   * @brief  Initializes the TIM Output Compare Channels according to the specified
4118   *         parameters in the TIM_OC_InitTypeDef.
4119   * @param  htim TIM Output Compare handle
4120   * @param  sConfig TIM Output Compare configuration structure
4121   * @param  Channel TIM Channels to configure
4122   *          This parameter can be one of the following values:
4123   *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
4124   *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
4125   *            @arg TIM_CHANNEL_3: TIM Channel 3 selected
4126   *            @arg TIM_CHANNEL_4: TIM Channel 4 selected
4127   *            @arg TIM_CHANNEL_5: TIM Channel 5 selected
4128   *            @arg TIM_CHANNEL_6: TIM Channel 6 selected
4129   * @retval HAL status
4130   */
HAL_TIM_OC_ConfigChannel(TIM_HandleTypeDef * htim,const TIM_OC_InitTypeDef * sConfig,uint32_t Channel)4131 HAL_StatusTypeDef HAL_TIM_OC_ConfigChannel(TIM_HandleTypeDef *htim,
4132                                            const TIM_OC_InitTypeDef *sConfig,
4133                                            uint32_t Channel)
4134 {
4135   HAL_StatusTypeDef status = HAL_OK;
4136 
4137   /* Check the parameters */
4138   assert_param(IS_TIM_CHANNELS(Channel));
4139   assert_param(IS_TIM_OC_CHANNEL_MODE(sConfig->OCMode, Channel));
4140   assert_param(IS_TIM_OC_POLARITY(sConfig->OCPolarity));
4141 
4142   /* Process Locked */
4143   __HAL_LOCK(htim);
4144 
4145   switch (Channel)
4146   {
4147     case TIM_CHANNEL_1:
4148     {
4149       /* Check the parameters */
4150       assert_param(IS_TIM_CC1_INSTANCE(htim->Instance));
4151 
4152       /* Configure the TIM Channel 1 in Output Compare */
4153       TIM_OC1_SetConfig(htim->Instance, sConfig);
4154       break;
4155     }
4156 
4157     case TIM_CHANNEL_2:
4158     {
4159       /* Check the parameters */
4160       assert_param(IS_TIM_CC2_INSTANCE(htim->Instance));
4161 
4162       /* Configure the TIM Channel 2 in Output Compare */
4163       TIM_OC2_SetConfig(htim->Instance, sConfig);
4164       break;
4165     }
4166 
4167     case TIM_CHANNEL_3:
4168     {
4169       /* Check the parameters */
4170       assert_param(IS_TIM_CC3_INSTANCE(htim->Instance));
4171 
4172       /* Configure the TIM Channel 3 in Output Compare */
4173       TIM_OC3_SetConfig(htim->Instance, sConfig);
4174       break;
4175     }
4176 
4177     case TIM_CHANNEL_4:
4178     {
4179       /* Check the parameters */
4180       assert_param(IS_TIM_CC4_INSTANCE(htim->Instance));
4181 
4182       /* Configure the TIM Channel 4 in Output Compare */
4183       TIM_OC4_SetConfig(htim->Instance, sConfig);
4184       break;
4185     }
4186 
4187     case TIM_CHANNEL_5:
4188     {
4189       /* Check the parameters */
4190       assert_param(IS_TIM_CC5_INSTANCE(htim->Instance));
4191 
4192       /* Configure the TIM Channel 5 in Output Compare */
4193       TIM_OC5_SetConfig(htim->Instance, sConfig);
4194       break;
4195     }
4196 
4197     case TIM_CHANNEL_6:
4198     {
4199       /* Check the parameters */
4200       assert_param(IS_TIM_CC6_INSTANCE(htim->Instance));
4201 
4202       /* Configure the TIM Channel 6 in Output Compare */
4203       TIM_OC6_SetConfig(htim->Instance, sConfig);
4204       break;
4205     }
4206 
4207     default:
4208       status = HAL_ERROR;
4209       break;
4210   }
4211 
4212   __HAL_UNLOCK(htim);
4213 
4214   return status;
4215 }
4216 
4217 /**
4218   * @brief  Initializes the TIM Input Capture Channels according to the specified
4219   *         parameters in the TIM_IC_InitTypeDef.
4220   * @param  htim TIM IC handle
4221   * @param  sConfig TIM Input Capture configuration structure
4222   * @param  Channel TIM Channel to configure
4223   *          This parameter can be one of the following values:
4224   *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
4225   *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
4226   *            @arg TIM_CHANNEL_3: TIM Channel 3 selected
4227   *            @arg TIM_CHANNEL_4: TIM Channel 4 selected
4228   * @retval HAL status
4229   */
HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef * htim,const TIM_IC_InitTypeDef * sConfig,uint32_t Channel)4230 HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, const TIM_IC_InitTypeDef *sConfig, uint32_t Channel)
4231 {
4232   HAL_StatusTypeDef status = HAL_OK;
4233 
4234   /* Check the parameters */
4235   assert_param(IS_TIM_CC1_INSTANCE(htim->Instance));
4236   assert_param(IS_TIM_IC_POLARITY(sConfig->ICPolarity));
4237   assert_param(IS_TIM_IC_SELECTION(sConfig->ICSelection));
4238   assert_param(IS_TIM_IC_PRESCALER(sConfig->ICPrescaler));
4239   assert_param(IS_TIM_IC_FILTER(sConfig->ICFilter));
4240 
4241   /* Process Locked */
4242   __HAL_LOCK(htim);
4243 
4244   if (Channel == TIM_CHANNEL_1)
4245   {
4246     /* TI1 Configuration */
4247     TIM_TI1_SetConfig(htim->Instance,
4248                       sConfig->ICPolarity,
4249                       sConfig->ICSelection,
4250                       sConfig->ICFilter);
4251 
4252     /* Reset the IC1PSC Bits */
4253     htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC;
4254 
4255     /* Set the IC1PSC value */
4256     htim->Instance->CCMR1 |= sConfig->ICPrescaler;
4257   }
4258   else if (Channel == TIM_CHANNEL_2)
4259   {
4260     /* TI2 Configuration */
4261     assert_param(IS_TIM_CC2_INSTANCE(htim->Instance));
4262 
4263     TIM_TI2_SetConfig(htim->Instance,
4264                       sConfig->ICPolarity,
4265                       sConfig->ICSelection,
4266                       sConfig->ICFilter);
4267 
4268     /* Reset the IC2PSC Bits */
4269     htim->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC;
4270 
4271     /* Set the IC2PSC value */
4272     htim->Instance->CCMR1 |= (sConfig->ICPrescaler << 8U);
4273   }
4274   else if (Channel == TIM_CHANNEL_3)
4275   {
4276     /* TI3 Configuration */
4277     assert_param(IS_TIM_CC3_INSTANCE(htim->Instance));
4278 
4279     TIM_TI3_SetConfig(htim->Instance,
4280                       sConfig->ICPolarity,
4281                       sConfig->ICSelection,
4282                       sConfig->ICFilter);
4283 
4284     /* Reset the IC3PSC Bits */
4285     htim->Instance->CCMR2 &= ~TIM_CCMR2_IC3PSC;
4286 
4287     /* Set the IC3PSC value */
4288     htim->Instance->CCMR2 |= sConfig->ICPrescaler;
4289   }
4290   else if (Channel == TIM_CHANNEL_4)
4291   {
4292     /* TI4 Configuration */
4293     assert_param(IS_TIM_CC4_INSTANCE(htim->Instance));
4294 
4295     TIM_TI4_SetConfig(htim->Instance,
4296                       sConfig->ICPolarity,
4297                       sConfig->ICSelection,
4298                       sConfig->ICFilter);
4299 
4300     /* Reset the IC4PSC Bits */
4301     htim->Instance->CCMR2 &= ~TIM_CCMR2_IC4PSC;
4302 
4303     /* Set the IC4PSC value */
4304     htim->Instance->CCMR2 |= (sConfig->ICPrescaler << 8U);
4305   }
4306   else
4307   {
4308     status = HAL_ERROR;
4309   }
4310 
4311   __HAL_UNLOCK(htim);
4312 
4313   return status;
4314 }
4315 
4316 /**
4317   * @brief  Initializes the TIM PWM  channels according to the specified
4318   *         parameters in the TIM_OC_InitTypeDef.
4319   * @param  htim TIM PWM handle
4320   * @param  sConfig TIM PWM configuration structure
4321   * @param  Channel TIM Channels to be configured
4322   *          This parameter can be one of the following values:
4323   *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
4324   *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
4325   *            @arg TIM_CHANNEL_3: TIM Channel 3 selected
4326   *            @arg TIM_CHANNEL_4: TIM Channel 4 selected
4327   *            @arg TIM_CHANNEL_5: TIM Channel 5 selected
4328   *            @arg TIM_CHANNEL_6: TIM Channel 6 selected
4329   * @retval HAL status
4330   */
HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef * htim,const TIM_OC_InitTypeDef * sConfig,uint32_t Channel)4331 HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim,
4332                                             const TIM_OC_InitTypeDef *sConfig,
4333                                             uint32_t Channel)
4334 {
4335   HAL_StatusTypeDef status = HAL_OK;
4336 
4337   /* Check the parameters */
4338   assert_param(IS_TIM_CHANNELS(Channel));
4339   assert_param(IS_TIM_PWM_MODE(sConfig->OCMode));
4340   assert_param(IS_TIM_OC_POLARITY(sConfig->OCPolarity));
4341   assert_param(IS_TIM_FAST_STATE(sConfig->OCFastMode));
4342 
4343   /* Process Locked */
4344   __HAL_LOCK(htim);
4345 
4346   switch (Channel)
4347   {
4348     case TIM_CHANNEL_1:
4349     {
4350       /* Check the parameters */
4351       assert_param(IS_TIM_CC1_INSTANCE(htim->Instance));
4352 
4353       /* Configure the Channel 1 in PWM mode */
4354       TIM_OC1_SetConfig(htim->Instance, sConfig);
4355 
4356       /* Set the Preload enable bit for channel1 */
4357       htim->Instance->CCMR1 |= TIM_CCMR1_OC1PE;
4358 
4359       /* Configure the Output Fast mode */
4360       htim->Instance->CCMR1 &= ~TIM_CCMR1_OC1FE;
4361       htim->Instance->CCMR1 |= sConfig->OCFastMode;
4362       break;
4363     }
4364 
4365     case TIM_CHANNEL_2:
4366     {
4367       /* Check the parameters */
4368       assert_param(IS_TIM_CC2_INSTANCE(htim->Instance));
4369 
4370       /* Configure the Channel 2 in PWM mode */
4371       TIM_OC2_SetConfig(htim->Instance, sConfig);
4372 
4373       /* Set the Preload enable bit for channel2 */
4374       htim->Instance->CCMR1 |= TIM_CCMR1_OC2PE;
4375 
4376       /* Configure the Output Fast mode */
4377       htim->Instance->CCMR1 &= ~TIM_CCMR1_OC2FE;
4378       htim->Instance->CCMR1 |= sConfig->OCFastMode << 8U;
4379       break;
4380     }
4381 
4382     case TIM_CHANNEL_3:
4383     {
4384       /* Check the parameters */
4385       assert_param(IS_TIM_CC3_INSTANCE(htim->Instance));
4386 
4387       /* Configure the Channel 3 in PWM mode */
4388       TIM_OC3_SetConfig(htim->Instance, sConfig);
4389 
4390       /* Set the Preload enable bit for channel3 */
4391       htim->Instance->CCMR2 |= TIM_CCMR2_OC3PE;
4392 
4393       /* Configure the Output Fast mode */
4394       htim->Instance->CCMR2 &= ~TIM_CCMR2_OC3FE;
4395       htim->Instance->CCMR2 |= sConfig->OCFastMode;
4396       break;
4397     }
4398 
4399     case TIM_CHANNEL_4:
4400     {
4401       /* Check the parameters */
4402       assert_param(IS_TIM_CC4_INSTANCE(htim->Instance));
4403 
4404       /* Configure the Channel 4 in PWM mode */
4405       TIM_OC4_SetConfig(htim->Instance, sConfig);
4406 
4407       /* Set the Preload enable bit for channel4 */
4408       htim->Instance->CCMR2 |= TIM_CCMR2_OC4PE;
4409 
4410       /* Configure the Output Fast mode */
4411       htim->Instance->CCMR2 &= ~TIM_CCMR2_OC4FE;
4412       htim->Instance->CCMR2 |= sConfig->OCFastMode << 8U;
4413       break;
4414     }
4415 
4416     case TIM_CHANNEL_5:
4417     {
4418       /* Check the parameters */
4419       assert_param(IS_TIM_CC5_INSTANCE(htim->Instance));
4420 
4421       /* Configure the Channel 5 in PWM mode */
4422       TIM_OC5_SetConfig(htim->Instance, sConfig);
4423 
4424       /* Set the Preload enable bit for channel5*/
4425       htim->Instance->CCMR3 |= TIM_CCMR3_OC5PE;
4426 
4427       /* Configure the Output Fast mode */
4428       htim->Instance->CCMR3 &= ~TIM_CCMR3_OC5FE;
4429       htim->Instance->CCMR3 |= sConfig->OCFastMode;
4430       break;
4431     }
4432 
4433     case TIM_CHANNEL_6:
4434     {
4435       /* Check the parameters */
4436       assert_param(IS_TIM_CC6_INSTANCE(htim->Instance));
4437 
4438       /* Configure the Channel 6 in PWM mode */
4439       TIM_OC6_SetConfig(htim->Instance, sConfig);
4440 
4441       /* Set the Preload enable bit for channel6 */
4442       htim->Instance->CCMR3 |= TIM_CCMR3_OC6PE;
4443 
4444       /* Configure the Output Fast mode */
4445       htim->Instance->CCMR3 &= ~TIM_CCMR3_OC6FE;
4446       htim->Instance->CCMR3 |= sConfig->OCFastMode << 8U;
4447       break;
4448     }
4449 
4450     default:
4451       status = HAL_ERROR;
4452       break;
4453   }
4454 
4455   __HAL_UNLOCK(htim);
4456 
4457   return status;
4458 }
4459 
4460 /**
4461   * @brief  Initializes the TIM One Pulse Channels according to the specified
4462   *         parameters in the TIM_OnePulse_InitTypeDef.
4463   * @param  htim TIM One Pulse handle
4464   * @param  sConfig TIM One Pulse configuration structure
4465   * @param  OutputChannel TIM output channel to configure
4466   *          This parameter can be one of the following values:
4467   *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
4468   *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
4469   * @param  InputChannel TIM input Channel to configure
4470   *          This parameter can be one of the following values:
4471   *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
4472   *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
4473   * @note  To output a waveform with a minimum delay user can enable the fast
4474   *        mode by calling the @ref __HAL_TIM_ENABLE_OCxFAST macro. Then CCx
4475   *        output is forced in response to the edge detection on TIx input,
4476   *        without taking in account the comparison.
4477   * @retval HAL status
4478   */
HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef * htim,TIM_OnePulse_InitTypeDef * sConfig,uint32_t OutputChannel,uint32_t InputChannel)4479 HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim,  TIM_OnePulse_InitTypeDef *sConfig,
4480                                                  uint32_t OutputChannel,  uint32_t InputChannel)
4481 {
4482   HAL_StatusTypeDef status = HAL_OK;
4483   TIM_OC_InitTypeDef temp1;
4484 
4485   /* Check the parameters */
4486   assert_param(IS_TIM_OPM_CHANNELS(OutputChannel));
4487   assert_param(IS_TIM_OPM_CHANNELS(InputChannel));
4488 
4489   if (OutputChannel != InputChannel)
4490   {
4491     /* Process Locked */
4492     __HAL_LOCK(htim);
4493 
4494     htim->State = HAL_TIM_STATE_BUSY;
4495 
4496     /* Extract the Output compare configuration from sConfig structure */
4497     temp1.OCMode = sConfig->OCMode;
4498     temp1.Pulse = sConfig->Pulse;
4499     temp1.OCPolarity = sConfig->OCPolarity;
4500     temp1.OCNPolarity = sConfig->OCNPolarity;
4501     temp1.OCIdleState = sConfig->OCIdleState;
4502     temp1.OCNIdleState = sConfig->OCNIdleState;
4503 
4504     switch (OutputChannel)
4505     {
4506       case TIM_CHANNEL_1:
4507       {
4508         assert_param(IS_TIM_CC1_INSTANCE(htim->Instance));
4509 
4510         TIM_OC1_SetConfig(htim->Instance, &temp1);
4511         break;
4512       }
4513 
4514       case TIM_CHANNEL_2:
4515       {
4516         assert_param(IS_TIM_CC2_INSTANCE(htim->Instance));
4517 
4518         TIM_OC2_SetConfig(htim->Instance, &temp1);
4519         break;
4520       }
4521 
4522       default:
4523         status = HAL_ERROR;
4524         break;
4525     }
4526 
4527     if (status == HAL_OK)
4528     {
4529       switch (InputChannel)
4530       {
4531         case TIM_CHANNEL_1:
4532         {
4533           assert_param(IS_TIM_CC1_INSTANCE(htim->Instance));
4534 
4535           TIM_TI1_SetConfig(htim->Instance, sConfig->ICPolarity,
4536                             sConfig->ICSelection, sConfig->ICFilter);
4537 
4538           /* Reset the IC1PSC Bits */
4539           htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC;
4540 
4541           /* Select the Trigger source */
4542           htim->Instance->SMCR &= ~TIM_SMCR_TS;
4543           htim->Instance->SMCR |= TIM_TS_TI1FP1;
4544 
4545           /* Select the Slave Mode */
4546           htim->Instance->SMCR &= ~TIM_SMCR_SMS;
4547           htim->Instance->SMCR |= TIM_SLAVEMODE_TRIGGER;
4548           break;
4549         }
4550 
4551         case TIM_CHANNEL_2:
4552         {
4553           assert_param(IS_TIM_CC2_INSTANCE(htim->Instance));
4554 
4555           TIM_TI2_SetConfig(htim->Instance, sConfig->ICPolarity,
4556                             sConfig->ICSelection, sConfig->ICFilter);
4557 
4558           /* Reset the IC2PSC Bits */
4559           htim->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC;
4560 
4561           /* Select the Trigger source */
4562           htim->Instance->SMCR &= ~TIM_SMCR_TS;
4563           htim->Instance->SMCR |= TIM_TS_TI2FP2;
4564 
4565           /* Select the Slave Mode */
4566           htim->Instance->SMCR &= ~TIM_SMCR_SMS;
4567           htim->Instance->SMCR |= TIM_SLAVEMODE_TRIGGER;
4568           break;
4569         }
4570 
4571         default:
4572           status = HAL_ERROR;
4573           break;
4574       }
4575     }
4576 
4577     htim->State = HAL_TIM_STATE_READY;
4578 
4579     __HAL_UNLOCK(htim);
4580 
4581     return status;
4582   }
4583   else
4584   {
4585     return HAL_ERROR;
4586   }
4587 }
4588 
4589 /**
4590   * @brief  Configure the DMA Burst to transfer Data from the memory to the TIM peripheral
4591   * @param  htim TIM handle
4592   * @param  BurstBaseAddress TIM Base address from where the DMA  will start the Data write
4593   *         This parameter can be one of the following values:
4594   *            @arg TIM_DMABASE_CR1
4595   *            @arg TIM_DMABASE_CR2
4596   *            @arg TIM_DMABASE_SMCR
4597   *            @arg TIM_DMABASE_DIER
4598   *            @arg TIM_DMABASE_SR
4599   *            @arg TIM_DMABASE_EGR
4600   *            @arg TIM_DMABASE_CCMR1
4601   *            @arg TIM_DMABASE_CCMR2
4602   *            @arg TIM_DMABASE_CCER
4603   *            @arg TIM_DMABASE_CNT
4604   *            @arg TIM_DMABASE_PSC
4605   *            @arg TIM_DMABASE_ARR
4606   *            @arg TIM_DMABASE_RCR
4607   *            @arg TIM_DMABASE_CCR1
4608   *            @arg TIM_DMABASE_CCR2
4609   *            @arg TIM_DMABASE_CCR3
4610   *            @arg TIM_DMABASE_CCR4
4611   *            @arg TIM_DMABASE_BDTR
4612   *            @arg TIM_DMABASE_CCMR3
4613   *            @arg TIM_DMABASE_CCR5
4614   *            @arg TIM_DMABASE_CCR6
4615   *            @arg TIM_DMABASE_DTR2
4616   *            @arg TIM_DMABASE_ECR
4617   *            @arg TIM_DMABASE_TISEL
4618   *            @arg TIM_DMABASE_AF1
4619   *            @arg TIM_DMABASE_AF2
4620   * @param  BurstRequestSrc TIM DMA Request sources
4621   *         This parameter can be one of the following values:
4622   *            @arg TIM_DMA_UPDATE: TIM update Interrupt source
4623   *            @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source
4624   *            @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source
4625   *            @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source
4626   *            @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source
4627   *            @arg TIM_DMA_COM: TIM Commutation DMA source
4628   *            @arg TIM_DMA_TRIGGER: TIM Trigger DMA source
4629   * @param  BurstBuffer The Buffer address.
4630   * @param  BurstLength DMA Burst length. This parameter can be one value
4631   *         between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_26TRANSFER.
4632   * @note   This function should be used only when BurstLength is equal to DMA data transfer length.
4633   * @retval HAL status
4634   */
HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef * htim,uint32_t BurstBaseAddress,uint32_t BurstRequestSrc,const uint32_t * BurstBuffer,uint32_t BurstLength)4635 HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress,
4636                                               uint32_t BurstRequestSrc, const uint32_t *BurstBuffer, uint32_t  BurstLength)
4637 {
4638   HAL_StatusTypeDef status = HAL_OK;
4639   uint32_t BlockDataLength = 0;
4640   uint32_t data_width;
4641   const DMA_HandleTypeDef *hdma = NULL;
4642 
4643   assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc));
4644 
4645   switch (BurstRequestSrc)
4646   {
4647     case TIM_DMA_UPDATE:
4648     {
4649       hdma = htim->hdma[TIM_DMA_ID_UPDATE];
4650       break;
4651     }
4652     case TIM_DMA_CC1:
4653     {
4654       hdma = htim->hdma[TIM_DMA_ID_CC1];
4655       break;
4656     }
4657     case TIM_DMA_CC2:
4658     {
4659       hdma = htim->hdma[TIM_DMA_ID_CC2];
4660       break;
4661     }
4662     case TIM_DMA_CC3:
4663     {
4664       hdma = htim->hdma[TIM_DMA_ID_CC3];
4665       break;
4666     }
4667     case TIM_DMA_CC4:
4668     {
4669       hdma = htim->hdma[TIM_DMA_ID_CC4];
4670       break;
4671     }
4672     case TIM_DMA_COM:
4673     {
4674       hdma = htim->hdma[TIM_DMA_ID_COMMUTATION];
4675       break;
4676     }
4677     case TIM_DMA_TRIGGER:
4678     {
4679       hdma = htim->hdma[TIM_DMA_ID_TRIGGER];
4680       break;
4681     }
4682     default:
4683       status = HAL_ERROR;
4684       break;
4685   }
4686 
4687   if (hdma != NULL)
4688   {
4689 
4690     if (((hdma->Mode & DMA_LINKEDLIST) == DMA_LINKEDLIST) && (hdma->LinkedListQueue != 0U)
4691         && (hdma->LinkedListQueue->Head != 0U))
4692     {
4693       data_width = hdma->LinkedListQueue->Head->LinkRegisters[0] & DMA_CTR1_SDW_LOG2;
4694     }
4695     else
4696     {
4697       data_width = hdma->Init.SrcDataWidth;
4698     }
4699 
4700     switch (data_width)
4701     {
4702       case DMA_SRC_DATAWIDTH_BYTE:
4703       {
4704         BlockDataLength = (BurstLength >> TIM_DCR_DBL_Pos) + 1UL;
4705         break;
4706       }
4707       case DMA_SRC_DATAWIDTH_HALFWORD:
4708       {
4709         BlockDataLength = ((BurstLength >> TIM_DCR_DBL_Pos) + 1UL) * 2UL;
4710         break;
4711       }
4712       case DMA_SRC_DATAWIDTH_WORD:
4713       {
4714         BlockDataLength = ((BurstLength >> TIM_DCR_DBL_Pos) + 1UL) * 4UL;
4715         break;
4716       }
4717       default:
4718         status = HAL_ERROR;
4719         break;
4720     }
4721   }
4722 
4723   if (status == HAL_OK)
4724   {
4725     status = HAL_TIM_DMABurst_MultiWriteStart(htim, BurstBaseAddress, BurstRequestSrc, BurstBuffer, BurstLength,
4726                                               BlockDataLength);
4727   }
4728 
4729 
4730   return status;
4731 }
4732 
4733 /**
4734   * @brief  Configure the DMA Burst to transfer multiple Data from the memory to the TIM peripheral
4735   * @param  htim TIM handle
4736   * @param  BurstBaseAddress TIM Base address from where the DMA will start the Data write
4737   *         This parameter can be one of the following values:
4738   *            @arg TIM_DMABASE_CR1
4739   *            @arg TIM_DMABASE_CR2
4740   *            @arg TIM_DMABASE_SMCR
4741   *            @arg TIM_DMABASE_DIER
4742   *            @arg TIM_DMABASE_SR
4743   *            @arg TIM_DMABASE_EGR
4744   *            @arg TIM_DMABASE_CCMR1
4745   *            @arg TIM_DMABASE_CCMR2
4746   *            @arg TIM_DMABASE_CCER
4747   *            @arg TIM_DMABASE_CNT
4748   *            @arg TIM_DMABASE_PSC
4749   *            @arg TIM_DMABASE_ARR
4750   *            @arg TIM_DMABASE_RCR
4751   *            @arg TIM_DMABASE_CCR1
4752   *            @arg TIM_DMABASE_CCR2
4753   *            @arg TIM_DMABASE_CCR3
4754   *            @arg TIM_DMABASE_CCR4
4755   *            @arg TIM_DMABASE_BDTR
4756   *            @arg TIM_DMABASE_CCMR3
4757   *            @arg TIM_DMABASE_CCR5
4758   *            @arg TIM_DMABASE_CCR6
4759   *            @arg TIM_DMABASE_DTR2
4760   *            @arg TIM_DMABASE_ECR
4761   *            @arg TIM_DMABASE_TISEL
4762   *            @arg TIM_DMABASE_AF1
4763   *            @arg TIM_DMABASE_AF2
4764   * @param  BurstRequestSrc TIM DMA Request sources
4765   *         This parameter can be one of the following values:
4766   *            @arg TIM_DMA_UPDATE: TIM update Interrupt source
4767   *            @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source
4768   *            @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source
4769   *            @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source
4770   *            @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source
4771   *            @arg TIM_DMA_COM: TIM Commutation DMA source
4772   *            @arg TIM_DMA_TRIGGER: TIM Trigger DMA source
4773   * @param  BurstBuffer The Buffer address.
4774   * @param  BurstLength DMA Burst length. This parameter can be one value
4775   *         between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_26TRANSFER.
4776   * @param  DataLength Data length. This parameter can be one value
4777   *         between 1 and 0xFFFF.
4778   * @retval HAL status
4779   */
HAL_TIM_DMABurst_MultiWriteStart(TIM_HandleTypeDef * htim,uint32_t BurstBaseAddress,uint32_t BurstRequestSrc,const uint32_t * BurstBuffer,uint32_t BurstLength,uint32_t DataLength)4780 HAL_StatusTypeDef HAL_TIM_DMABurst_MultiWriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress,
4781                                                    uint32_t BurstRequestSrc, const uint32_t *BurstBuffer,
4782                                                    uint32_t  BurstLength,  uint32_t  DataLength)
4783 {
4784   HAL_StatusTypeDef status = HAL_OK;
4785   uint32_t tmpDBSS = 0;
4786 
4787   /* Check the parameters */
4788   assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance));
4789   assert_param(IS_TIM_DMA_BASE(BurstBaseAddress));
4790   assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc));
4791   assert_param(IS_TIM_DMA_LENGTH(BurstLength));
4792   assert_param(IS_TIM_DMA_DATA_LENGTH(DataLength));
4793 
4794   if (htim->DMABurstState == HAL_DMA_BURST_STATE_BUSY)
4795   {
4796     return HAL_BUSY;
4797   }
4798   else if (htim->DMABurstState == HAL_DMA_BURST_STATE_READY)
4799   {
4800     if ((BurstBuffer == NULL) && (BurstLength > 0U))
4801     {
4802       return HAL_ERROR;
4803     }
4804     else
4805     {
4806       htim->DMABurstState = HAL_DMA_BURST_STATE_BUSY;
4807     }
4808   }
4809   else
4810   {
4811     /* nothing to do */
4812   }
4813 
4814   switch (BurstRequestSrc)
4815   {
4816     case TIM_DMA_UPDATE:
4817     {
4818       /* Set the DMA Period elapsed callbacks */
4819       htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt;
4820       htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt;
4821 
4822       /* Set the DMA error callback */
4823       htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ;
4824 
4825       /* Enable the DMA channel */
4826       if (TIM_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)BurstBuffer,
4827                            (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK)
4828       {
4829         /* Return error status */
4830         return HAL_ERROR;
4831       }
4832       /* Configure the DMA Burst Source Selection */
4833       tmpDBSS = TIM_DCR_DBSS_0;
4834       break;
4835     }
4836     case TIM_DMA_CC1:
4837     {
4838       /* Set the DMA compare callbacks */
4839       htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt;
4840       htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;
4841 
4842       /* Set the DMA error callback */
4843       htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ;
4844 
4845       /* Enable the DMA channel */
4846       if (TIM_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)BurstBuffer,
4847                            (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK)
4848       {
4849         /* Return error status */
4850         return HAL_ERROR;
4851       }
4852       /* Configure the DMA Burst Source Selection */
4853       tmpDBSS = TIM_DCR_DBSS_1;
4854       break;
4855     }
4856     case TIM_DMA_CC2:
4857     {
4858       /* Set the DMA compare callbacks */
4859       htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt;
4860       htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;
4861 
4862       /* Set the DMA error callback */
4863       htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ;
4864 
4865       /* Enable the DMA channel */
4866       if (TIM_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)BurstBuffer,
4867                            (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK)
4868       {
4869         /* Return error status */
4870         return HAL_ERROR;
4871       }
4872       /* Configure the DMA Burst Source Selection */
4873       tmpDBSS = (TIM_DCR_DBSS_1 | TIM_DCR_DBSS_0);
4874       break;
4875     }
4876     case TIM_DMA_CC3:
4877     {
4878       /* Set the DMA compare callbacks */
4879       htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt;
4880       htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;
4881 
4882       /* Set the DMA error callback */
4883       htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ;
4884 
4885       /* Enable the DMA channel */
4886       if (TIM_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)BurstBuffer,
4887                            (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK)
4888       {
4889         /* Return error status */
4890         return HAL_ERROR;
4891       }
4892       /* Configure the DMA Burst Source Selection */
4893       tmpDBSS = TIM_DCR_DBSS_2;
4894       break;
4895     }
4896     case TIM_DMA_CC4:
4897     {
4898       /* Set the DMA compare callbacks */
4899       htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt;
4900       htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;
4901 
4902       /* Set the DMA error callback */
4903       htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ;
4904 
4905       /* Enable the DMA channel */
4906       if (TIM_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)BurstBuffer,
4907                            (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK)
4908       {
4909         /* Return error status */
4910         return HAL_ERROR;
4911       }
4912       /* Configure the DMA Burst Source Selection */
4913       tmpDBSS = (TIM_DCR_DBSS_2 | TIM_DCR_DBSS_0);
4914       break;
4915     }
4916     case TIM_DMA_COM:
4917     {
4918       /* Set the DMA commutation callbacks */
4919       htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback =  TIMEx_DMACommutationCplt;
4920       htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback =  TIMEx_DMACommutationHalfCplt;
4921 
4922       /* Set the DMA error callback */
4923       htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError ;
4924 
4925       /* Enable the DMA channel */
4926       if (TIM_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)BurstBuffer,
4927                            (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK)
4928       {
4929         /* Return error status */
4930         return HAL_ERROR;
4931       }
4932       /* Configure the DMA Burst Source Selection */
4933       tmpDBSS = (TIM_DCR_DBSS_2 | TIM_DCR_DBSS_1);
4934       break;
4935     }
4936     case TIM_DMA_TRIGGER:
4937     {
4938       /* Set the DMA trigger callbacks */
4939       htim->hdma[TIM_DMA_ID_TRIGGER]->XferCpltCallback = TIM_DMATriggerCplt;
4940       htim->hdma[TIM_DMA_ID_TRIGGER]->XferHalfCpltCallback = TIM_DMATriggerHalfCplt;
4941 
4942       /* Set the DMA error callback */
4943       htim->hdma[TIM_DMA_ID_TRIGGER]->XferErrorCallback = TIM_DMAError ;
4944 
4945       /* Enable the DMA channel */
4946       if (TIM_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)BurstBuffer,
4947                            (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK)
4948       {
4949         /* Return error status */
4950         return HAL_ERROR;
4951       }
4952       /* Configure the DMA Burst Source Selection */
4953       tmpDBSS = (TIM_DCR_DBSS_2 | TIM_DCR_DBSS_1 | TIM_DCR_DBSS_0);
4954       break;
4955     }
4956     default:
4957       status = HAL_ERROR;
4958       break;
4959   }
4960 
4961   if (status == HAL_OK)
4962   {
4963     /* Configure the DMA Burst Mode */
4964     htim->Instance->DCR = (BurstBaseAddress | BurstLength | tmpDBSS);
4965     /* Enable the TIM DMA Request */
4966     __HAL_TIM_ENABLE_DMA(htim, BurstRequestSrc);
4967   }
4968 
4969   /* Return function status */
4970   return status;
4971 }
4972 
4973 /**
4974   * @brief  Stops the TIM DMA Burst mode
4975   * @param  htim TIM handle
4976   * @param  BurstRequestSrc TIM DMA Request sources to disable
4977   * @retval HAL status
4978   */
HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef * htim,uint32_t BurstRequestSrc)4979 HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc)
4980 {
4981   HAL_StatusTypeDef status = HAL_OK;
4982 
4983   /* Check the parameters */
4984   assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc));
4985 
4986   /* Abort the DMA transfer (at least disable the DMA channel) */
4987   switch (BurstRequestSrc)
4988   {
4989     case TIM_DMA_UPDATE:
4990     {
4991       (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]);
4992       break;
4993     }
4994     case TIM_DMA_CC1:
4995     {
4996       (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]);
4997       break;
4998     }
4999     case TIM_DMA_CC2:
5000     {
5001       (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]);
5002       break;
5003     }
5004     case TIM_DMA_CC3:
5005     {
5006       (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]);
5007       break;
5008     }
5009     case TIM_DMA_CC4:
5010     {
5011       (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]);
5012       break;
5013     }
5014     case TIM_DMA_COM:
5015     {
5016       (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_COMMUTATION]);
5017       break;
5018     }
5019     case TIM_DMA_TRIGGER:
5020     {
5021       (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_TRIGGER]);
5022       break;
5023     }
5024     default:
5025       status = HAL_ERROR;
5026       break;
5027   }
5028 
5029   if (status == HAL_OK)
5030   {
5031     /* Disable the TIM Update DMA request */
5032     __HAL_TIM_DISABLE_DMA(htim, BurstRequestSrc);
5033 
5034     /* Change the DMA burst operation state */
5035     htim->DMABurstState = HAL_DMA_BURST_STATE_READY;
5036   }
5037 
5038   /* Return function status */
5039   return status;
5040 }
5041 
5042 /**
5043   * @brief  Configure the DMA Burst to transfer Data from the TIM peripheral to the memory
5044   * @param  htim TIM handle
5045   * @param  BurstBaseAddress TIM Base address from where the DMA  will start the Data read
5046   *         This parameter can be one of the following values:
5047   *            @arg TIM_DMABASE_CR1
5048   *            @arg TIM_DMABASE_CR2
5049   *            @arg TIM_DMABASE_SMCR
5050   *            @arg TIM_DMABASE_DIER
5051   *            @arg TIM_DMABASE_SR
5052   *            @arg TIM_DMABASE_EGR
5053   *            @arg TIM_DMABASE_CCMR1
5054   *            @arg TIM_DMABASE_CCMR2
5055   *            @arg TIM_DMABASE_CCER
5056   *            @arg TIM_DMABASE_CNT
5057   *            @arg TIM_DMABASE_PSC
5058   *            @arg TIM_DMABASE_ARR
5059   *            @arg TIM_DMABASE_RCR
5060   *            @arg TIM_DMABASE_CCR1
5061   *            @arg TIM_DMABASE_CCR2
5062   *            @arg TIM_DMABASE_CCR3
5063   *            @arg TIM_DMABASE_CCR4
5064   *            @arg TIM_DMABASE_BDTR
5065   *            @arg TIM_DMABASE_CCMR3
5066   *            @arg TIM_DMABASE_CCR5
5067   *            @arg TIM_DMABASE_CCR6
5068   *            @arg TIM_DMABASE_DTR2
5069   *            @arg TIM_DMABASE_ECR
5070   *            @arg TIM_DMABASE_TISEL
5071   *            @arg TIM_DMABASE_AF1
5072   *            @arg TIM_DMABASE_AF2
5073   * @param  BurstRequestSrc TIM DMA Request sources
5074   *         This parameter can be one of the following values:
5075   *            @arg TIM_DMA_UPDATE: TIM update Interrupt source
5076   *            @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source
5077   *            @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source
5078   *            @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source
5079   *            @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source
5080   *            @arg TIM_DMA_COM: TIM Commutation DMA source
5081   *            @arg TIM_DMA_TRIGGER: TIM Trigger DMA source
5082   * @param  BurstBuffer The Buffer address.
5083   * @param  BurstLength DMA Burst length. This parameter can be one value
5084   *         between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_26TRANSFER.
5085   * @note   This function should be used only when BurstLength is equal to DMA data transfer length.
5086   * @retval HAL status
5087   */
HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef * htim,uint32_t BurstBaseAddress,uint32_t BurstRequestSrc,uint32_t * BurstBuffer,uint32_t BurstLength)5088 HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress,
5089                                              uint32_t BurstRequestSrc, uint32_t  *BurstBuffer, uint32_t  BurstLength)
5090 {
5091   HAL_StatusTypeDef status = HAL_OK;
5092   uint32_t BlockDataLength = 0;
5093   uint32_t data_width;
5094   const DMA_HandleTypeDef *hdma = NULL;
5095 
5096   assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc));
5097 
5098   switch (BurstRequestSrc)
5099   {
5100     case TIM_DMA_UPDATE:
5101     {
5102       hdma = htim->hdma[TIM_DMA_ID_UPDATE];
5103       break;
5104     }
5105     case TIM_DMA_CC1:
5106     {
5107       hdma = htim->hdma[TIM_DMA_ID_CC1];
5108       break;
5109     }
5110     case TIM_DMA_CC2:
5111     {
5112       hdma = htim->hdma[TIM_DMA_ID_CC2];
5113       break;
5114     }
5115     case TIM_DMA_CC3:
5116     {
5117       hdma = htim->hdma[TIM_DMA_ID_CC3];
5118       break;
5119     }
5120     case TIM_DMA_CC4:
5121     {
5122       hdma = htim->hdma[TIM_DMA_ID_CC4];
5123       break;
5124     }
5125     case TIM_DMA_COM:
5126     {
5127       hdma = htim->hdma[TIM_DMA_ID_COMMUTATION];
5128       break;
5129     }
5130     case TIM_DMA_TRIGGER:
5131     {
5132       hdma = htim->hdma[TIM_DMA_ID_TRIGGER];
5133       break;
5134     }
5135     default:
5136       status = HAL_ERROR;
5137       break;
5138   }
5139 
5140   if (hdma != NULL)
5141   {
5142 
5143     if (((hdma->Mode & DMA_LINKEDLIST) == DMA_LINKEDLIST) && (hdma->LinkedListQueue != 0U)
5144         && (hdma->LinkedListQueue->Head != 0U))
5145     {
5146       data_width = hdma->LinkedListQueue->Head->LinkRegisters[0] & DMA_CTR1_SDW_LOG2;
5147     }
5148     else
5149     {
5150       data_width = hdma->Init.SrcDataWidth;
5151     }
5152 
5153     switch (data_width)
5154 
5155     {
5156       case DMA_SRC_DATAWIDTH_BYTE:
5157       {
5158         BlockDataLength = ((BurstLength) >> TIM_DCR_DBL_Pos) + 1UL;
5159         break;
5160       }
5161       case DMA_SRC_DATAWIDTH_HALFWORD:
5162       {
5163         BlockDataLength = ((BurstLength >> TIM_DCR_DBL_Pos) + 1UL) * 2UL;
5164         break;
5165       }
5166       case DMA_SRC_DATAWIDTH_WORD:
5167       {
5168         BlockDataLength = ((BurstLength >> TIM_DCR_DBL_Pos) + 1UL) * 4UL;
5169         break;
5170       }
5171       default:
5172         status = HAL_ERROR;
5173         break;
5174     }
5175   }
5176 
5177   if (status == HAL_OK)
5178   {
5179     status = HAL_TIM_DMABurst_MultiReadStart(htim, BurstBaseAddress, BurstRequestSrc, BurstBuffer, BurstLength,
5180                                              BlockDataLength);
5181   }
5182 
5183   return status;
5184 }
5185 
5186 /**
5187   * @brief  Configure the DMA Burst to transfer Data from the TIM peripheral to the memory
5188   * @param  htim TIM handle
5189   * @param  BurstBaseAddress TIM Base address from where the DMA  will start the Data read
5190   *         This parameter can be one of the following values:
5191   *            @arg TIM_DMABASE_CR1
5192   *            @arg TIM_DMABASE_CR2
5193   *            @arg TIM_DMABASE_SMCR
5194   *            @arg TIM_DMABASE_DIER
5195   *            @arg TIM_DMABASE_SR
5196   *            @arg TIM_DMABASE_EGR
5197   *            @arg TIM_DMABASE_CCMR1
5198   *            @arg TIM_DMABASE_CCMR2
5199   *            @arg TIM_DMABASE_CCER
5200   *            @arg TIM_DMABASE_CNT
5201   *            @arg TIM_DMABASE_PSC
5202   *            @arg TIM_DMABASE_ARR
5203   *            @arg TIM_DMABASE_RCR
5204   *            @arg TIM_DMABASE_CCR1
5205   *            @arg TIM_DMABASE_CCR2
5206   *            @arg TIM_DMABASE_CCR3
5207   *            @arg TIM_DMABASE_CCR4
5208   *            @arg TIM_DMABASE_BDTR
5209   *            @arg TIM_DMABASE_CCMR3
5210   *            @arg TIM_DMABASE_CCR5
5211   *            @arg TIM_DMABASE_CCR6
5212   *            @arg TIM_DMABASE_DTR2
5213   *            @arg TIM_DMABASE_ECR
5214   *            @arg TIM_DMABASE_TISEL
5215   *            @arg TIM_DMABASE_AF1
5216   *            @arg TIM_DMABASE_AF2
5217   * @param  BurstRequestSrc TIM DMA Request sources
5218   *         This parameter can be one of the following values:
5219   *            @arg TIM_DMA_UPDATE: TIM update Interrupt source
5220   *            @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source
5221   *            @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source
5222   *            @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source
5223   *            @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source
5224   *            @arg TIM_DMA_COM: TIM Commutation DMA source
5225   *            @arg TIM_DMA_TRIGGER: TIM Trigger DMA source
5226   * @param  BurstBuffer The Buffer address.
5227   * @param  BurstLength DMA Burst length. This parameter can be one value
5228   *         between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_26TRANSFER.
5229   * @param  DataLength Data length. This parameter can be one value
5230   *         between 1 and 0xFFFF.
5231   * @retval HAL status
5232   */
HAL_TIM_DMABurst_MultiReadStart(TIM_HandleTypeDef * htim,uint32_t BurstBaseAddress,uint32_t BurstRequestSrc,uint32_t * BurstBuffer,uint32_t BurstLength,uint32_t DataLength)5233 HAL_StatusTypeDef HAL_TIM_DMABurst_MultiReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress,
5234                                                   uint32_t BurstRequestSrc, uint32_t  *BurstBuffer,
5235                                                   uint32_t  BurstLength, uint32_t  DataLength)
5236 {
5237   HAL_StatusTypeDef status = HAL_OK;
5238   uint32_t tmpDBSS = 0;
5239 
5240   /* Check the parameters */
5241   assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance));
5242   assert_param(IS_TIM_DMA_BASE(BurstBaseAddress));
5243   assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc));
5244   assert_param(IS_TIM_DMA_LENGTH(BurstLength));
5245   assert_param(IS_TIM_DMA_DATA_LENGTH(DataLength));
5246 
5247   if (htim->DMABurstState == HAL_DMA_BURST_STATE_BUSY)
5248   {
5249     return HAL_BUSY;
5250   }
5251   else if (htim->DMABurstState == HAL_DMA_BURST_STATE_READY)
5252   {
5253     if ((BurstBuffer == NULL) && (BurstLength > 0U))
5254     {
5255       return HAL_ERROR;
5256     }
5257     else
5258     {
5259       htim->DMABurstState = HAL_DMA_BURST_STATE_BUSY;
5260     }
5261   }
5262   else
5263   {
5264     /* nothing to do */
5265   }
5266   switch (BurstRequestSrc)
5267   {
5268     case TIM_DMA_UPDATE:
5269     {
5270       /* Set the DMA Period elapsed callbacks */
5271       htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt;
5272       htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt;
5273 
5274       /* Set the DMA error callback */
5275       htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ;
5276 
5277       /* Enable the DMA channel */
5278       if (TIM_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer,
5279                            DataLength) != HAL_OK)
5280       {
5281         /* Return error status */
5282         return HAL_ERROR;
5283       }
5284       /* Configure the DMA Burst Source Selection */
5285       tmpDBSS = TIM_DCR_DBSS_0;
5286       break;
5287     }
5288     case TIM_DMA_CC1:
5289     {
5290       /* Set the DMA capture callbacks */
5291       htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt;
5292       htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt;
5293 
5294       /* Set the DMA error callback */
5295       htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ;
5296 
5297       /* Enable the DMA channel */
5298       if (TIM_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer,
5299                            DataLength) != HAL_OK)
5300       {
5301         /* Return error status */
5302         return HAL_ERROR;
5303       }
5304       /* Configure the DMA Burst Source Selection */
5305       tmpDBSS =  TIM_DCR_DBSS_1;
5306       break;
5307     }
5308     case TIM_DMA_CC2:
5309     {
5310       /* Set the DMA capture callbacks */
5311       htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt;
5312       htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt;
5313 
5314       /* Set the DMA error callback */
5315       htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ;
5316 
5317       /* Enable the DMA channel */
5318       if (TIM_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer,
5319                            DataLength) != HAL_OK)
5320       {
5321         /* Return error status */
5322         return HAL_ERROR;
5323       }
5324       /* Configure the DMA Burst Source Selection */
5325       tmpDBSS = (TIM_DCR_DBSS_1 | TIM_DCR_DBSS_0);
5326       break;
5327     }
5328     case TIM_DMA_CC3:
5329     {
5330       /* Set the DMA capture callbacks */
5331       htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMACaptureCplt;
5332       htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt;
5333 
5334       /* Set the DMA error callback */
5335       htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ;
5336 
5337       /* Enable the DMA channel */
5338       if (TIM_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer,
5339                            DataLength) != HAL_OK)
5340       {
5341         /* Return error status */
5342         return HAL_ERROR;
5343       }
5344       /* Configure the DMA Burst Source Selection */
5345       tmpDBSS = TIM_DCR_DBSS_2;
5346       break;
5347     }
5348     case TIM_DMA_CC4:
5349     {
5350       /* Set the DMA capture callbacks */
5351       htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMACaptureCplt;
5352       htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt;
5353 
5354       /* Set the DMA error callback */
5355       htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ;
5356 
5357       /* Enable the DMA channel */
5358       if (TIM_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer,
5359                            DataLength) != HAL_OK)
5360       {
5361         /* Return error status */
5362         return HAL_ERROR;
5363       }
5364       /* Configure the DMA Burst Source Selection */
5365       tmpDBSS = (TIM_DCR_DBSS_2 | TIM_DCR_DBSS_0);
5366       break;
5367     }
5368     case TIM_DMA_COM:
5369     {
5370       /* Set the DMA commutation callbacks */
5371       htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback =  TIMEx_DMACommutationCplt;
5372       htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback =  TIMEx_DMACommutationHalfCplt;
5373 
5374       /* Set the DMA error callback */
5375       htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError ;
5376 
5377       /* Enable the DMA channel */
5378       if (TIM_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer,
5379                            DataLength) != HAL_OK)
5380       {
5381         /* Return error status */
5382         return HAL_ERROR;
5383       }
5384       /* Configure the DMA Burst Source Selection */
5385       tmpDBSS = (TIM_DCR_DBSS_2 | TIM_DCR_DBSS_1);
5386       break;
5387     }
5388     case TIM_DMA_TRIGGER:
5389     {
5390       /* Set the DMA trigger callbacks */
5391       htim->hdma[TIM_DMA_ID_TRIGGER]->XferCpltCallback = TIM_DMATriggerCplt;
5392       htim->hdma[TIM_DMA_ID_TRIGGER]->XferHalfCpltCallback = TIM_DMATriggerHalfCplt;
5393 
5394       /* Set the DMA error callback */
5395       htim->hdma[TIM_DMA_ID_TRIGGER]->XferErrorCallback = TIM_DMAError ;
5396 
5397       /* Enable the DMA channel */
5398       if (TIM_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer,
5399                            DataLength) != HAL_OK)
5400       {
5401         /* Return error status */
5402         return HAL_ERROR;
5403       }
5404       /* Configure the DMA Burst Source Selection */
5405       tmpDBSS = (TIM_DCR_DBSS_2 | TIM_DCR_DBSS_1 | TIM_DCR_DBSS_0);
5406       break;
5407     }
5408     default:
5409       status = HAL_ERROR;
5410       break;
5411   }
5412 
5413   if (status == HAL_OK)
5414   {
5415     /* Configure the DMA Burst Mode */
5416     htim->Instance->DCR = (BurstBaseAddress | BurstLength | tmpDBSS);
5417 
5418     /* Enable the TIM DMA Request */
5419     __HAL_TIM_ENABLE_DMA(htim, BurstRequestSrc);
5420   }
5421 
5422   /* Return function status */
5423   return status;
5424 }
5425 
5426 /**
5427   * @brief  Stop the DMA burst reading
5428   * @param  htim TIM handle
5429   * @param  BurstRequestSrc TIM DMA Request sources to disable.
5430   * @retval HAL status
5431   */
HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef * htim,uint32_t BurstRequestSrc)5432 HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc)
5433 {
5434   HAL_StatusTypeDef status = HAL_OK;
5435 
5436   /* Check the parameters */
5437   assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc));
5438 
5439   /* Abort the DMA transfer (at least disable the DMA channel) */
5440   switch (BurstRequestSrc)
5441   {
5442     case TIM_DMA_UPDATE:
5443     {
5444       (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]);
5445       break;
5446     }
5447     case TIM_DMA_CC1:
5448     {
5449       (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]);
5450       break;
5451     }
5452     case TIM_DMA_CC2:
5453     {
5454       (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]);
5455       break;
5456     }
5457     case TIM_DMA_CC3:
5458     {
5459       (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]);
5460       break;
5461     }
5462     case TIM_DMA_CC4:
5463     {
5464       (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]);
5465       break;
5466     }
5467     case TIM_DMA_COM:
5468     {
5469       (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_COMMUTATION]);
5470       break;
5471     }
5472     case TIM_DMA_TRIGGER:
5473     {
5474       (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_TRIGGER]);
5475       break;
5476     }
5477     default:
5478       status = HAL_ERROR;
5479       break;
5480   }
5481 
5482   if (status == HAL_OK)
5483   {
5484     /* Disable the TIM Update DMA request */
5485     __HAL_TIM_DISABLE_DMA(htim, BurstRequestSrc);
5486 
5487     /* Change the DMA burst operation state */
5488     htim->DMABurstState = HAL_DMA_BURST_STATE_READY;
5489   }
5490 
5491   /* Return function status */
5492   return status;
5493 }
5494 
5495 /**
5496   * @brief  Generate a software event
5497   * @param  htim TIM handle
5498   * @param  EventSource specifies the event source.
5499   *          This parameter can be one of the following values:
5500   *            @arg TIM_EVENTSOURCE_UPDATE: Timer update Event source
5501   *            @arg TIM_EVENTSOURCE_CC1: Timer Capture Compare 1 Event source
5502   *            @arg TIM_EVENTSOURCE_CC2: Timer Capture Compare 2 Event source
5503   *            @arg TIM_EVENTSOURCE_CC3: Timer Capture Compare 3 Event source
5504   *            @arg TIM_EVENTSOURCE_CC4: Timer Capture Compare 4 Event source
5505   *            @arg TIM_EVENTSOURCE_COM: Timer COM event source
5506   *            @arg TIM_EVENTSOURCE_TRIGGER: Timer Trigger Event source
5507   *            @arg TIM_EVENTSOURCE_BREAK: Timer Break event source
5508   *            @arg TIM_EVENTSOURCE_BREAK2: Timer Break2 event source
5509   * @note   Basic timers can only generate an update event.
5510   * @note   TIM_EVENTSOURCE_COM is relevant only with advanced timer instances.
5511   * @note   TIM_EVENTSOURCE_BREAK and TIM_EVENTSOURCE_BREAK2 are relevant
5512   *         only for timer instances supporting break input(s).
5513   * @retval HAL status
5514   */
5515 
HAL_TIM_GenerateEvent(TIM_HandleTypeDef * htim,uint32_t EventSource)5516 HAL_StatusTypeDef HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource)
5517 {
5518   /* Check the parameters */
5519   assert_param(IS_TIM_INSTANCE(htim->Instance));
5520   assert_param(IS_TIM_EVENT_SOURCE(EventSource));
5521 
5522   /* Process Locked */
5523   __HAL_LOCK(htim);
5524 
5525   /* Change the TIM state */
5526   htim->State = HAL_TIM_STATE_BUSY;
5527 
5528   /* Set the event sources */
5529   htim->Instance->EGR = EventSource;
5530 
5531   /* Change the TIM state */
5532   htim->State = HAL_TIM_STATE_READY;
5533 
5534   __HAL_UNLOCK(htim);
5535 
5536   /* Return function status */
5537   return HAL_OK;
5538 }
5539 
5540 /**
5541   * @brief  Configures the OCRef clear feature
5542   * @param  htim TIM handle
5543   * @param  sClearInputConfig pointer to a TIM_ClearInputConfigTypeDef structure that
5544   *         contains the OCREF clear feature and parameters for the TIM peripheral.
5545   * @param  Channel specifies the TIM Channel
5546   *          This parameter can be one of the following values:
5547   *            @arg TIM_CHANNEL_1: TIM Channel 1
5548   *            @arg TIM_CHANNEL_2: TIM Channel 2
5549   *            @arg TIM_CHANNEL_3: TIM Channel 3
5550   *            @arg TIM_CHANNEL_4: TIM Channel 4
5551   *            @arg TIM_CHANNEL_5: TIM Channel 5
5552   *            @arg TIM_CHANNEL_6: TIM Channel 6
5553   * @retval HAL status
5554   */
HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef * htim,const TIM_ClearInputConfigTypeDef * sClearInputConfig,uint32_t Channel)5555 HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim,
5556                                            const TIM_ClearInputConfigTypeDef *sClearInputConfig,
5557                                            uint32_t Channel)
5558 {
5559   HAL_StatusTypeDef status = HAL_OK;
5560 
5561   /* Check the parameters */
5562   assert_param(IS_TIM_OCXREF_CLEAR_INSTANCE(htim->Instance));
5563   assert_param(IS_TIM_CLEARINPUT_SOURCE(sClearInputConfig->ClearInputSource));
5564 
5565   /* Process Locked */
5566   __HAL_LOCK(htim);
5567 
5568   htim->State = HAL_TIM_STATE_BUSY;
5569 
5570   switch (sClearInputConfig->ClearInputSource)
5571   {
5572     case TIM_CLEARINPUTSOURCE_NONE:
5573     {
5574       /* Clear the OCREF clear selection bit and the the ETR Bits */
5575       CLEAR_BIT(htim->Instance->SMCR, (TIM_SMCR_OCCS | TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP));
5576       break;
5577     }
5578     case TIM_CLEARINPUTSOURCE_OCREFCLR:
5579     {
5580       /* Clear the OCREF clear selection bit */
5581       CLEAR_BIT(htim->Instance->SMCR, TIM_SMCR_OCCS);
5582       break;
5583     }
5584 
5585     case TIM_CLEARINPUTSOURCE_ETR:
5586     {
5587       /* Check the parameters */
5588       assert_param(IS_TIM_CLEARINPUT_POLARITY(sClearInputConfig->ClearInputPolarity));
5589       assert_param(IS_TIM_CLEARINPUT_PRESCALER(sClearInputConfig->ClearInputPrescaler));
5590       assert_param(IS_TIM_CLEARINPUT_FILTER(sClearInputConfig->ClearInputFilter));
5591 
5592       /* When OCRef clear feature is used with ETR source, ETR prescaler must be off */
5593       if (sClearInputConfig->ClearInputPrescaler != TIM_CLEARINPUTPRESCALER_DIV1)
5594       {
5595         htim->State = HAL_TIM_STATE_READY;
5596         __HAL_UNLOCK(htim);
5597         return HAL_ERROR;
5598       }
5599 
5600       TIM_ETR_SetConfig(htim->Instance,
5601                         sClearInputConfig->ClearInputPrescaler,
5602                         sClearInputConfig->ClearInputPolarity,
5603                         sClearInputConfig->ClearInputFilter);
5604 
5605       /* Set the OCREF clear selection bit */
5606       SET_BIT(htim->Instance->SMCR, TIM_SMCR_OCCS);
5607 
5608       /* Clear TIMx_AF2_OCRSEL (reset value) */
5609       CLEAR_BIT(htim->Instance->AF2, TIMx_AF2_OCRSEL);
5610       break;
5611     }
5612 
5613     default:
5614       status = HAL_ERROR;
5615       break;
5616   }
5617 
5618   if (status == HAL_OK)
5619   {
5620     switch (Channel)
5621     {
5622       case TIM_CHANNEL_1:
5623       {
5624         if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE)
5625         {
5626           /* Enable the OCREF clear feature for Channel 1 */
5627           SET_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC1CE);
5628         }
5629         else
5630         {
5631           /* Disable the OCREF clear feature for Channel 1 */
5632           CLEAR_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC1CE);
5633         }
5634         break;
5635       }
5636       case TIM_CHANNEL_2:
5637       {
5638         if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE)
5639         {
5640           /* Enable the OCREF clear feature for Channel 2 */
5641           SET_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC2CE);
5642         }
5643         else
5644         {
5645           /* Disable the OCREF clear feature for Channel 2 */
5646           CLEAR_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC2CE);
5647         }
5648         break;
5649       }
5650       case TIM_CHANNEL_3:
5651       {
5652         if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE)
5653         {
5654           /* Enable the OCREF clear feature for Channel 3 */
5655           SET_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC3CE);
5656         }
5657         else
5658         {
5659           /* Disable the OCREF clear feature for Channel 3 */
5660           CLEAR_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC3CE);
5661         }
5662         break;
5663       }
5664       case TIM_CHANNEL_4:
5665       {
5666         if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE)
5667         {
5668           /* Enable the OCREF clear feature for Channel 4 */
5669           SET_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC4CE);
5670         }
5671         else
5672         {
5673           /* Disable the OCREF clear feature for Channel 4 */
5674           CLEAR_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC4CE);
5675         }
5676         break;
5677       }
5678       case TIM_CHANNEL_5:
5679       {
5680         if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE)
5681         {
5682           /* Enable the OCREF clear feature for Channel 5 */
5683           SET_BIT(htim->Instance->CCMR3, TIM_CCMR3_OC5CE);
5684         }
5685         else
5686         {
5687           /* Disable the OCREF clear feature for Channel 5 */
5688           CLEAR_BIT(htim->Instance->CCMR3, TIM_CCMR3_OC5CE);
5689         }
5690         break;
5691       }
5692       case TIM_CHANNEL_6:
5693       {
5694         if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE)
5695         {
5696           /* Enable the OCREF clear feature for Channel 6 */
5697           SET_BIT(htim->Instance->CCMR3, TIM_CCMR3_OC6CE);
5698         }
5699         else
5700         {
5701           /* Disable the OCREF clear feature for Channel 6 */
5702           CLEAR_BIT(htim->Instance->CCMR3, TIM_CCMR3_OC6CE);
5703         }
5704         break;
5705       }
5706       default:
5707         break;
5708     }
5709   }
5710 
5711   htim->State = HAL_TIM_STATE_READY;
5712 
5713   __HAL_UNLOCK(htim);
5714 
5715   return status;
5716 }
5717 
5718 /**
5719   * @brief   Configures the clock source to be used
5720   * @param  htim TIM handle
5721   * @param  sClockSourceConfig pointer to a TIM_ClockConfigTypeDef structure that
5722   *         contains the clock source information for the TIM peripheral.
5723   * @retval HAL status
5724   */
HAL_TIM_ConfigClockSource(TIM_HandleTypeDef * htim,const TIM_ClockConfigTypeDef * sClockSourceConfig)5725 HAL_StatusTypeDef HAL_TIM_ConfigClockSource(TIM_HandleTypeDef *htim, const TIM_ClockConfigTypeDef *sClockSourceConfig)
5726 {
5727   HAL_StatusTypeDef status = HAL_OK;
5728   uint32_t tmpsmcr;
5729 
5730   /* Process Locked */
5731   __HAL_LOCK(htim);
5732 
5733   htim->State = HAL_TIM_STATE_BUSY;
5734 
5735   /* Check the parameters */
5736   assert_param(IS_TIM_CLOCKSOURCE(sClockSourceConfig->ClockSource));
5737 
5738   /* Reset the SMS, TS, ECE, ETPS and ETRF bits */
5739   tmpsmcr = htim->Instance->SMCR;
5740   tmpsmcr &= ~(TIM_SMCR_SMS | TIM_SMCR_TS);
5741   tmpsmcr &= ~(TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP);
5742   htim->Instance->SMCR = tmpsmcr;
5743 
5744   switch (sClockSourceConfig->ClockSource)
5745   {
5746     case TIM_CLOCKSOURCE_INTERNAL:
5747     {
5748       assert_param(IS_TIM_INSTANCE(htim->Instance));
5749       break;
5750     }
5751 
5752     case TIM_CLOCKSOURCE_ETRMODE1:
5753     {
5754       /* Check whether or not the timer instance supports external trigger input mode 1 (ETRF)*/
5755       assert_param(IS_TIM_CLOCKSOURCE_ETRMODE1_INSTANCE(htim->Instance));
5756 
5757       /* Check ETR input conditioning related parameters */
5758       assert_param(IS_TIM_CLOCKPRESCALER(sClockSourceConfig->ClockPrescaler));
5759       assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity));
5760       assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter));
5761 
5762       /* Configure the ETR Clock source */
5763       TIM_ETR_SetConfig(htim->Instance,
5764                         sClockSourceConfig->ClockPrescaler,
5765                         sClockSourceConfig->ClockPolarity,
5766                         sClockSourceConfig->ClockFilter);
5767 
5768       /* Select the External clock mode1 and the ETRF trigger */
5769       tmpsmcr = htim->Instance->SMCR;
5770       tmpsmcr |= (TIM_SLAVEMODE_EXTERNAL1 | TIM_CLOCKSOURCE_ETRMODE1);
5771       /* Write to TIMx SMCR */
5772       htim->Instance->SMCR = tmpsmcr;
5773       break;
5774     }
5775 
5776     case TIM_CLOCKSOURCE_ETRMODE2:
5777     {
5778       /* Check whether or not the timer instance supports external trigger input mode 2 (ETRF)*/
5779       assert_param(IS_TIM_CLOCKSOURCE_ETRMODE2_INSTANCE(htim->Instance));
5780 
5781       /* Check ETR input conditioning related parameters */
5782       assert_param(IS_TIM_CLOCKPRESCALER(sClockSourceConfig->ClockPrescaler));
5783       assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity));
5784       assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter));
5785 
5786       /* Configure the ETR Clock source */
5787       TIM_ETR_SetConfig(htim->Instance,
5788                         sClockSourceConfig->ClockPrescaler,
5789                         sClockSourceConfig->ClockPolarity,
5790                         sClockSourceConfig->ClockFilter);
5791       /* Enable the External clock mode2 */
5792       htim->Instance->SMCR |= TIM_SMCR_ECE;
5793       break;
5794     }
5795 
5796     case TIM_CLOCKSOURCE_TI1:
5797     {
5798       /* Check whether or not the timer instance supports external clock mode 1 */
5799       assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance));
5800 
5801       /* Check TI1 input conditioning related parameters */
5802       assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity));
5803       assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter));
5804 
5805       TIM_TI1_ConfigInputStage(htim->Instance,
5806                                sClockSourceConfig->ClockPolarity,
5807                                sClockSourceConfig->ClockFilter);
5808       TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI1);
5809       break;
5810     }
5811 
5812     case TIM_CLOCKSOURCE_TI2:
5813     {
5814       /* Check whether or not the timer instance supports external clock mode 1 (ETRF)*/
5815       assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance));
5816 
5817       /* Check TI2 input conditioning related parameters */
5818       assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity));
5819       assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter));
5820 
5821       TIM_TI2_ConfigInputStage(htim->Instance,
5822                                sClockSourceConfig->ClockPolarity,
5823                                sClockSourceConfig->ClockFilter);
5824       TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI2);
5825       break;
5826     }
5827 
5828     case TIM_CLOCKSOURCE_TI1ED:
5829     {
5830       /* Check whether or not the timer instance supports external clock mode 1 */
5831       assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance));
5832 
5833       /* Check TI1 input conditioning related parameters */
5834       assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity));
5835       assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter));
5836 
5837       TIM_TI1_ConfigInputStage(htim->Instance,
5838                                sClockSourceConfig->ClockPolarity,
5839                                sClockSourceConfig->ClockFilter);
5840       TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI1ED);
5841       break;
5842     }
5843 
5844     case TIM_CLOCKSOURCE_ITR0:
5845     case TIM_CLOCKSOURCE_ITR1:
5846     case TIM_CLOCKSOURCE_ITR2:
5847     case TIM_CLOCKSOURCE_ITR3:
5848     case TIM_CLOCKSOURCE_ITR4:
5849     case TIM_CLOCKSOURCE_ITR5:
5850     case TIM_CLOCKSOURCE_ITR6:
5851     case TIM_CLOCKSOURCE_ITR7:
5852     case TIM_CLOCKSOURCE_ITR8:
5853     case TIM_CLOCKSOURCE_ITR9:
5854     case TIM_CLOCKSOURCE_ITR10:
5855     case TIM_CLOCKSOURCE_ITR11:
5856     case TIM_CLOCKSOURCE_ITR12:
5857     {
5858       /* Check whether or not the timer instance supports internal trigger input */
5859       assert_param(IS_TIM_CLOCKSOURCE_INSTANCE((htim->Instance), sClockSourceConfig->ClockSource));
5860 
5861       TIM_ITRx_SetConfig(htim->Instance, sClockSourceConfig->ClockSource);
5862       break;
5863     }
5864 
5865     default:
5866       status = HAL_ERROR;
5867       break;
5868   }
5869   htim->State = HAL_TIM_STATE_READY;
5870 
5871   __HAL_UNLOCK(htim);
5872 
5873   return status;
5874 }
5875 
5876 /**
5877   * @brief  Selects the signal connected to the TI1 input: direct from CH1_input
5878   *         or a XOR combination between CH1_input, CH2_input & CH3_input
5879   * @param  htim TIM handle.
5880   * @param  TI1_Selection Indicate whether or not channel 1 is connected to the
5881   *         output of a XOR gate.
5882   *          This parameter can be one of the following values:
5883   *            @arg TIM_TI1SELECTION_CH1: The TIMx_CH1 pin is connected to TI1 input
5884   *            @arg TIM_TI1SELECTION_XORCOMBINATION: The TIMx_CH1, CH2 and CH3
5885   *            pins are connected to the TI1 input (XOR combination)
5886   * @retval HAL status
5887   */
HAL_TIM_ConfigTI1Input(TIM_HandleTypeDef * htim,uint32_t TI1_Selection)5888 HAL_StatusTypeDef HAL_TIM_ConfigTI1Input(TIM_HandleTypeDef *htim, uint32_t TI1_Selection)
5889 {
5890   uint32_t tmpcr2;
5891 
5892   /* Check the parameters */
5893   assert_param(IS_TIM_XOR_INSTANCE(htim->Instance));
5894   assert_param(IS_TIM_TI1SELECTION(TI1_Selection));
5895 
5896   /* Get the TIMx CR2 register value */
5897   tmpcr2 = htim->Instance->CR2;
5898 
5899   /* Reset the TI1 selection */
5900   tmpcr2 &= ~TIM_CR2_TI1S;
5901 
5902   /* Set the TI1 selection */
5903   tmpcr2 |= TI1_Selection;
5904 
5905   /* Write to TIMxCR2 */
5906   htim->Instance->CR2 = tmpcr2;
5907 
5908   return HAL_OK;
5909 }
5910 
5911 /**
5912   * @brief  Configures the TIM in Slave mode
5913   * @param  htim TIM handle.
5914   * @param  sSlaveConfig pointer to a TIM_SlaveConfigTypeDef structure that
5915   *         contains the selected trigger (internal trigger input, filtered
5916   *         timer input or external trigger input) and the Slave mode
5917   *         (Disable, Reset, Gated, Trigger, External clock mode 1, Reset + Trigger, Gated + Reset).
5918   * @retval HAL status
5919   */
HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef * htim,const TIM_SlaveConfigTypeDef * sSlaveConfig)5920 HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, const TIM_SlaveConfigTypeDef *sSlaveConfig)
5921 {
5922   /* Check the parameters */
5923   assert_param(IS_TIM_SLAVE_INSTANCE(htim->Instance));
5924   assert_param(IS_TIM_SLAVE_MODE(sSlaveConfig->SlaveMode));
5925   assert_param(IS_TIM_TRIGGER_INSTANCE(htim->Instance, sSlaveConfig->InputTrigger));
5926 
5927   __HAL_LOCK(htim);
5928 
5929   htim->State = HAL_TIM_STATE_BUSY;
5930 
5931   if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK)
5932   {
5933     htim->State = HAL_TIM_STATE_READY;
5934     __HAL_UNLOCK(htim);
5935     return HAL_ERROR;
5936   }
5937 
5938   /* Disable Trigger Interrupt */
5939   __HAL_TIM_DISABLE_IT(htim, TIM_IT_TRIGGER);
5940 
5941   /* Disable Trigger DMA request */
5942   __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_TRIGGER);
5943 
5944   htim->State = HAL_TIM_STATE_READY;
5945 
5946   __HAL_UNLOCK(htim);
5947 
5948   return HAL_OK;
5949 }
5950 
5951 /**
5952   * @brief  Configures the TIM in Slave mode in interrupt mode
5953   * @param  htim TIM handle.
5954   * @param  sSlaveConfig pointer to a TIM_SlaveConfigTypeDef structure that
5955   *         contains the selected trigger (internal trigger input, filtered
5956   *         timer input or external trigger input) and the Slave mode
5957   *         (Disable, Reset, Gated, Trigger, External clock mode 1, Reset + Trigger, Gated + Reset).
5958   * @retval HAL status
5959   */
HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef * htim,const TIM_SlaveConfigTypeDef * sSlaveConfig)5960 HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim,
5961                                                 const TIM_SlaveConfigTypeDef *sSlaveConfig)
5962 {
5963   /* Check the parameters */
5964   assert_param(IS_TIM_SLAVE_INSTANCE(htim->Instance));
5965   assert_param(IS_TIM_SLAVE_MODE(sSlaveConfig->SlaveMode));
5966   assert_param(IS_TIM_TRIGGER_INSTANCE(htim->Instance, sSlaveConfig->InputTrigger));
5967 
5968   __HAL_LOCK(htim);
5969 
5970   htim->State = HAL_TIM_STATE_BUSY;
5971 
5972   if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK)
5973   {
5974     htim->State = HAL_TIM_STATE_READY;
5975     __HAL_UNLOCK(htim);
5976     return HAL_ERROR;
5977   }
5978 
5979   /* Enable Trigger Interrupt */
5980   __HAL_TIM_ENABLE_IT(htim, TIM_IT_TRIGGER);
5981 
5982   /* Disable Trigger DMA request */
5983   __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_TRIGGER);
5984 
5985   htim->State = HAL_TIM_STATE_READY;
5986 
5987   __HAL_UNLOCK(htim);
5988 
5989   return HAL_OK;
5990 }
5991 
5992 /**
5993   * @brief  Read the captured value from Capture Compare unit
5994   * @param  htim TIM handle.
5995   * @param  Channel TIM Channels to be enabled
5996   *          This parameter can be one of the following values:
5997   *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
5998   *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
5999   *            @arg TIM_CHANNEL_3: TIM Channel 3 selected
6000   *            @arg TIM_CHANNEL_4: TIM Channel 4 selected
6001   * @retval Captured value
6002   */
HAL_TIM_ReadCapturedValue(const TIM_HandleTypeDef * htim,uint32_t Channel)6003 uint32_t HAL_TIM_ReadCapturedValue(const TIM_HandleTypeDef *htim, uint32_t Channel)
6004 {
6005   uint32_t tmpreg = 0U;
6006 
6007   switch (Channel)
6008   {
6009     case TIM_CHANNEL_1:
6010     {
6011       /* Check the parameters */
6012       assert_param(IS_TIM_CC1_INSTANCE(htim->Instance));
6013 
6014       /* Return the capture 1 value */
6015       tmpreg =  htim->Instance->CCR1;
6016 
6017       break;
6018     }
6019     case TIM_CHANNEL_2:
6020     {
6021       /* Check the parameters */
6022       assert_param(IS_TIM_CC2_INSTANCE(htim->Instance));
6023 
6024       /* Return the capture 2 value */
6025       tmpreg =   htim->Instance->CCR2;
6026 
6027       break;
6028     }
6029 
6030     case TIM_CHANNEL_3:
6031     {
6032       /* Check the parameters */
6033       assert_param(IS_TIM_CC3_INSTANCE(htim->Instance));
6034 
6035       /* Return the capture 3 value */
6036       tmpreg =   htim->Instance->CCR3;
6037 
6038       break;
6039     }
6040 
6041     case TIM_CHANNEL_4:
6042     {
6043       /* Check the parameters */
6044       assert_param(IS_TIM_CC4_INSTANCE(htim->Instance));
6045 
6046       /* Return the capture 4 value */
6047       tmpreg =   htim->Instance->CCR4;
6048 
6049       break;
6050     }
6051 
6052     default:
6053       break;
6054   }
6055 
6056   return tmpreg;
6057 }
6058 
6059 /**
6060   * @brief  Start the DMA data transfer.
6061   * @param  hdma DMA handle
6062   * @param  src      : The source memory Buffer address.
6063   * @param  dst      : The destination memory Buffer address.
6064   * @param  length   : The size of a source block transfer in byte.
6065   * @retval HAL status
6066   */
TIM_DMA_Start_IT(DMA_HandleTypeDef * hdma,uint32_t src,uint32_t dst,uint32_t length)6067 HAL_StatusTypeDef TIM_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t src, uint32_t dst,
6068                                    uint32_t length)
6069 {
6070   HAL_StatusTypeDef status ;
6071 
6072   /* Enable the DMA channel */
6073   if ((hdma->Mode & DMA_LINKEDLIST) == DMA_LINKEDLIST)
6074   {
6075     if ((hdma->LinkedListQueue != 0U) && (hdma->LinkedListQueue->Head != 0U))
6076     {
6077       /* Enable the DMA channel */
6078       hdma->LinkedListQueue->Head->LinkRegisters[NODE_CBR1_DEFAULT_OFFSET] = length;
6079       hdma->LinkedListQueue->Head->LinkRegisters[NODE_CSAR_DEFAULT_OFFSET] = src;
6080       hdma->LinkedListQueue->Head->LinkRegisters[NODE_CDAR_DEFAULT_OFFSET] = dst;
6081 
6082       status = HAL_DMAEx_List_Start_IT(hdma);
6083     }
6084     else
6085     {
6086       status = HAL_ERROR;
6087     }
6088   }
6089   else
6090   {
6091     status = HAL_DMA_Start_IT(hdma, src, dst, length);
6092   }
6093 
6094   return status;
6095 }
6096 
6097 /**
6098   * @}
6099   */
6100 
6101 /** @defgroup TIM_Exported_Functions_Group9 TIM Callbacks functions
6102   *  @brief    TIM Callbacks functions
6103   *
6104 @verbatim
6105   ==============================================================================
6106                         ##### TIM Callbacks functions #####
6107   ==============================================================================
6108  [..]
6109    This section provides TIM callback functions:
6110    (+) TIM Period elapsed callback
6111    (+) TIM Output Compare callback
6112    (+) TIM Input capture callback
6113    (+) TIM Trigger callback
6114    (+) TIM Error callback
6115    (+) TIM Index callback
6116    (+) TIM Direction change callback
6117    (+) TIM Index error callback
6118    (+) TIM Transition error callback
6119 
6120 @endverbatim
6121   * @{
6122   */
6123 
6124 /**
6125   * @brief  Period elapsed callback in non-blocking mode
6126   * @param  htim TIM handle
6127   * @retval None
6128   */
HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef * htim)6129 __weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
6130 {
6131   /* Prevent unused argument(s) compilation warning */
6132   UNUSED(htim);
6133 
6134   /* NOTE : This function should not be modified, when the callback is needed,
6135             the HAL_TIM_PeriodElapsedCallback could be implemented in the user file
6136    */
6137 }
6138 
6139 /**
6140   * @brief  Period elapsed half complete callback in non-blocking mode
6141   * @param  htim TIM handle
6142   * @retval None
6143   */
HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef * htim)6144 __weak void HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef *htim)
6145 {
6146   /* Prevent unused argument(s) compilation warning */
6147   UNUSED(htim);
6148 
6149   /* NOTE : This function should not be modified, when the callback is needed,
6150             the HAL_TIM_PeriodElapsedHalfCpltCallback could be implemented in the user file
6151    */
6152 }
6153 
6154 /**
6155   * @brief  Output Compare callback in non-blocking mode
6156   * @param  htim TIM OC handle
6157   * @retval None
6158   */
HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef * htim)6159 __weak void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
6160 {
6161   /* Prevent unused argument(s) compilation warning */
6162   UNUSED(htim);
6163 
6164   /* NOTE : This function should not be modified, when the callback is needed,
6165             the HAL_TIM_OC_DelayElapsedCallback could be implemented in the user file
6166    */
6167 }
6168 
6169 /**
6170   * @brief  Input Capture callback in non-blocking mode
6171   * @param  htim TIM IC handle
6172   * @retval None
6173   */
HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef * htim)6174 __weak void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
6175 {
6176   /* Prevent unused argument(s) compilation warning */
6177   UNUSED(htim);
6178 
6179   /* NOTE : This function should not be modified, when the callback is needed,
6180             the HAL_TIM_IC_CaptureCallback could be implemented in the user file
6181    */
6182 }
6183 
6184 /**
6185   * @brief  Input Capture half complete callback in non-blocking mode
6186   * @param  htim TIM IC handle
6187   * @retval None
6188   */
HAL_TIM_IC_CaptureHalfCpltCallback(TIM_HandleTypeDef * htim)6189 __weak void HAL_TIM_IC_CaptureHalfCpltCallback(TIM_HandleTypeDef *htim)
6190 {
6191   /* Prevent unused argument(s) compilation warning */
6192   UNUSED(htim);
6193 
6194   /* NOTE : This function should not be modified, when the callback is needed,
6195             the HAL_TIM_IC_CaptureHalfCpltCallback could be implemented in the user file
6196    */
6197 }
6198 
6199 /**
6200   * @brief  PWM Pulse finished callback in non-blocking mode
6201   * @param  htim TIM handle
6202   * @retval None
6203   */
HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef * htim)6204 __weak void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
6205 {
6206   /* Prevent unused argument(s) compilation warning */
6207   UNUSED(htim);
6208 
6209   /* NOTE : This function should not be modified, when the callback is needed,
6210             the HAL_TIM_PWM_PulseFinishedCallback could be implemented in the user file
6211    */
6212 }
6213 
6214 /**
6215   * @brief  PWM Pulse finished half complete callback in non-blocking mode
6216   * @param  htim TIM handle
6217   * @retval None
6218   */
HAL_TIM_PWM_PulseFinishedHalfCpltCallback(TIM_HandleTypeDef * htim)6219 __weak void HAL_TIM_PWM_PulseFinishedHalfCpltCallback(TIM_HandleTypeDef *htim)
6220 {
6221   /* Prevent unused argument(s) compilation warning */
6222   UNUSED(htim);
6223 
6224   /* NOTE : This function should not be modified, when the callback is needed,
6225             the HAL_TIM_PWM_PulseFinishedHalfCpltCallback could be implemented in the user file
6226    */
6227 }
6228 
6229 /**
6230   * @brief  Hall Trigger detection callback in non-blocking mode
6231   * @param  htim TIM handle
6232   * @retval None
6233   */
HAL_TIM_TriggerCallback(TIM_HandleTypeDef * htim)6234 __weak void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim)
6235 {
6236   /* Prevent unused argument(s) compilation warning */
6237   UNUSED(htim);
6238 
6239   /* NOTE : This function should not be modified, when the callback is needed,
6240             the HAL_TIM_TriggerCallback could be implemented in the user file
6241    */
6242 }
6243 
6244 /**
6245   * @brief  Hall Trigger detection half complete callback in non-blocking mode
6246   * @param  htim TIM handle
6247   * @retval None
6248   */
HAL_TIM_TriggerHalfCpltCallback(TIM_HandleTypeDef * htim)6249 __weak void HAL_TIM_TriggerHalfCpltCallback(TIM_HandleTypeDef *htim)
6250 {
6251   /* Prevent unused argument(s) compilation warning */
6252   UNUSED(htim);
6253 
6254   /* NOTE : This function should not be modified, when the callback is needed,
6255             the HAL_TIM_TriggerHalfCpltCallback could be implemented in the user file
6256    */
6257 }
6258 
6259 /**
6260   * @brief  Timer error callback in non-blocking mode
6261   * @param  htim TIM handle
6262   * @retval None
6263   */
HAL_TIM_ErrorCallback(TIM_HandleTypeDef * htim)6264 __weak void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim)
6265 {
6266   /* Prevent unused argument(s) compilation warning */
6267   UNUSED(htim);
6268 
6269   /* NOTE : This function should not be modified, when the callback is needed,
6270             the HAL_TIM_ErrorCallback could be implemented in the user file
6271    */
6272 }
6273 
6274 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
6275 /**
6276   * @brief  Register a User TIM callback to be used instead of the weak predefined callback
6277   * @param htim tim handle
6278   * @param CallbackID ID of the callback to be registered
6279   *        This parameter can be one of the following values:
6280   *          @arg @ref HAL_TIM_BASE_MSPINIT_CB_ID Base MspInit Callback ID
6281   *          @arg @ref HAL_TIM_BASE_MSPDEINIT_CB_ID Base MspDeInit Callback ID
6282   *          @arg @ref HAL_TIM_IC_MSPINIT_CB_ID IC MspInit Callback ID
6283   *          @arg @ref HAL_TIM_IC_MSPDEINIT_CB_ID IC MspDeInit Callback ID
6284   *          @arg @ref HAL_TIM_OC_MSPINIT_CB_ID OC MspInit Callback ID
6285   *          @arg @ref HAL_TIM_OC_MSPDEINIT_CB_ID OC MspDeInit Callback ID
6286   *          @arg @ref HAL_TIM_PWM_MSPINIT_CB_ID PWM MspInit Callback ID
6287   *          @arg @ref HAL_TIM_PWM_MSPDEINIT_CB_ID PWM MspDeInit Callback ID
6288   *          @arg @ref HAL_TIM_ONE_PULSE_MSPINIT_CB_ID One Pulse MspInit Callback ID
6289   *          @arg @ref HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID One Pulse MspDeInit Callback ID
6290   *          @arg @ref HAL_TIM_ENCODER_MSPINIT_CB_ID Encoder MspInit Callback ID
6291   *          @arg @ref HAL_TIM_ENCODER_MSPDEINIT_CB_ID Encoder MspDeInit Callback ID
6292   *          @arg @ref HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID Hall Sensor MspInit Callback ID
6293   *          @arg @ref HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID Hall Sensor MspDeInit Callback ID
6294   *          @arg @ref HAL_TIM_PERIOD_ELAPSED_CB_ID Period Elapsed Callback ID
6295   *          @arg @ref HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID Period Elapsed half complete Callback ID
6296   *          @arg @ref HAL_TIM_TRIGGER_CB_ID Trigger Callback ID
6297   *          @arg @ref HAL_TIM_TRIGGER_HALF_CB_ID Trigger half complete Callback ID
6298   *          @arg @ref HAL_TIM_IC_CAPTURE_CB_ID Input Capture Callback ID
6299   *          @arg @ref HAL_TIM_IC_CAPTURE_HALF_CB_ID Input Capture half complete Callback ID
6300   *          @arg @ref HAL_TIM_OC_DELAY_ELAPSED_CB_ID Output Compare Delay Elapsed Callback ID
6301   *          @arg @ref HAL_TIM_PWM_PULSE_FINISHED_CB_ID PWM Pulse Finished Callback ID
6302   *          @arg @ref HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID PWM Pulse Finished half complete Callback ID
6303   *          @arg @ref HAL_TIM_ERROR_CB_ID Error Callback ID
6304   *          @arg @ref HAL_TIM_COMMUTATION_CB_ID Commutation Callback ID
6305   *          @arg @ref HAL_TIM_COMMUTATION_HALF_CB_ID Commutation half complete Callback ID
6306   *          @arg @ref HAL_TIM_BREAK_CB_ID Break Callback ID
6307   *          @arg @ref HAL_TIM_BREAK2_CB_ID Break2 Callback ID
6308   *          @arg @ref HAL_TIM_ENCODER_INDEX_CB_ID Encoder Index Callback ID
6309   *          @arg @ref HAL_TIM_DIRECTION_CHANGE_CB_ID Direction Change Callback ID
6310   *          @arg @ref HAL_TIM_INDEX_ERROR_CB_ID Index Error Callback ID
6311   *          @arg @ref HAL_TIM_TRANSITION_ERROR_CB_ID Transition Error Callback ID
6312   *          @param pCallback pointer to the callback function
6313   *          @retval status
6314   */
HAL_TIM_RegisterCallback(TIM_HandleTypeDef * htim,HAL_TIM_CallbackIDTypeDef CallbackID,pTIM_CallbackTypeDef pCallback)6315 HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID,
6316                                            pTIM_CallbackTypeDef pCallback)
6317 {
6318   HAL_StatusTypeDef status = HAL_OK;
6319 
6320   if (pCallback == NULL)
6321   {
6322     return HAL_ERROR;
6323   }
6324 
6325   if (htim->State == HAL_TIM_STATE_READY)
6326   {
6327     switch (CallbackID)
6328     {
6329       case HAL_TIM_BASE_MSPINIT_CB_ID :
6330         htim->Base_MspInitCallback                 = pCallback;
6331         break;
6332 
6333       case HAL_TIM_BASE_MSPDEINIT_CB_ID :
6334         htim->Base_MspDeInitCallback               = pCallback;
6335         break;
6336 
6337       case HAL_TIM_IC_MSPINIT_CB_ID :
6338         htim->IC_MspInitCallback                   = pCallback;
6339         break;
6340 
6341       case HAL_TIM_IC_MSPDEINIT_CB_ID :
6342         htim->IC_MspDeInitCallback                 = pCallback;
6343         break;
6344 
6345       case HAL_TIM_OC_MSPINIT_CB_ID :
6346         htim->OC_MspInitCallback                   = pCallback;
6347         break;
6348 
6349       case HAL_TIM_OC_MSPDEINIT_CB_ID :
6350         htim->OC_MspDeInitCallback                 = pCallback;
6351         break;
6352 
6353       case HAL_TIM_PWM_MSPINIT_CB_ID :
6354         htim->PWM_MspInitCallback                  = pCallback;
6355         break;
6356 
6357       case HAL_TIM_PWM_MSPDEINIT_CB_ID :
6358         htim->PWM_MspDeInitCallback                = pCallback;
6359         break;
6360 
6361       case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID :
6362         htim->OnePulse_MspInitCallback             = pCallback;
6363         break;
6364 
6365       case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID :
6366         htim->OnePulse_MspDeInitCallback           = pCallback;
6367         break;
6368 
6369       case HAL_TIM_ENCODER_MSPINIT_CB_ID :
6370         htim->Encoder_MspInitCallback              = pCallback;
6371         break;
6372 
6373       case HAL_TIM_ENCODER_MSPDEINIT_CB_ID :
6374         htim->Encoder_MspDeInitCallback            = pCallback;
6375         break;
6376 
6377       case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID :
6378         htim->HallSensor_MspInitCallback           = pCallback;
6379         break;
6380 
6381       case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID :
6382         htim->HallSensor_MspDeInitCallback         = pCallback;
6383         break;
6384 
6385       case HAL_TIM_PERIOD_ELAPSED_CB_ID :
6386         htim->PeriodElapsedCallback                = pCallback;
6387         break;
6388 
6389       case HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID :
6390         htim->PeriodElapsedHalfCpltCallback        = pCallback;
6391         break;
6392 
6393       case HAL_TIM_TRIGGER_CB_ID :
6394         htim->TriggerCallback                      = pCallback;
6395         break;
6396 
6397       case HAL_TIM_TRIGGER_HALF_CB_ID :
6398         htim->TriggerHalfCpltCallback              = pCallback;
6399         break;
6400 
6401       case HAL_TIM_IC_CAPTURE_CB_ID :
6402         htim->IC_CaptureCallback                   = pCallback;
6403         break;
6404 
6405       case HAL_TIM_IC_CAPTURE_HALF_CB_ID :
6406         htim->IC_CaptureHalfCpltCallback           = pCallback;
6407         break;
6408 
6409       case HAL_TIM_OC_DELAY_ELAPSED_CB_ID :
6410         htim->OC_DelayElapsedCallback              = pCallback;
6411         break;
6412 
6413       case HAL_TIM_PWM_PULSE_FINISHED_CB_ID :
6414         htim->PWM_PulseFinishedCallback            = pCallback;
6415         break;
6416 
6417       case HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID :
6418         htim->PWM_PulseFinishedHalfCpltCallback    = pCallback;
6419         break;
6420 
6421       case HAL_TIM_ERROR_CB_ID :
6422         htim->ErrorCallback                        = pCallback;
6423         break;
6424 
6425       case HAL_TIM_COMMUTATION_CB_ID :
6426         htim->CommutationCallback                  = pCallback;
6427         break;
6428 
6429       case HAL_TIM_COMMUTATION_HALF_CB_ID :
6430         htim->CommutationHalfCpltCallback          = pCallback;
6431         break;
6432 
6433       case HAL_TIM_BREAK_CB_ID :
6434         htim->BreakCallback                        = pCallback;
6435         break;
6436 
6437       case HAL_TIM_BREAK2_CB_ID :
6438         htim->Break2Callback                       = pCallback;
6439         break;
6440 
6441       case HAL_TIM_ENCODER_INDEX_CB_ID :
6442         htim->EncoderIndexCallback                 = pCallback;
6443         break;
6444 
6445       case HAL_TIM_DIRECTION_CHANGE_CB_ID :
6446         htim->DirectionChangeCallback              = pCallback;
6447         break;
6448 
6449       case HAL_TIM_INDEX_ERROR_CB_ID :
6450         htim->IndexErrorCallback                   = pCallback;
6451         break;
6452 
6453       case HAL_TIM_TRANSITION_ERROR_CB_ID :
6454         htim->TransitionErrorCallback              = pCallback;
6455         break;
6456 
6457       default :
6458         /* Return error status */
6459         status = HAL_ERROR;
6460         break;
6461     }
6462   }
6463   else if (htim->State == HAL_TIM_STATE_RESET)
6464   {
6465     switch (CallbackID)
6466     {
6467       case HAL_TIM_BASE_MSPINIT_CB_ID :
6468         htim->Base_MspInitCallback         = pCallback;
6469         break;
6470 
6471       case HAL_TIM_BASE_MSPDEINIT_CB_ID :
6472         htim->Base_MspDeInitCallback       = pCallback;
6473         break;
6474 
6475       case HAL_TIM_IC_MSPINIT_CB_ID :
6476         htim->IC_MspInitCallback           = pCallback;
6477         break;
6478 
6479       case HAL_TIM_IC_MSPDEINIT_CB_ID :
6480         htim->IC_MspDeInitCallback         = pCallback;
6481         break;
6482 
6483       case HAL_TIM_OC_MSPINIT_CB_ID :
6484         htim->OC_MspInitCallback           = pCallback;
6485         break;
6486 
6487       case HAL_TIM_OC_MSPDEINIT_CB_ID :
6488         htim->OC_MspDeInitCallback         = pCallback;
6489         break;
6490 
6491       case HAL_TIM_PWM_MSPINIT_CB_ID :
6492         htim->PWM_MspInitCallback          = pCallback;
6493         break;
6494 
6495       case HAL_TIM_PWM_MSPDEINIT_CB_ID :
6496         htim->PWM_MspDeInitCallback        = pCallback;
6497         break;
6498 
6499       case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID :
6500         htim->OnePulse_MspInitCallback     = pCallback;
6501         break;
6502 
6503       case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID :
6504         htim->OnePulse_MspDeInitCallback   = pCallback;
6505         break;
6506 
6507       case HAL_TIM_ENCODER_MSPINIT_CB_ID :
6508         htim->Encoder_MspInitCallback      = pCallback;
6509         break;
6510 
6511       case HAL_TIM_ENCODER_MSPDEINIT_CB_ID :
6512         htim->Encoder_MspDeInitCallback    = pCallback;
6513         break;
6514 
6515       case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID :
6516         htim->HallSensor_MspInitCallback   = pCallback;
6517         break;
6518 
6519       case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID :
6520         htim->HallSensor_MspDeInitCallback = pCallback;
6521         break;
6522 
6523       default :
6524         /* Return error status */
6525         status = HAL_ERROR;
6526         break;
6527     }
6528   }
6529   else
6530   {
6531     /* Return error status */
6532     status = HAL_ERROR;
6533   }
6534 
6535   return status;
6536 }
6537 
6538 /**
6539   * @brief  Unregister a TIM callback
6540   *         TIM callback is redirected to the weak predefined callback
6541   * @param htim tim handle
6542   * @param CallbackID ID of the callback to be unregistered
6543   *        This parameter can be one of the following values:
6544   *          @arg @ref HAL_TIM_BASE_MSPINIT_CB_ID Base MspInit Callback ID
6545   *          @arg @ref HAL_TIM_BASE_MSPDEINIT_CB_ID Base MspDeInit Callback ID
6546   *          @arg @ref HAL_TIM_IC_MSPINIT_CB_ID IC MspInit Callback ID
6547   *          @arg @ref HAL_TIM_IC_MSPDEINIT_CB_ID IC MspDeInit Callback ID
6548   *          @arg @ref HAL_TIM_OC_MSPINIT_CB_ID OC MspInit Callback ID
6549   *          @arg @ref HAL_TIM_OC_MSPDEINIT_CB_ID OC MspDeInit Callback ID
6550   *          @arg @ref HAL_TIM_PWM_MSPINIT_CB_ID PWM MspInit Callback ID
6551   *          @arg @ref HAL_TIM_PWM_MSPDEINIT_CB_ID PWM MspDeInit Callback ID
6552   *          @arg @ref HAL_TIM_ONE_PULSE_MSPINIT_CB_ID One Pulse MspInit Callback ID
6553   *          @arg @ref HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID One Pulse MspDeInit Callback ID
6554   *          @arg @ref HAL_TIM_ENCODER_MSPINIT_CB_ID Encoder MspInit Callback ID
6555   *          @arg @ref HAL_TIM_ENCODER_MSPDEINIT_CB_ID Encoder MspDeInit Callback ID
6556   *          @arg @ref HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID Hall Sensor MspInit Callback ID
6557   *          @arg @ref HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID Hall Sensor MspDeInit Callback ID
6558   *          @arg @ref HAL_TIM_PERIOD_ELAPSED_CB_ID Period Elapsed Callback ID
6559   *          @arg @ref HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID Period Elapsed half complete Callback ID
6560   *          @arg @ref HAL_TIM_TRIGGER_CB_ID Trigger Callback ID
6561   *          @arg @ref HAL_TIM_TRIGGER_HALF_CB_ID Trigger half complete Callback ID
6562   *          @arg @ref HAL_TIM_IC_CAPTURE_CB_ID Input Capture Callback ID
6563   *          @arg @ref HAL_TIM_IC_CAPTURE_HALF_CB_ID Input Capture half complete Callback ID
6564   *          @arg @ref HAL_TIM_OC_DELAY_ELAPSED_CB_ID Output Compare Delay Elapsed Callback ID
6565   *          @arg @ref HAL_TIM_PWM_PULSE_FINISHED_CB_ID PWM Pulse Finished Callback ID
6566   *          @arg @ref HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID PWM Pulse Finished half complete Callback ID
6567   *          @arg @ref HAL_TIM_ERROR_CB_ID Error Callback ID
6568   *          @arg @ref HAL_TIM_COMMUTATION_CB_ID Commutation Callback ID
6569   *          @arg @ref HAL_TIM_COMMUTATION_HALF_CB_ID Commutation half complete Callback ID
6570   *          @arg @ref HAL_TIM_BREAK_CB_ID Break Callback ID
6571   *          @arg @ref HAL_TIM_BREAK2_CB_ID Break2 Callback ID
6572   *          @arg @ref HAL_TIM_ENCODER_INDEX_CB_ID Encoder Index Callback ID
6573   *          @arg @ref HAL_TIM_DIRECTION_CHANGE_CB_ID Direction Change Callback ID
6574   *          @arg @ref HAL_TIM_INDEX_ERROR_CB_ID Index Error Callback ID
6575   *          @arg @ref HAL_TIM_TRANSITION_ERROR_CB_ID Transition Error Callback ID
6576   *          @retval status
6577   */
HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef * htim,HAL_TIM_CallbackIDTypeDef CallbackID)6578 HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID)
6579 {
6580   HAL_StatusTypeDef status = HAL_OK;
6581 
6582   if (htim->State == HAL_TIM_STATE_READY)
6583   {
6584     switch (CallbackID)
6585     {
6586       case HAL_TIM_BASE_MSPINIT_CB_ID :
6587         /* Legacy weak Base MspInit Callback */
6588         htim->Base_MspInitCallback              = HAL_TIM_Base_MspInit;
6589         break;
6590 
6591       case HAL_TIM_BASE_MSPDEINIT_CB_ID :
6592         /* Legacy weak Base Msp DeInit Callback */
6593         htim->Base_MspDeInitCallback            = HAL_TIM_Base_MspDeInit;
6594         break;
6595 
6596       case HAL_TIM_IC_MSPINIT_CB_ID :
6597         /* Legacy weak IC Msp Init Callback */
6598         htim->IC_MspInitCallback                = HAL_TIM_IC_MspInit;
6599         break;
6600 
6601       case HAL_TIM_IC_MSPDEINIT_CB_ID :
6602         /* Legacy weak IC Msp DeInit Callback */
6603         htim->IC_MspDeInitCallback              = HAL_TIM_IC_MspDeInit;
6604         break;
6605 
6606       case HAL_TIM_OC_MSPINIT_CB_ID :
6607         /* Legacy weak OC Msp Init Callback */
6608         htim->OC_MspInitCallback                = HAL_TIM_OC_MspInit;
6609         break;
6610 
6611       case HAL_TIM_OC_MSPDEINIT_CB_ID :
6612         /* Legacy weak OC Msp DeInit Callback */
6613         htim->OC_MspDeInitCallback              = HAL_TIM_OC_MspDeInit;
6614         break;
6615 
6616       case HAL_TIM_PWM_MSPINIT_CB_ID :
6617         /* Legacy weak PWM Msp Init Callback */
6618         htim->PWM_MspInitCallback               = HAL_TIM_PWM_MspInit;
6619         break;
6620 
6621       case HAL_TIM_PWM_MSPDEINIT_CB_ID :
6622         /* Legacy weak PWM Msp DeInit Callback */
6623         htim->PWM_MspDeInitCallback             = HAL_TIM_PWM_MspDeInit;
6624         break;
6625 
6626       case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID :
6627         /* Legacy weak One Pulse Msp Init Callback */
6628         htim->OnePulse_MspInitCallback          = HAL_TIM_OnePulse_MspInit;
6629         break;
6630 
6631       case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID :
6632         /* Legacy weak One Pulse Msp DeInit Callback */
6633         htim->OnePulse_MspDeInitCallback        = HAL_TIM_OnePulse_MspDeInit;
6634         break;
6635 
6636       case HAL_TIM_ENCODER_MSPINIT_CB_ID :
6637         /* Legacy weak Encoder Msp Init Callback */
6638         htim->Encoder_MspInitCallback           = HAL_TIM_Encoder_MspInit;
6639         break;
6640 
6641       case HAL_TIM_ENCODER_MSPDEINIT_CB_ID :
6642         /* Legacy weak Encoder Msp DeInit Callback */
6643         htim->Encoder_MspDeInitCallback         = HAL_TIM_Encoder_MspDeInit;
6644         break;
6645 
6646       case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID :
6647         /* Legacy weak Hall Sensor Msp Init Callback */
6648         htim->HallSensor_MspInitCallback        = HAL_TIMEx_HallSensor_MspInit;
6649         break;
6650 
6651       case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID :
6652         /* Legacy weak Hall Sensor Msp DeInit Callback */
6653         htim->HallSensor_MspDeInitCallback      = HAL_TIMEx_HallSensor_MspDeInit;
6654         break;
6655 
6656       case HAL_TIM_PERIOD_ELAPSED_CB_ID :
6657         /* Legacy weak Period Elapsed Callback */
6658         htim->PeriodElapsedCallback             = HAL_TIM_PeriodElapsedCallback;
6659         break;
6660 
6661       case HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID :
6662         /* Legacy weak Period Elapsed half complete Callback */
6663         htim->PeriodElapsedHalfCpltCallback     = HAL_TIM_PeriodElapsedHalfCpltCallback;
6664         break;
6665 
6666       case HAL_TIM_TRIGGER_CB_ID :
6667         /* Legacy weak Trigger Callback */
6668         htim->TriggerCallback                   = HAL_TIM_TriggerCallback;
6669         break;
6670 
6671       case HAL_TIM_TRIGGER_HALF_CB_ID :
6672         /* Legacy weak Trigger half complete Callback */
6673         htim->TriggerHalfCpltCallback           = HAL_TIM_TriggerHalfCpltCallback;
6674         break;
6675 
6676       case HAL_TIM_IC_CAPTURE_CB_ID :
6677         /* Legacy weak IC Capture Callback */
6678         htim->IC_CaptureCallback                = HAL_TIM_IC_CaptureCallback;
6679         break;
6680 
6681       case HAL_TIM_IC_CAPTURE_HALF_CB_ID :
6682         /* Legacy weak IC Capture half complete Callback */
6683         htim->IC_CaptureHalfCpltCallback        = HAL_TIM_IC_CaptureHalfCpltCallback;
6684         break;
6685 
6686       case HAL_TIM_OC_DELAY_ELAPSED_CB_ID :
6687         /* Legacy weak OC Delay Elapsed Callback */
6688         htim->OC_DelayElapsedCallback           = HAL_TIM_OC_DelayElapsedCallback;
6689         break;
6690 
6691       case HAL_TIM_PWM_PULSE_FINISHED_CB_ID :
6692         /* Legacy weak PWM Pulse Finished Callback */
6693         htim->PWM_PulseFinishedCallback         = HAL_TIM_PWM_PulseFinishedCallback;
6694         break;
6695 
6696       case HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID :
6697         /* Legacy weak PWM Pulse Finished half complete Callback */
6698         htim->PWM_PulseFinishedHalfCpltCallback = HAL_TIM_PWM_PulseFinishedHalfCpltCallback;
6699         break;
6700 
6701       case HAL_TIM_ERROR_CB_ID :
6702         /* Legacy weak Error Callback */
6703         htim->ErrorCallback                     = HAL_TIM_ErrorCallback;
6704         break;
6705 
6706       case HAL_TIM_COMMUTATION_CB_ID :
6707         /* Legacy weak Commutation Callback */
6708         htim->CommutationCallback               = HAL_TIMEx_CommutCallback;
6709         break;
6710 
6711       case HAL_TIM_COMMUTATION_HALF_CB_ID :
6712         /* Legacy weak Commutation half complete Callback */
6713         htim->CommutationHalfCpltCallback       = HAL_TIMEx_CommutHalfCpltCallback;
6714         break;
6715 
6716       case HAL_TIM_BREAK_CB_ID :
6717         /* Legacy weak Break Callback */
6718         htim->BreakCallback                     = HAL_TIMEx_BreakCallback;
6719         break;
6720 
6721       case HAL_TIM_BREAK2_CB_ID :
6722         /* Legacy weak Break2 Callback */
6723         htim->Break2Callback                    = HAL_TIMEx_Break2Callback;
6724         break;
6725 
6726       case HAL_TIM_ENCODER_INDEX_CB_ID :
6727         /* Legacy weak Encoder Index Callback */
6728         htim->EncoderIndexCallback              = HAL_TIMEx_EncoderIndexCallback;
6729         break;
6730 
6731       case HAL_TIM_DIRECTION_CHANGE_CB_ID :
6732         /* Legacy weak Direction Change Callback */
6733         htim->DirectionChangeCallback           = HAL_TIMEx_DirectionChangeCallback;
6734         break;
6735 
6736       case HAL_TIM_INDEX_ERROR_CB_ID :
6737         /* Legacy weak Index Error Callback */
6738         htim->IndexErrorCallback                = HAL_TIMEx_IndexErrorCallback;
6739         break;
6740 
6741       case HAL_TIM_TRANSITION_ERROR_CB_ID :
6742         /* Legacy weak Transition Error Callback */
6743         htim->TransitionErrorCallback           = HAL_TIMEx_TransitionErrorCallback;
6744         break;
6745 
6746       default :
6747         /* Return error status */
6748         status = HAL_ERROR;
6749         break;
6750     }
6751   }
6752   else if (htim->State == HAL_TIM_STATE_RESET)
6753   {
6754     switch (CallbackID)
6755     {
6756       case HAL_TIM_BASE_MSPINIT_CB_ID :
6757         /* Legacy weak Base MspInit Callback */
6758         htim->Base_MspInitCallback         = HAL_TIM_Base_MspInit;
6759         break;
6760 
6761       case HAL_TIM_BASE_MSPDEINIT_CB_ID :
6762         /* Legacy weak Base Msp DeInit Callback */
6763         htim->Base_MspDeInitCallback       = HAL_TIM_Base_MspDeInit;
6764         break;
6765 
6766       case HAL_TIM_IC_MSPINIT_CB_ID :
6767         /* Legacy weak IC Msp Init Callback */
6768         htim->IC_MspInitCallback           = HAL_TIM_IC_MspInit;
6769         break;
6770 
6771       case HAL_TIM_IC_MSPDEINIT_CB_ID :
6772         /* Legacy weak IC Msp DeInit Callback */
6773         htim->IC_MspDeInitCallback         = HAL_TIM_IC_MspDeInit;
6774         break;
6775 
6776       case HAL_TIM_OC_MSPINIT_CB_ID :
6777         /* Legacy weak OC Msp Init Callback */
6778         htim->OC_MspInitCallback           = HAL_TIM_OC_MspInit;
6779         break;
6780 
6781       case HAL_TIM_OC_MSPDEINIT_CB_ID :
6782         /* Legacy weak OC Msp DeInit Callback */
6783         htim->OC_MspDeInitCallback         = HAL_TIM_OC_MspDeInit;
6784         break;
6785 
6786       case HAL_TIM_PWM_MSPINIT_CB_ID :
6787         /* Legacy weak PWM Msp Init Callback */
6788         htim->PWM_MspInitCallback          = HAL_TIM_PWM_MspInit;
6789         break;
6790 
6791       case HAL_TIM_PWM_MSPDEINIT_CB_ID :
6792         /* Legacy weak PWM Msp DeInit Callback */
6793         htim->PWM_MspDeInitCallback        = HAL_TIM_PWM_MspDeInit;
6794         break;
6795 
6796       case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID :
6797         /* Legacy weak One Pulse Msp Init Callback */
6798         htim->OnePulse_MspInitCallback     = HAL_TIM_OnePulse_MspInit;
6799         break;
6800 
6801       case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID :
6802         /* Legacy weak One Pulse Msp DeInit Callback */
6803         htim->OnePulse_MspDeInitCallback   = HAL_TIM_OnePulse_MspDeInit;
6804         break;
6805 
6806       case HAL_TIM_ENCODER_MSPINIT_CB_ID :
6807         /* Legacy weak Encoder Msp Init Callback */
6808         htim->Encoder_MspInitCallback      = HAL_TIM_Encoder_MspInit;
6809         break;
6810 
6811       case HAL_TIM_ENCODER_MSPDEINIT_CB_ID :
6812         /* Legacy weak Encoder Msp DeInit Callback */
6813         htim->Encoder_MspDeInitCallback    = HAL_TIM_Encoder_MspDeInit;
6814         break;
6815 
6816       case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID :
6817         /* Legacy weak Hall Sensor Msp Init Callback */
6818         htim->HallSensor_MspInitCallback   = HAL_TIMEx_HallSensor_MspInit;
6819         break;
6820 
6821       case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID :
6822         /* Legacy weak Hall Sensor Msp DeInit Callback */
6823         htim->HallSensor_MspDeInitCallback = HAL_TIMEx_HallSensor_MspDeInit;
6824         break;
6825 
6826       default :
6827         /* Return error status */
6828         status = HAL_ERROR;
6829         break;
6830     }
6831   }
6832   else
6833   {
6834     /* Return error status */
6835     status = HAL_ERROR;
6836   }
6837 
6838   return status;
6839 }
6840 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
6841 
6842 /**
6843   * @}
6844   */
6845 
6846 /** @defgroup TIM_Exported_Functions_Group10 TIM Peripheral State functions
6847   *  @brief   TIM Peripheral State functions
6848   *
6849 @verbatim
6850   ==============================================================================
6851                         ##### Peripheral State functions #####
6852   ==============================================================================
6853     [..]
6854     This subsection permits to get in run-time the status of the peripheral
6855     and the data flow.
6856 
6857 @endverbatim
6858   * @{
6859   */
6860 
6861 /**
6862   * @brief  Return the TIM Base handle state.
6863   * @param  htim TIM Base handle
6864   * @retval HAL state
6865   */
HAL_TIM_Base_GetState(const TIM_HandleTypeDef * htim)6866 HAL_TIM_StateTypeDef HAL_TIM_Base_GetState(const TIM_HandleTypeDef *htim)
6867 {
6868   return htim->State;
6869 }
6870 
6871 /**
6872   * @brief  Return the TIM OC handle state.
6873   * @param  htim TIM Output Compare handle
6874   * @retval HAL state
6875   */
HAL_TIM_OC_GetState(const TIM_HandleTypeDef * htim)6876 HAL_TIM_StateTypeDef HAL_TIM_OC_GetState(const TIM_HandleTypeDef *htim)
6877 {
6878   return htim->State;
6879 }
6880 
6881 /**
6882   * @brief  Return the TIM PWM handle state.
6883   * @param  htim TIM handle
6884   * @retval HAL state
6885   */
HAL_TIM_PWM_GetState(const TIM_HandleTypeDef * htim)6886 HAL_TIM_StateTypeDef HAL_TIM_PWM_GetState(const TIM_HandleTypeDef *htim)
6887 {
6888   return htim->State;
6889 }
6890 
6891 /**
6892   * @brief  Return the TIM Input Capture handle state.
6893   * @param  htim TIM IC handle
6894   * @retval HAL state
6895   */
HAL_TIM_IC_GetState(const TIM_HandleTypeDef * htim)6896 HAL_TIM_StateTypeDef HAL_TIM_IC_GetState(const TIM_HandleTypeDef *htim)
6897 {
6898   return htim->State;
6899 }
6900 
6901 /**
6902   * @brief  Return the TIM One Pulse Mode handle state.
6903   * @param  htim TIM OPM handle
6904   * @retval HAL state
6905   */
HAL_TIM_OnePulse_GetState(const TIM_HandleTypeDef * htim)6906 HAL_TIM_StateTypeDef HAL_TIM_OnePulse_GetState(const TIM_HandleTypeDef *htim)
6907 {
6908   return htim->State;
6909 }
6910 
6911 /**
6912   * @brief  Return the TIM Encoder Mode handle state.
6913   * @param  htim TIM Encoder Interface handle
6914   * @retval HAL state
6915   */
HAL_TIM_Encoder_GetState(const TIM_HandleTypeDef * htim)6916 HAL_TIM_StateTypeDef HAL_TIM_Encoder_GetState(const TIM_HandleTypeDef *htim)
6917 {
6918   return htim->State;
6919 }
6920 
6921 /**
6922   * @brief  Return the TIM Encoder Mode handle state.
6923   * @param  htim TIM handle
6924   * @retval Active channel
6925   */
HAL_TIM_GetActiveChannel(const TIM_HandleTypeDef * htim)6926 HAL_TIM_ActiveChannel HAL_TIM_GetActiveChannel(const TIM_HandleTypeDef *htim)
6927 {
6928   return htim->Channel;
6929 }
6930 
6931 /**
6932   * @brief  Return actual state of the TIM channel.
6933   * @param  htim TIM handle
6934   * @param  Channel TIM Channel
6935   *          This parameter can be one of the following values:
6936   *            @arg TIM_CHANNEL_1: TIM Channel 1
6937   *            @arg TIM_CHANNEL_2: TIM Channel 2
6938   *            @arg TIM_CHANNEL_3: TIM Channel 3
6939   *            @arg TIM_CHANNEL_4: TIM Channel 4
6940   *            @arg TIM_CHANNEL_5: TIM Channel 5
6941   *            @arg TIM_CHANNEL_6: TIM Channel 6
6942   * @retval TIM Channel state
6943   */
HAL_TIM_GetChannelState(const TIM_HandleTypeDef * htim,uint32_t Channel)6944 HAL_TIM_ChannelStateTypeDef HAL_TIM_GetChannelState(const TIM_HandleTypeDef *htim,  uint32_t Channel)
6945 {
6946   HAL_TIM_ChannelStateTypeDef channel_state;
6947 
6948   /* Check the parameters */
6949   assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel));
6950 
6951   channel_state = TIM_CHANNEL_STATE_GET(htim, Channel);
6952 
6953   return channel_state;
6954 }
6955 
6956 /**
6957   * @brief  Return actual state of a DMA burst operation.
6958   * @param  htim TIM handle
6959   * @retval DMA burst state
6960   */
HAL_TIM_DMABurstState(const TIM_HandleTypeDef * htim)6961 HAL_TIM_DMABurstStateTypeDef HAL_TIM_DMABurstState(const TIM_HandleTypeDef *htim)
6962 {
6963   /* Check the parameters */
6964   assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance));
6965 
6966   return htim->DMABurstState;
6967 }
6968 
6969 /**
6970   * @}
6971   */
6972 
6973 /**
6974   * @}
6975   */
6976 
6977 /** @defgroup TIM_Private_Functions TIM Private Functions
6978   * @{
6979   */
6980 
6981 /**
6982   * @brief  TIM DMA error callback
6983   * @param  hdma pointer to DMA handle.
6984   * @retval None
6985   */
TIM_DMAError(DMA_HandleTypeDef * hdma)6986 void TIM_DMAError(DMA_HandleTypeDef *hdma)
6987 {
6988   TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
6989 
6990   if (hdma == htim->hdma[TIM_DMA_ID_CC1])
6991   {
6992     htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1;
6993     TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY);
6994   }
6995   else if (hdma == htim->hdma[TIM_DMA_ID_CC2])
6996   {
6997     htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2;
6998     TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY);
6999   }
7000   else if (hdma == htim->hdma[TIM_DMA_ID_CC3])
7001   {
7002     htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3;
7003     TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY);
7004   }
7005   else if (hdma == htim->hdma[TIM_DMA_ID_CC4])
7006   {
7007     htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4;
7008     TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_4, HAL_TIM_CHANNEL_STATE_READY);
7009   }
7010   else
7011   {
7012     htim->State = HAL_TIM_STATE_READY;
7013   }
7014 
7015 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
7016   htim->ErrorCallback(htim);
7017 #else
7018   HAL_TIM_ErrorCallback(htim);
7019 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
7020 
7021   htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;
7022 }
7023 
7024 /**
7025   * @brief  TIM DMA Delay Pulse complete callback.
7026   * @param  hdma pointer to DMA handle.
7027   * @retval None
7028   */
TIM_DMADelayPulseCplt(DMA_HandleTypeDef * hdma)7029 static void TIM_DMADelayPulseCplt(DMA_HandleTypeDef *hdma)
7030 {
7031   TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
7032 
7033   if (hdma == htim->hdma[TIM_DMA_ID_CC1])
7034   {
7035     htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1;
7036 
7037     if (hdma->Init.Mode == DMA_NORMAL)
7038     {
7039       TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY);
7040     }
7041   }
7042   else if (hdma == htim->hdma[TIM_DMA_ID_CC2])
7043   {
7044     htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2;
7045 
7046     if (hdma->Init.Mode == DMA_NORMAL)
7047     {
7048       TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY);
7049     }
7050   }
7051   else if (hdma == htim->hdma[TIM_DMA_ID_CC3])
7052   {
7053     htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3;
7054 
7055     if (hdma->Init.Mode == DMA_NORMAL)
7056     {
7057       TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY);
7058     }
7059   }
7060   else if (hdma == htim->hdma[TIM_DMA_ID_CC4])
7061   {
7062     htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4;
7063 
7064     if (hdma->Init.Mode == DMA_NORMAL)
7065     {
7066       TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_4, HAL_TIM_CHANNEL_STATE_READY);
7067     }
7068   }
7069   else
7070   {
7071     /* nothing to do */
7072   }
7073 
7074 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
7075   htim->PWM_PulseFinishedCallback(htim);
7076 #else
7077   HAL_TIM_PWM_PulseFinishedCallback(htim);
7078 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
7079 
7080   htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;
7081 }
7082 
7083 /**
7084   * @brief  TIM DMA Delay Pulse half complete callback.
7085   * @param  hdma pointer to DMA handle.
7086   * @retval None
7087   */
TIM_DMADelayPulseHalfCplt(DMA_HandleTypeDef * hdma)7088 void TIM_DMADelayPulseHalfCplt(DMA_HandleTypeDef *hdma)
7089 {
7090   TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
7091 
7092   if (hdma == htim->hdma[TIM_DMA_ID_CC1])
7093   {
7094     htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1;
7095   }
7096   else if (hdma == htim->hdma[TIM_DMA_ID_CC2])
7097   {
7098     htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2;
7099   }
7100   else if (hdma == htim->hdma[TIM_DMA_ID_CC3])
7101   {
7102     htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3;
7103   }
7104   else if (hdma == htim->hdma[TIM_DMA_ID_CC4])
7105   {
7106     htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4;
7107   }
7108   else
7109   {
7110     /* nothing to do */
7111   }
7112 
7113 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
7114   htim->PWM_PulseFinishedHalfCpltCallback(htim);
7115 #else
7116   HAL_TIM_PWM_PulseFinishedHalfCpltCallback(htim);
7117 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
7118 
7119   htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;
7120 }
7121 
7122 /**
7123   * @brief  TIM DMA Capture complete callback.
7124   * @param  hdma pointer to DMA handle.
7125   * @retval None
7126   */
TIM_DMACaptureCplt(DMA_HandleTypeDef * hdma)7127 void TIM_DMACaptureCplt(DMA_HandleTypeDef *hdma)
7128 {
7129   TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
7130 
7131   if (hdma == htim->hdma[TIM_DMA_ID_CC1])
7132   {
7133     htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1;
7134 
7135     if (hdma->Init.Mode == DMA_NORMAL)
7136     {
7137       TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY);
7138       TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY);
7139     }
7140   }
7141   else if (hdma == htim->hdma[TIM_DMA_ID_CC2])
7142   {
7143     htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2;
7144 
7145     if (hdma->Init.Mode == DMA_NORMAL)
7146     {
7147       TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY);
7148       TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY);
7149     }
7150   }
7151   else if (hdma == htim->hdma[TIM_DMA_ID_CC3])
7152   {
7153     htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3;
7154 
7155     if (hdma->Init.Mode == DMA_NORMAL)
7156     {
7157       TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY);
7158       TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY);
7159     }
7160   }
7161   else if (hdma == htim->hdma[TIM_DMA_ID_CC4])
7162   {
7163     htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4;
7164 
7165     if (hdma->Init.Mode == DMA_NORMAL)
7166     {
7167       TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_4, HAL_TIM_CHANNEL_STATE_READY);
7168       TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_4, HAL_TIM_CHANNEL_STATE_READY);
7169     }
7170   }
7171   else
7172   {
7173     /* nothing to do */
7174   }
7175 
7176 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
7177   htim->IC_CaptureCallback(htim);
7178 #else
7179   HAL_TIM_IC_CaptureCallback(htim);
7180 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
7181 
7182   htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;
7183 }
7184 
7185 /**
7186   * @brief  TIM DMA Capture half complete callback.
7187   * @param  hdma pointer to DMA handle.
7188   * @retval None
7189   */
TIM_DMACaptureHalfCplt(DMA_HandleTypeDef * hdma)7190 void TIM_DMACaptureHalfCplt(DMA_HandleTypeDef *hdma)
7191 {
7192   TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
7193 
7194   if (hdma == htim->hdma[TIM_DMA_ID_CC1])
7195   {
7196     htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1;
7197   }
7198   else if (hdma == htim->hdma[TIM_DMA_ID_CC2])
7199   {
7200     htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2;
7201   }
7202   else if (hdma == htim->hdma[TIM_DMA_ID_CC3])
7203   {
7204     htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3;
7205   }
7206   else if (hdma == htim->hdma[TIM_DMA_ID_CC4])
7207   {
7208     htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4;
7209   }
7210   else
7211   {
7212     /* nothing to do */
7213   }
7214 
7215 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
7216   htim->IC_CaptureHalfCpltCallback(htim);
7217 #else
7218   HAL_TIM_IC_CaptureHalfCpltCallback(htim);
7219 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
7220 
7221   htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;
7222 }
7223 
7224 /**
7225   * @brief  TIM DMA Period Elapse complete callback.
7226   * @param  hdma pointer to DMA handle.
7227   * @retval None
7228   */
TIM_DMAPeriodElapsedCplt(DMA_HandleTypeDef * hdma)7229 static void TIM_DMAPeriodElapsedCplt(DMA_HandleTypeDef *hdma)
7230 {
7231   TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
7232 
7233   if (htim->hdma[TIM_DMA_ID_UPDATE]->Init.Mode == DMA_NORMAL)
7234   {
7235     htim->State = HAL_TIM_STATE_READY;
7236   }
7237 
7238 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
7239   htim->PeriodElapsedCallback(htim);
7240 #else
7241   HAL_TIM_PeriodElapsedCallback(htim);
7242 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
7243 }
7244 
7245 /**
7246   * @brief  TIM DMA Period Elapse half complete callback.
7247   * @param  hdma pointer to DMA handle.
7248   * @retval None
7249   */
TIM_DMAPeriodElapsedHalfCplt(DMA_HandleTypeDef * hdma)7250 static void TIM_DMAPeriodElapsedHalfCplt(DMA_HandleTypeDef *hdma)
7251 {
7252   TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
7253 
7254 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
7255   htim->PeriodElapsedHalfCpltCallback(htim);
7256 #else
7257   HAL_TIM_PeriodElapsedHalfCpltCallback(htim);
7258 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
7259 }
7260 
7261 /**
7262   * @brief  TIM DMA Trigger callback.
7263   * @param  hdma pointer to DMA handle.
7264   * @retval None
7265   */
TIM_DMATriggerCplt(DMA_HandleTypeDef * hdma)7266 static void TIM_DMATriggerCplt(DMA_HandleTypeDef *hdma)
7267 {
7268   TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
7269 
7270   if (htim->hdma[TIM_DMA_ID_TRIGGER]->Init.Mode == DMA_NORMAL)
7271   {
7272     htim->State = HAL_TIM_STATE_READY;
7273   }
7274 
7275 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
7276   htim->TriggerCallback(htim);
7277 #else
7278   HAL_TIM_TriggerCallback(htim);
7279 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
7280 }
7281 
7282 /**
7283   * @brief  TIM DMA Trigger half complete callback.
7284   * @param  hdma pointer to DMA handle.
7285   * @retval None
7286   */
TIM_DMATriggerHalfCplt(DMA_HandleTypeDef * hdma)7287 static void TIM_DMATriggerHalfCplt(DMA_HandleTypeDef *hdma)
7288 {
7289   TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
7290 
7291 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
7292   htim->TriggerHalfCpltCallback(htim);
7293 #else
7294   HAL_TIM_TriggerHalfCpltCallback(htim);
7295 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
7296 }
7297 
7298 /**
7299   * @brief  Time Base configuration
7300   * @param  TIMx TIM peripheral
7301   * @param  Structure TIM Base configuration structure
7302   * @retval None
7303   */
TIM_Base_SetConfig(TIM_TypeDef * TIMx,const TIM_Base_InitTypeDef * Structure)7304 void TIM_Base_SetConfig(TIM_TypeDef *TIMx, const TIM_Base_InitTypeDef *Structure)
7305 {
7306   uint32_t tmpcr1;
7307   tmpcr1 = TIMx->CR1;
7308 
7309   /* Set TIM Time Base Unit parameters ---------------------------------------*/
7310   if (IS_TIM_COUNTER_MODE_SELECT_INSTANCE(TIMx))
7311   {
7312     /* Select the Counter Mode */
7313     tmpcr1 &= ~(TIM_CR1_DIR | TIM_CR1_CMS);
7314     tmpcr1 |= Structure->CounterMode;
7315   }
7316 
7317   if (IS_TIM_CLOCK_DIVISION_INSTANCE(TIMx))
7318   {
7319     /* Set the clock division */
7320     tmpcr1 &= ~TIM_CR1_CKD;
7321     tmpcr1 |= (uint32_t)Structure->ClockDivision;
7322   }
7323 
7324   /* Set the auto-reload preload */
7325   MODIFY_REG(tmpcr1, TIM_CR1_ARPE, Structure->AutoReloadPreload);
7326 
7327   TIMx->CR1 = tmpcr1;
7328 
7329   /* Set the Autoreload value */
7330   TIMx->ARR = (uint32_t)Structure->Period ;
7331 
7332   /* Set the Prescaler value */
7333   TIMx->PSC = Structure->Prescaler;
7334 
7335   if (IS_TIM_REPETITION_COUNTER_INSTANCE(TIMx))
7336   {
7337     /* Set the Repetition Counter value */
7338     TIMx->RCR = Structure->RepetitionCounter;
7339   }
7340 
7341   /* Generate an update event to reload the Prescaler
7342      and the repetition counter (only for advanced timer) value immediately */
7343   TIMx->EGR = TIM_EGR_UG;
7344 }
7345 
7346 /**
7347   * @brief  Timer Output Compare 1 configuration
7348   * @param  TIMx to select the TIM peripheral
7349   * @param  OC_Config The output configuration structure
7350   * @retval None
7351   */
TIM_OC1_SetConfig(TIM_TypeDef * TIMx,const TIM_OC_InitTypeDef * OC_Config)7352 static void TIM_OC1_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config)
7353 {
7354   uint32_t tmpccmrx;
7355   uint32_t tmpccer;
7356   uint32_t tmpcr2;
7357 
7358   /* Get the TIMx CCER register value */
7359   tmpccer = TIMx->CCER;
7360 
7361   /* Disable the Channel 1: Reset the CC1E Bit */
7362   TIMx->CCER &= ~TIM_CCER_CC1E;
7363 
7364   /* Get the TIMx CR2 register value */
7365   tmpcr2 =  TIMx->CR2;
7366 
7367   /* Get the TIMx CCMR1 register value */
7368   tmpccmrx = TIMx->CCMR1;
7369 
7370   /* Reset the Output Compare Mode Bits */
7371   tmpccmrx &= ~TIM_CCMR1_OC1M;
7372   tmpccmrx &= ~TIM_CCMR1_CC1S;
7373   /* Select the Output Compare Mode */
7374   tmpccmrx |= OC_Config->OCMode;
7375 
7376   /* Reset the Output Polarity level */
7377   tmpccer &= ~TIM_CCER_CC1P;
7378   /* Set the Output Compare Polarity */
7379   tmpccer |= OC_Config->OCPolarity;
7380 
7381   if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_1))
7382   {
7383     /* Check parameters */
7384     assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity));
7385 
7386     /* Reset the Output N Polarity level */
7387     tmpccer &= ~TIM_CCER_CC1NP;
7388     /* Set the Output N Polarity */
7389     tmpccer |= OC_Config->OCNPolarity;
7390     /* Reset the Output N State */
7391     tmpccer &= ~TIM_CCER_CC1NE;
7392   }
7393 
7394   if (IS_TIM_BREAK_INSTANCE(TIMx))
7395   {
7396     /* Check parameters */
7397     assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState));
7398     assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState));
7399 
7400     /* Reset the Output Compare and Output Compare N IDLE State */
7401     tmpcr2 &= ~TIM_CR2_OIS1;
7402     tmpcr2 &= ~TIM_CR2_OIS1N;
7403     /* Set the Output Idle state */
7404     tmpcr2 |= OC_Config->OCIdleState;
7405     /* Set the Output N Idle state */
7406     tmpcr2 |= OC_Config->OCNIdleState;
7407   }
7408 
7409   /* Write to TIMx CR2 */
7410   TIMx->CR2 = tmpcr2;
7411 
7412   /* Write to TIMx CCMR1 */
7413   TIMx->CCMR1 = tmpccmrx;
7414 
7415   /* Set the Capture Compare Register value */
7416   TIMx->CCR1 = OC_Config->Pulse;
7417 
7418   /* Write to TIMx CCER */
7419   TIMx->CCER = tmpccer;
7420 }
7421 
7422 /**
7423   * @brief  Timer Output Compare 2 configuration
7424   * @param  TIMx to select the TIM peripheral
7425   * @param  OC_Config The output configuration structure
7426   * @retval None
7427   */
TIM_OC2_SetConfig(TIM_TypeDef * TIMx,const TIM_OC_InitTypeDef * OC_Config)7428 void TIM_OC2_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config)
7429 {
7430   uint32_t tmpccmrx;
7431   uint32_t tmpccer;
7432   uint32_t tmpcr2;
7433 
7434   /* Get the TIMx CCER register value */
7435   tmpccer = TIMx->CCER;
7436 
7437   /* Disable the Channel 2: Reset the CC2E Bit */
7438   TIMx->CCER &= ~TIM_CCER_CC2E;
7439 
7440   /* Get the TIMx CR2 register value */
7441   tmpcr2 =  TIMx->CR2;
7442 
7443   /* Get the TIMx CCMR1 register value */
7444   tmpccmrx = TIMx->CCMR1;
7445 
7446   /* Reset the Output Compare mode and Capture/Compare selection Bits */
7447   tmpccmrx &= ~TIM_CCMR1_OC2M;
7448   tmpccmrx &= ~TIM_CCMR1_CC2S;
7449 
7450   /* Select the Output Compare Mode */
7451   tmpccmrx |= (OC_Config->OCMode << 8U);
7452 
7453   /* Reset the Output Polarity level */
7454   tmpccer &= ~TIM_CCER_CC2P;
7455   /* Set the Output Compare Polarity */
7456   tmpccer |= (OC_Config->OCPolarity << 4U);
7457 
7458   if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_2))
7459   {
7460     assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity));
7461 
7462     /* Reset the Output N Polarity level */
7463     tmpccer &= ~TIM_CCER_CC2NP;
7464     /* Set the Output N Polarity */
7465     tmpccer |= (OC_Config->OCNPolarity << 4U);
7466     /* Reset the Output N State */
7467     tmpccer &= ~TIM_CCER_CC2NE;
7468 
7469   }
7470 
7471   if (IS_TIM_BREAK_INSTANCE(TIMx))
7472   {
7473     /* Check parameters */
7474     assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState));
7475     assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState));
7476 
7477     /* Reset the Output Compare and Output Compare N IDLE State */
7478     tmpcr2 &= ~TIM_CR2_OIS2;
7479     tmpcr2 &= ~TIM_CR2_OIS2N;
7480     /* Set the Output Idle state */
7481     tmpcr2 |= (OC_Config->OCIdleState << 2U);
7482     /* Set the Output N Idle state */
7483     tmpcr2 |= (OC_Config->OCNIdleState << 2U);
7484   }
7485 
7486   /* Write to TIMx CR2 */
7487   TIMx->CR2 = tmpcr2;
7488 
7489   /* Write to TIMx CCMR1 */
7490   TIMx->CCMR1 = tmpccmrx;
7491 
7492   /* Set the Capture Compare Register value */
7493   TIMx->CCR2 = OC_Config->Pulse;
7494 
7495   /* Write to TIMx CCER */
7496   TIMx->CCER = tmpccer;
7497 }
7498 
7499 /**
7500   * @brief  Timer Output Compare 3 configuration
7501   * @param  TIMx to select the TIM peripheral
7502   * @param  OC_Config The output configuration structure
7503   * @retval None
7504   */
TIM_OC3_SetConfig(TIM_TypeDef * TIMx,const TIM_OC_InitTypeDef * OC_Config)7505 static void TIM_OC3_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config)
7506 {
7507   uint32_t tmpccmrx;
7508   uint32_t tmpccer;
7509   uint32_t tmpcr2;
7510 
7511   /* Get the TIMx CCER register value */
7512   tmpccer = TIMx->CCER;
7513 
7514   /* Disable the Channel 3: Reset the CC2E Bit */
7515   TIMx->CCER &= ~TIM_CCER_CC3E;
7516 
7517   /* Get the TIMx CR2 register value */
7518   tmpcr2 =  TIMx->CR2;
7519 
7520   /* Get the TIMx CCMR2 register value */
7521   tmpccmrx = TIMx->CCMR2;
7522 
7523   /* Reset the Output Compare mode and Capture/Compare selection Bits */
7524   tmpccmrx &= ~TIM_CCMR2_OC3M;
7525   tmpccmrx &= ~TIM_CCMR2_CC3S;
7526   /* Select the Output Compare Mode */
7527   tmpccmrx |= OC_Config->OCMode;
7528 
7529   /* Reset the Output Polarity level */
7530   tmpccer &= ~TIM_CCER_CC3P;
7531   /* Set the Output Compare Polarity */
7532   tmpccer |= (OC_Config->OCPolarity << 8U);
7533 
7534   if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_3))
7535   {
7536     assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity));
7537 
7538     /* Reset the Output N Polarity level */
7539     tmpccer &= ~TIM_CCER_CC3NP;
7540     /* Set the Output N Polarity */
7541     tmpccer |= (OC_Config->OCNPolarity << 8U);
7542     /* Reset the Output N State */
7543     tmpccer &= ~TIM_CCER_CC3NE;
7544   }
7545 
7546   if (IS_TIM_BREAK_INSTANCE(TIMx))
7547   {
7548     /* Check parameters */
7549     assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState));
7550     assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState));
7551 
7552     /* Reset the Output Compare and Output Compare N IDLE State */
7553     tmpcr2 &= ~TIM_CR2_OIS3;
7554     tmpcr2 &= ~TIM_CR2_OIS3N;
7555     /* Set the Output Idle state */
7556     tmpcr2 |= (OC_Config->OCIdleState << 4U);
7557     /* Set the Output N Idle state */
7558     tmpcr2 |= (OC_Config->OCNIdleState << 4U);
7559   }
7560 
7561   /* Write to TIMx CR2 */
7562   TIMx->CR2 = tmpcr2;
7563 
7564   /* Write to TIMx CCMR2 */
7565   TIMx->CCMR2 = tmpccmrx;
7566 
7567   /* Set the Capture Compare Register value */
7568   TIMx->CCR3 = OC_Config->Pulse;
7569 
7570   /* Write to TIMx CCER */
7571   TIMx->CCER = tmpccer;
7572 }
7573 
7574 /**
7575   * @brief  Timer Output Compare 4 configuration
7576   * @param  TIMx to select the TIM peripheral
7577   * @param  OC_Config The output configuration structure
7578   * @retval None
7579   */
TIM_OC4_SetConfig(TIM_TypeDef * TIMx,const TIM_OC_InitTypeDef * OC_Config)7580 static void TIM_OC4_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config)
7581 {
7582   uint32_t tmpccmrx;
7583   uint32_t tmpccer;
7584   uint32_t tmpcr2;
7585 
7586   /* Get the TIMx CCER register value */
7587   tmpccer = TIMx->CCER;
7588 
7589   /* Disable the Channel 4: Reset the CC4E Bit */
7590   TIMx->CCER &= ~TIM_CCER_CC4E;
7591 
7592   /* Get the TIMx CR2 register value */
7593   tmpcr2 =  TIMx->CR2;
7594 
7595   /* Get the TIMx CCMR2 register value */
7596   tmpccmrx = TIMx->CCMR2;
7597 
7598   /* Reset the Output Compare mode and Capture/Compare selection Bits */
7599   tmpccmrx &= ~TIM_CCMR2_OC4M;
7600   tmpccmrx &= ~TIM_CCMR2_CC4S;
7601 
7602   /* Select the Output Compare Mode */
7603   tmpccmrx |= (OC_Config->OCMode << 8U);
7604 
7605   /* Reset the Output Polarity level */
7606   tmpccer &= ~TIM_CCER_CC4P;
7607   /* Set the Output Compare Polarity */
7608   tmpccer |= (OC_Config->OCPolarity << 12U);
7609 
7610   if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_4))
7611   {
7612     assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity));
7613 
7614     /* Reset the Output N Polarity level */
7615     tmpccer &= ~TIM_CCER_CC4NP;
7616     /* Set the Output N Polarity */
7617     tmpccer |= (OC_Config->OCNPolarity << 12U);
7618     /* Reset the Output N State */
7619     tmpccer &= ~TIM_CCER_CC4NE;
7620   }
7621 
7622   if (IS_TIM_BREAK_INSTANCE(TIMx))
7623   {
7624     /* Check parameters */
7625     assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState));
7626     assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState));
7627 
7628     /* Reset the Output Compare IDLE State */
7629     tmpcr2 &= ~TIM_CR2_OIS4;
7630     /* Reset the Output Compare N IDLE State */
7631     tmpcr2 &= ~TIM_CR2_OIS4N;
7632 
7633     /* Set the Output Idle state */
7634     tmpcr2 |= (OC_Config->OCIdleState << 6U);
7635     /* Set the Output N Idle state */
7636     tmpcr2 |= (OC_Config->OCNIdleState << 6U);
7637   }
7638 
7639   /* Write to TIMx CR2 */
7640   TIMx->CR2 = tmpcr2;
7641 
7642   /* Write to TIMx CCMR2 */
7643   TIMx->CCMR2 = tmpccmrx;
7644 
7645   /* Set the Capture Compare Register value */
7646   TIMx->CCR4 = OC_Config->Pulse;
7647 
7648   /* Write to TIMx CCER */
7649   TIMx->CCER = tmpccer;
7650 }
7651 
7652 /**
7653   * @brief  Timer Output Compare 5 configuration
7654   * @param  TIMx to select the TIM peripheral
7655   * @param  OC_Config The output configuration structure
7656   * @retval None
7657   */
TIM_OC5_SetConfig(TIM_TypeDef * TIMx,const TIM_OC_InitTypeDef * OC_Config)7658 static void TIM_OC5_SetConfig(TIM_TypeDef *TIMx,
7659                               const TIM_OC_InitTypeDef *OC_Config)
7660 {
7661   uint32_t tmpccmrx;
7662   uint32_t tmpccer;
7663   uint32_t tmpcr2;
7664 
7665   /* Get the TIMx CCER register value */
7666   tmpccer = TIMx->CCER;
7667 
7668   /* Disable the output: Reset the CCxE Bit */
7669   TIMx->CCER &= ~TIM_CCER_CC5E;
7670 
7671   /* Get the TIMx CR2 register value */
7672   tmpcr2 =  TIMx->CR2;
7673   /* Get the TIMx CCMR1 register value */
7674   tmpccmrx = TIMx->CCMR3;
7675 
7676   /* Reset the Output Compare Mode Bits */
7677   tmpccmrx &= ~(TIM_CCMR3_OC5M);
7678   /* Select the Output Compare Mode */
7679   tmpccmrx |= OC_Config->OCMode;
7680 
7681   /* Reset the Output Polarity level */
7682   tmpccer &= ~TIM_CCER_CC5P;
7683   /* Set the Output Compare Polarity */
7684   tmpccer |= (OC_Config->OCPolarity << 16U);
7685 
7686   if (IS_TIM_BREAK_INSTANCE(TIMx))
7687   {
7688     /* Reset the Output Compare IDLE State */
7689     tmpcr2 &= ~TIM_CR2_OIS5;
7690     /* Set the Output Idle state */
7691     tmpcr2 |= (OC_Config->OCIdleState << 8U);
7692   }
7693   /* Write to TIMx CR2 */
7694   TIMx->CR2 = tmpcr2;
7695 
7696   /* Write to TIMx CCMR3 */
7697   TIMx->CCMR3 = tmpccmrx;
7698 
7699   /* Set the Capture Compare Register value */
7700   TIMx->CCR5 = OC_Config->Pulse;
7701 
7702   /* Write to TIMx CCER */
7703   TIMx->CCER = tmpccer;
7704 }
7705 
7706 /**
7707   * @brief  Timer Output Compare 6 configuration
7708   * @param  TIMx to select the TIM peripheral
7709   * @param  OC_Config The output configuration structure
7710   * @retval None
7711   */
TIM_OC6_SetConfig(TIM_TypeDef * TIMx,const TIM_OC_InitTypeDef * OC_Config)7712 static void TIM_OC6_SetConfig(TIM_TypeDef *TIMx,
7713                               const TIM_OC_InitTypeDef *OC_Config)
7714 {
7715   uint32_t tmpccmrx;
7716   uint32_t tmpccer;
7717   uint32_t tmpcr2;
7718 
7719   /* Get the TIMx CCER register value */
7720   tmpccer = TIMx->CCER;
7721 
7722   /* Disable the output: Reset the CCxE Bit */
7723   TIMx->CCER &= ~TIM_CCER_CC6E;
7724 
7725   /* Get the TIMx CR2 register value */
7726   tmpcr2 =  TIMx->CR2;
7727   /* Get the TIMx CCMR1 register value */
7728   tmpccmrx = TIMx->CCMR3;
7729 
7730   /* Reset the Output Compare Mode Bits */
7731   tmpccmrx &= ~(TIM_CCMR3_OC6M);
7732   /* Select the Output Compare Mode */
7733   tmpccmrx |= (OC_Config->OCMode << 8U);
7734 
7735   /* Reset the Output Polarity level */
7736   tmpccer &= (uint32_t)~TIM_CCER_CC6P;
7737   /* Set the Output Compare Polarity */
7738   tmpccer |= (OC_Config->OCPolarity << 20U);
7739 
7740   if (IS_TIM_BREAK_INSTANCE(TIMx))
7741   {
7742     /* Reset the Output Compare IDLE State */
7743     tmpcr2 &= ~TIM_CR2_OIS6;
7744     /* Set the Output Idle state */
7745     tmpcr2 |= (OC_Config->OCIdleState << 10U);
7746   }
7747 
7748   /* Write to TIMx CR2 */
7749   TIMx->CR2 = tmpcr2;
7750 
7751   /* Write to TIMx CCMR3 */
7752   TIMx->CCMR3 = tmpccmrx;
7753 
7754   /* Set the Capture Compare Register value */
7755   TIMx->CCR6 = OC_Config->Pulse;
7756 
7757   /* Write to TIMx CCER */
7758   TIMx->CCER = tmpccer;
7759 }
7760 
7761 /**
7762   * @brief  Slave Timer configuration function
7763   * @param  htim TIM handle
7764   * @param  sSlaveConfig Slave timer configuration
7765   * @retval None
7766   */
TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef * htim,const TIM_SlaveConfigTypeDef * sSlaveConfig)7767 static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim,
7768                                                   const TIM_SlaveConfigTypeDef *sSlaveConfig)
7769 {
7770   HAL_StatusTypeDef status = HAL_OK;
7771   uint32_t tmpsmcr;
7772   uint32_t tmpccmr1;
7773   uint32_t tmpccer;
7774 
7775   /* Get the TIMx SMCR register value */
7776   tmpsmcr = htim->Instance->SMCR;
7777 
7778   /* Reset the Trigger Selection Bits */
7779   tmpsmcr &= ~TIM_SMCR_TS;
7780   /* Set the Input Trigger source */
7781   tmpsmcr |= sSlaveConfig->InputTrigger;
7782 
7783   /* Reset the slave mode Bits */
7784   tmpsmcr &= ~TIM_SMCR_SMS;
7785   /* Set the slave mode */
7786   tmpsmcr |= sSlaveConfig->SlaveMode;
7787 
7788   /* Write to TIMx SMCR */
7789   htim->Instance->SMCR = tmpsmcr;
7790 
7791   /* Configure the trigger prescaler, filter, and polarity */
7792   switch (sSlaveConfig->InputTrigger)
7793   {
7794     case TIM_TS_ETRF:
7795     {
7796       /* Check the parameters */
7797       assert_param(IS_TIM_CLOCKSOURCE_ETRMODE1_INSTANCE(htim->Instance));
7798       assert_param(IS_TIM_TRIGGERPRESCALER(sSlaveConfig->TriggerPrescaler));
7799       assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity));
7800       assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter));
7801       /* Configure the ETR Trigger source */
7802       TIM_ETR_SetConfig(htim->Instance,
7803                         sSlaveConfig->TriggerPrescaler,
7804                         sSlaveConfig->TriggerPolarity,
7805                         sSlaveConfig->TriggerFilter);
7806       break;
7807     }
7808 
7809     case TIM_TS_TI1F_ED:
7810     {
7811       /* Check the parameters */
7812       assert_param(IS_TIM_CC1_INSTANCE(htim->Instance));
7813       assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter));
7814 
7815       if ((sSlaveConfig->SlaveMode == TIM_SLAVEMODE_GATED) || \
7816           (sSlaveConfig->SlaveMode == TIM_SLAVEMODE_COMBINED_GATEDRESET))
7817       {
7818         return HAL_ERROR;
7819       }
7820 
7821       /* Disable the Channel 1: Reset the CC1E Bit */
7822       tmpccer = htim->Instance->CCER;
7823       htim->Instance->CCER &= ~TIM_CCER_CC1E;
7824       tmpccmr1 = htim->Instance->CCMR1;
7825 
7826       /* Set the filter */
7827       tmpccmr1 &= ~TIM_CCMR1_IC1F;
7828       tmpccmr1 |= ((sSlaveConfig->TriggerFilter) << 4U);
7829 
7830       /* Write to TIMx CCMR1 and CCER registers */
7831       htim->Instance->CCMR1 = tmpccmr1;
7832       htim->Instance->CCER = tmpccer;
7833       break;
7834     }
7835 
7836     case TIM_TS_TI1FP1:
7837     {
7838       /* Check the parameters */
7839       assert_param(IS_TIM_CC1_INSTANCE(htim->Instance));
7840       assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity));
7841       assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter));
7842 
7843       /* Configure TI1 Filter and Polarity */
7844       TIM_TI1_ConfigInputStage(htim->Instance,
7845                                sSlaveConfig->TriggerPolarity,
7846                                sSlaveConfig->TriggerFilter);
7847       break;
7848     }
7849 
7850     case TIM_TS_TI2FP2:
7851     {
7852       /* Check the parameters */
7853       assert_param(IS_TIM_CC2_INSTANCE(htim->Instance));
7854       assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity));
7855       assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter));
7856 
7857       /* Configure TI2 Filter and Polarity */
7858       TIM_TI2_ConfigInputStage(htim->Instance,
7859                                sSlaveConfig->TriggerPolarity,
7860                                sSlaveConfig->TriggerFilter);
7861       break;
7862     }
7863 
7864     case TIM_TS_ITR0:
7865     case TIM_TS_ITR1:
7866     case TIM_TS_ITR2:
7867     case TIM_TS_ITR3:
7868     case TIM_TS_ITR4:
7869     case TIM_TS_ITR5:
7870     case TIM_TS_ITR6:
7871     case TIM_TS_ITR7:
7872     case TIM_TS_ITR8:
7873     case TIM_TS_ITR9:
7874     case TIM_TS_ITR10:
7875     case TIM_TS_ITR11:
7876     case TIM_TS_ITR12:
7877     {
7878       /* Check the parameter */
7879       assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_INSTANCE((htim->Instance), sSlaveConfig->InputTrigger));
7880       break;
7881     }
7882 
7883     default:
7884       status = HAL_ERROR;
7885       break;
7886   }
7887 
7888   return status;
7889 }
7890 
7891 /**
7892   * @brief  Configure the TI1 as Input.
7893   * @param  TIMx to select the TIM peripheral.
7894   * @param  TIM_ICPolarity The Input Polarity.
7895   *          This parameter can be one of the following values:
7896   *            @arg TIM_ICPOLARITY_RISING
7897   *            @arg TIM_ICPOLARITY_FALLING
7898   *            @arg TIM_ICPOLARITY_BOTHEDGE
7899   * @param  TIM_ICSelection specifies the input to be used.
7900   *          This parameter can be one of the following values:
7901   *            @arg TIM_ICSELECTION_DIRECTTI: TIM Input 1 is selected to be connected to IC1.
7902   *            @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 1 is selected to be connected to IC2.
7903   *            @arg TIM_ICSELECTION_TRC: TIM Input 1 is selected to be connected to TRC.
7904   * @param  TIM_ICFilter Specifies the Input Capture Filter.
7905   *          This parameter must be a value between 0x00 and 0x0F.
7906   * @retval None
7907   * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI2FP1
7908   *       (on channel2 path) is used as the input signal. Therefore CCMR1 must be
7909   *        protected against un-initialized filter and polarity values.
7910   */
TIM_TI1_SetConfig(TIM_TypeDef * TIMx,uint32_t TIM_ICPolarity,uint32_t TIM_ICSelection,uint32_t TIM_ICFilter)7911 void TIM_TI1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection,
7912                        uint32_t TIM_ICFilter)
7913 {
7914   uint32_t tmpccmr1;
7915   uint32_t tmpccer;
7916 
7917   /* Disable the Channel 1: Reset the CC1E Bit */
7918   tmpccer = TIMx->CCER;
7919   TIMx->CCER &= ~TIM_CCER_CC1E;
7920   tmpccmr1 = TIMx->CCMR1;
7921 
7922   /* Select the Input */
7923   if (IS_TIM_CC2_INSTANCE(TIMx) != RESET)
7924   {
7925     tmpccmr1 &= ~TIM_CCMR1_CC1S;
7926     tmpccmr1 |= TIM_ICSelection;
7927   }
7928   else
7929   {
7930     tmpccmr1 |= TIM_CCMR1_CC1S_0;
7931   }
7932 
7933   /* Set the filter */
7934   tmpccmr1 &= ~TIM_CCMR1_IC1F;
7935   tmpccmr1 |= ((TIM_ICFilter << 4U) & TIM_CCMR1_IC1F);
7936 
7937   /* Select the Polarity and set the CC1E Bit */
7938   tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP);
7939   tmpccer |= (TIM_ICPolarity & (TIM_CCER_CC1P | TIM_CCER_CC1NP));
7940 
7941   /* Write to TIMx CCMR1 and CCER registers */
7942   TIMx->CCMR1 = tmpccmr1;
7943   TIMx->CCER = tmpccer;
7944 }
7945 
7946 /**
7947   * @brief  Configure the Polarity and Filter for TI1.
7948   * @param  TIMx to select the TIM peripheral.
7949   * @param  TIM_ICPolarity The Input Polarity.
7950   *          This parameter can be one of the following values:
7951   *            @arg TIM_ICPOLARITY_RISING
7952   *            @arg TIM_ICPOLARITY_FALLING
7953   *            @arg TIM_ICPOLARITY_BOTHEDGE
7954   * @param  TIM_ICFilter Specifies the Input Capture Filter.
7955   *          This parameter must be a value between 0x00 and 0x0F.
7956   * @retval None
7957   */
TIM_TI1_ConfigInputStage(TIM_TypeDef * TIMx,uint32_t TIM_ICPolarity,uint32_t TIM_ICFilter)7958 static void TIM_TI1_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter)
7959 {
7960   uint32_t tmpccmr1;
7961   uint32_t tmpccer;
7962 
7963   /* Disable the Channel 1: Reset the CC1E Bit */
7964   tmpccer = TIMx->CCER;
7965   TIMx->CCER &= ~TIM_CCER_CC1E;
7966   tmpccmr1 = TIMx->CCMR1;
7967 
7968   /* Set the filter */
7969   tmpccmr1 &= ~TIM_CCMR1_IC1F;
7970   tmpccmr1 |= (TIM_ICFilter << 4U);
7971 
7972   /* Select the Polarity and set the CC1E Bit */
7973   tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP);
7974   tmpccer |= TIM_ICPolarity;
7975 
7976   /* Write to TIMx CCMR1 and CCER registers */
7977   TIMx->CCMR1 = tmpccmr1;
7978   TIMx->CCER = tmpccer;
7979 }
7980 
7981 /**
7982   * @brief  Configure the TI2 as Input.
7983   * @param  TIMx to select the TIM peripheral
7984   * @param  TIM_ICPolarity The Input Polarity.
7985   *          This parameter can be one of the following values:
7986   *            @arg TIM_ICPOLARITY_RISING
7987   *            @arg TIM_ICPOLARITY_FALLING
7988   *            @arg TIM_ICPOLARITY_BOTHEDGE
7989   * @param  TIM_ICSelection specifies the input to be used.
7990   *          This parameter can be one of the following values:
7991   *            @arg TIM_ICSELECTION_DIRECTTI: TIM Input 2 is selected to be connected to IC2.
7992   *            @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 2 is selected to be connected to IC1.
7993   *            @arg TIM_ICSELECTION_TRC: TIM Input 2 is selected to be connected to TRC.
7994   * @param  TIM_ICFilter Specifies the Input Capture Filter.
7995   *          This parameter must be a value between 0x00 and 0x0F.
7996   * @retval None
7997   * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI1FP2
7998   *       (on channel1 path) is used as the input signal. Therefore CCMR1 must be
7999   *        protected against un-initialized filter and polarity values.
8000   */
TIM_TI2_SetConfig(TIM_TypeDef * TIMx,uint32_t TIM_ICPolarity,uint32_t TIM_ICSelection,uint32_t TIM_ICFilter)8001 static void TIM_TI2_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection,
8002                               uint32_t TIM_ICFilter)
8003 {
8004   uint32_t tmpccmr1;
8005   uint32_t tmpccer;
8006 
8007   /* Disable the Channel 2: Reset the CC2E Bit */
8008   tmpccer = TIMx->CCER;
8009   TIMx->CCER &= ~TIM_CCER_CC2E;
8010   tmpccmr1 = TIMx->CCMR1;
8011 
8012   /* Select the Input */
8013   tmpccmr1 &= ~TIM_CCMR1_CC2S;
8014   tmpccmr1 |= (TIM_ICSelection << 8U);
8015 
8016   /* Set the filter */
8017   tmpccmr1 &= ~TIM_CCMR1_IC2F;
8018   tmpccmr1 |= ((TIM_ICFilter << 12U) & TIM_CCMR1_IC2F);
8019 
8020   /* Select the Polarity and set the CC2E Bit */
8021   tmpccer &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP);
8022   tmpccer |= ((TIM_ICPolarity << 4U) & (TIM_CCER_CC2P | TIM_CCER_CC2NP));
8023 
8024   /* Write to TIMx CCMR1 and CCER registers */
8025   TIMx->CCMR1 = tmpccmr1 ;
8026   TIMx->CCER = tmpccer;
8027 }
8028 
8029 /**
8030   * @brief  Configure the Polarity and Filter for TI2.
8031   * @param  TIMx to select the TIM peripheral.
8032   * @param  TIM_ICPolarity The Input Polarity.
8033   *          This parameter can be one of the following values:
8034   *            @arg TIM_ICPOLARITY_RISING
8035   *            @arg TIM_ICPOLARITY_FALLING
8036   *            @arg TIM_ICPOLARITY_BOTHEDGE
8037   * @param  TIM_ICFilter Specifies the Input Capture Filter.
8038   *          This parameter must be a value between 0x00 and 0x0F.
8039   * @retval None
8040   */
TIM_TI2_ConfigInputStage(TIM_TypeDef * TIMx,uint32_t TIM_ICPolarity,uint32_t TIM_ICFilter)8041 static void TIM_TI2_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter)
8042 {
8043   uint32_t tmpccmr1;
8044   uint32_t tmpccer;
8045 
8046   /* Disable the Channel 2: Reset the CC2E Bit */
8047   tmpccer = TIMx->CCER;
8048   TIMx->CCER &= ~TIM_CCER_CC2E;
8049   tmpccmr1 = TIMx->CCMR1;
8050 
8051   /* Set the filter */
8052   tmpccmr1 &= ~TIM_CCMR1_IC2F;
8053   tmpccmr1 |= (TIM_ICFilter << 12U);
8054 
8055   /* Select the Polarity and set the CC2E Bit */
8056   tmpccer &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP);
8057   tmpccer |= (TIM_ICPolarity << 4U);
8058 
8059   /* Write to TIMx CCMR1 and CCER registers */
8060   TIMx->CCMR1 = tmpccmr1 ;
8061   TIMx->CCER = tmpccer;
8062 }
8063 
8064 /**
8065   * @brief  Configure the TI3 as Input.
8066   * @param  TIMx to select the TIM peripheral
8067   * @param  TIM_ICPolarity The Input Polarity.
8068   *          This parameter can be one of the following values:
8069   *            @arg TIM_ICPOLARITY_RISING
8070   *            @arg TIM_ICPOLARITY_FALLING
8071   *            @arg TIM_ICPOLARITY_BOTHEDGE
8072   * @param  TIM_ICSelection specifies the input to be used.
8073   *          This parameter can be one of the following values:
8074   *            @arg TIM_ICSELECTION_DIRECTTI: TIM Input 3 is selected to be connected to IC3.
8075   *            @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 3 is selected to be connected to IC4.
8076   *            @arg TIM_ICSELECTION_TRC: TIM Input 3 is selected to be connected to TRC.
8077   * @param  TIM_ICFilter Specifies the Input Capture Filter.
8078   *          This parameter must be a value between 0x00 and 0x0F.
8079   * @retval None
8080   * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI3FP4
8081   *       (on channel1 path) is used as the input signal. Therefore CCMR2 must be
8082   *        protected against un-initialized filter and polarity values.
8083   */
TIM_TI3_SetConfig(TIM_TypeDef * TIMx,uint32_t TIM_ICPolarity,uint32_t TIM_ICSelection,uint32_t TIM_ICFilter)8084 static void TIM_TI3_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection,
8085                               uint32_t TIM_ICFilter)
8086 {
8087   uint32_t tmpccmr2;
8088   uint32_t tmpccer;
8089 
8090   /* Disable the Channel 3: Reset the CC3E Bit */
8091   tmpccer = TIMx->CCER;
8092   TIMx->CCER &= ~TIM_CCER_CC3E;
8093   tmpccmr2 = TIMx->CCMR2;
8094 
8095   /* Select the Input */
8096   tmpccmr2 &= ~TIM_CCMR2_CC3S;
8097   tmpccmr2 |= TIM_ICSelection;
8098 
8099   /* Set the filter */
8100   tmpccmr2 &= ~TIM_CCMR2_IC3F;
8101   tmpccmr2 |= ((TIM_ICFilter << 4U) & TIM_CCMR2_IC3F);
8102 
8103   /* Select the Polarity and set the CC3E Bit */
8104   tmpccer &= ~(TIM_CCER_CC3P | TIM_CCER_CC3NP);
8105   tmpccer |= ((TIM_ICPolarity << 8U) & (TIM_CCER_CC3P | TIM_CCER_CC3NP));
8106 
8107   /* Write to TIMx CCMR2 and CCER registers */
8108   TIMx->CCMR2 = tmpccmr2;
8109   TIMx->CCER = tmpccer;
8110 }
8111 
8112 /**
8113   * @brief  Configure the TI4 as Input.
8114   * @param  TIMx to select the TIM peripheral
8115   * @param  TIM_ICPolarity The Input Polarity.
8116   *          This parameter can be one of the following values:
8117   *            @arg TIM_ICPOLARITY_RISING
8118   *            @arg TIM_ICPOLARITY_FALLING
8119   *            @arg TIM_ICPOLARITY_BOTHEDGE
8120   * @param  TIM_ICSelection specifies the input to be used.
8121   *          This parameter can be one of the following values:
8122   *            @arg TIM_ICSELECTION_DIRECTTI: TIM Input 4 is selected to be connected to IC4.
8123   *            @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 4 is selected to be connected to IC3.
8124   *            @arg TIM_ICSELECTION_TRC: TIM Input 4 is selected to be connected to TRC.
8125   * @param  TIM_ICFilter Specifies the Input Capture Filter.
8126   *          This parameter must be a value between 0x00 and 0x0F.
8127   * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI4FP3
8128   *       (on channel1 path) is used as the input signal. Therefore CCMR2 must be
8129   *        protected against un-initialized filter and polarity values.
8130   * @retval None
8131   */
TIM_TI4_SetConfig(TIM_TypeDef * TIMx,uint32_t TIM_ICPolarity,uint32_t TIM_ICSelection,uint32_t TIM_ICFilter)8132 static void TIM_TI4_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection,
8133                               uint32_t TIM_ICFilter)
8134 {
8135   uint32_t tmpccmr2;
8136   uint32_t tmpccer;
8137 
8138   /* Disable the Channel 4: Reset the CC4E Bit */
8139   tmpccer = TIMx->CCER;
8140   TIMx->CCER &= ~TIM_CCER_CC4E;
8141   tmpccmr2 = TIMx->CCMR2;
8142 
8143   /* Select the Input */
8144   tmpccmr2 &= ~TIM_CCMR2_CC4S;
8145   tmpccmr2 |= (TIM_ICSelection << 8U);
8146 
8147   /* Set the filter */
8148   tmpccmr2 &= ~TIM_CCMR2_IC4F;
8149   tmpccmr2 |= ((TIM_ICFilter << 12U) & TIM_CCMR2_IC4F);
8150 
8151   /* Select the Polarity and set the CC4E Bit */
8152   tmpccer &= ~(TIM_CCER_CC4P | TIM_CCER_CC4NP);
8153   tmpccer |= ((TIM_ICPolarity << 12U) & (TIM_CCER_CC4P | TIM_CCER_CC4NP));
8154 
8155   /* Write to TIMx CCMR2 and CCER registers */
8156   TIMx->CCMR2 = tmpccmr2;
8157   TIMx->CCER = tmpccer ;
8158 }
8159 
8160 /**
8161   * @brief  Selects the Input Trigger source
8162   * @param  TIMx to select the TIM peripheral
8163   * @param  InputTriggerSource The Input Trigger source.
8164   *          This parameter can be one of the following values:
8165   *            @arg TIM_TS_ITR0: Internal Trigger 0
8166   *            @arg TIM_TS_ITR1: Internal Trigger 1
8167   *            @arg TIM_TS_ITR2: Internal Trigger 2
8168   *            @arg TIM_TS_ITR3: Internal Trigger 3
8169   *            @arg TIM_TS_ITR4: Internal Trigger 4
8170   *            @arg TIM_TS_ITR5: Internal Trigger 5
8171   *            @arg TIM_TS_ITR6: Internal Trigger 6
8172   *            @arg TIM_TS_ITR7: Internal Trigger 7
8173   *            @arg TIM_TS_ITR8: Internal Trigger 8
8174   *            @arg TIM_TS_ITR9: Internal Trigger 9
8175   *            @arg TIM_TS_ITR10: Internal Trigger 10
8176   *            @arg TIM_TS_ITR11: Internal Trigger 11
8177   *            @arg TIM_TS_ITR12: Internal Trigger 12
8178   *            @arg TIM_TS_TI1F_ED: TI1 Edge Detector
8179   *            @arg TIM_TS_TI1FP1: Filtered Timer Input 1
8180   *            @arg TIM_TS_TI2FP2: Filtered Timer Input 2
8181   *            @arg TIM_TS_ETRF: External Trigger input
8182   * @retval None
8183   */
TIM_ITRx_SetConfig(TIM_TypeDef * TIMx,uint32_t InputTriggerSource)8184 static void TIM_ITRx_SetConfig(TIM_TypeDef *TIMx, uint32_t InputTriggerSource)
8185 {
8186   uint32_t tmpsmcr;
8187 
8188   /* Get the TIMx SMCR register value */
8189   tmpsmcr = TIMx->SMCR;
8190   /* Reset the TS Bits */
8191   tmpsmcr &= ~TIM_SMCR_TS;
8192   /* Set the Input Trigger source and the slave mode*/
8193   tmpsmcr |= (InputTriggerSource | TIM_SLAVEMODE_EXTERNAL1);
8194   /* Write to TIMx SMCR */
8195   TIMx->SMCR = tmpsmcr;
8196 }
8197 /**
8198   * @brief  Configures the TIMx External Trigger (ETR).
8199   * @param  TIMx to select the TIM peripheral
8200   * @param  TIM_ExtTRGPrescaler The external Trigger Prescaler.
8201   *          This parameter can be one of the following values:
8202   *            @arg TIM_ETRPRESCALER_DIV1: ETRP Prescaler OFF.
8203   *            @arg TIM_ETRPRESCALER_DIV2: ETRP frequency divided by 2.
8204   *            @arg TIM_ETRPRESCALER_DIV4: ETRP frequency divided by 4.
8205   *            @arg TIM_ETRPRESCALER_DIV8: ETRP frequency divided by 8.
8206   * @param  TIM_ExtTRGPolarity The external Trigger Polarity.
8207   *          This parameter can be one of the following values:
8208   *            @arg TIM_ETRPOLARITY_INVERTED: active low or falling edge active.
8209   *            @arg TIM_ETRPOLARITY_NONINVERTED: active high or rising edge active.
8210   * @param  ExtTRGFilter External Trigger Filter.
8211   *          This parameter must be a value between 0x00 and 0x0F
8212   * @retval None
8213   */
TIM_ETR_SetConfig(TIM_TypeDef * TIMx,uint32_t TIM_ExtTRGPrescaler,uint32_t TIM_ExtTRGPolarity,uint32_t ExtTRGFilter)8214 void TIM_ETR_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ExtTRGPrescaler,
8215                        uint32_t TIM_ExtTRGPolarity, uint32_t ExtTRGFilter)
8216 {
8217   uint32_t tmpsmcr;
8218 
8219   tmpsmcr = TIMx->SMCR;
8220 
8221   /* Reset the ETR Bits */
8222   tmpsmcr &= ~(TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP);
8223 
8224   /* Set the Prescaler, the Filter value and the Polarity */
8225   tmpsmcr |= (uint32_t)(TIM_ExtTRGPrescaler | (TIM_ExtTRGPolarity | (ExtTRGFilter << 8U)));
8226 
8227   /* Write to TIMx SMCR */
8228   TIMx->SMCR = tmpsmcr;
8229 }
8230 
8231 /**
8232   * @brief  Enables or disables the TIM Capture Compare Channel x.
8233   * @param  TIMx to select the TIM peripheral
8234   * @param  Channel specifies the TIM Channel
8235   *          This parameter can be one of the following values:
8236   *            @arg TIM_CHANNEL_1: TIM Channel 1
8237   *            @arg TIM_CHANNEL_2: TIM Channel 2
8238   *            @arg TIM_CHANNEL_3: TIM Channel 3
8239   *            @arg TIM_CHANNEL_4: TIM Channel 4
8240   *            @arg TIM_CHANNEL_5: TIM Channel 5 selected
8241   *            @arg TIM_CHANNEL_6: TIM Channel 6 selected
8242   * @param  ChannelState specifies the TIM Channel CCxE bit new state.
8243   *          This parameter can be: TIM_CCx_ENABLE or TIM_CCx_DISABLE.
8244   * @retval None
8245   */
TIM_CCxChannelCmd(TIM_TypeDef * TIMx,uint32_t Channel,uint32_t ChannelState)8246 void TIM_CCxChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelState)
8247 {
8248   uint32_t tmp;
8249 
8250   /* Check the parameters */
8251   assert_param(IS_TIM_CC1_INSTANCE(TIMx));
8252   assert_param(IS_TIM_CHANNELS(Channel));
8253 
8254   tmp = TIM_CCER_CC1E << (Channel & 0x1FU); /* 0x1FU = 31 bits max shift */
8255 
8256   /* Reset the CCxE Bit */
8257   TIMx->CCER &= ~tmp;
8258 
8259   /* Set or reset the CCxE Bit */
8260   TIMx->CCER |= (uint32_t)(ChannelState << (Channel & 0x1FU)); /* 0x1FU = 31 bits max shift */
8261 }
8262 
8263 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
8264 /**
8265   * @brief  Reset interrupt callbacks to the legacy weak callbacks.
8266   * @param  htim pointer to a TIM_HandleTypeDef structure that contains
8267   *                the configuration information for TIM module.
8268   * @retval None
8269   */
TIM_ResetCallback(TIM_HandleTypeDef * htim)8270 void TIM_ResetCallback(TIM_HandleTypeDef *htim)
8271 {
8272   /* Reset the TIM callback to the legacy weak callbacks */
8273   htim->PeriodElapsedCallback             = HAL_TIM_PeriodElapsedCallback;
8274   htim->PeriodElapsedHalfCpltCallback     = HAL_TIM_PeriodElapsedHalfCpltCallback;
8275   htim->TriggerCallback                   = HAL_TIM_TriggerCallback;
8276   htim->TriggerHalfCpltCallback           = HAL_TIM_TriggerHalfCpltCallback;
8277   htim->IC_CaptureCallback                = HAL_TIM_IC_CaptureCallback;
8278   htim->IC_CaptureHalfCpltCallback        = HAL_TIM_IC_CaptureHalfCpltCallback;
8279   htim->OC_DelayElapsedCallback           = HAL_TIM_OC_DelayElapsedCallback;
8280   htim->PWM_PulseFinishedCallback         = HAL_TIM_PWM_PulseFinishedCallback;
8281   htim->PWM_PulseFinishedHalfCpltCallback = HAL_TIM_PWM_PulseFinishedHalfCpltCallback;
8282   htim->ErrorCallback                     = HAL_TIM_ErrorCallback;
8283   htim->CommutationCallback               = HAL_TIMEx_CommutCallback;
8284   htim->CommutationHalfCpltCallback       = HAL_TIMEx_CommutHalfCpltCallback;
8285   htim->BreakCallback                     = HAL_TIMEx_BreakCallback;
8286   htim->Break2Callback                    = HAL_TIMEx_Break2Callback;
8287   htim->EncoderIndexCallback              = HAL_TIMEx_EncoderIndexCallback;
8288   htim->DirectionChangeCallback           = HAL_TIMEx_DirectionChangeCallback;
8289   htim->IndexErrorCallback                = HAL_TIMEx_IndexErrorCallback;
8290   htim->TransitionErrorCallback           = HAL_TIMEx_TransitionErrorCallback;
8291 }
8292 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
8293 
8294 /**
8295   * @}
8296   */
8297 
8298 #endif /* HAL_TIM_MODULE_ENABLED */
8299 /**
8300   * @}
8301   */
8302 
8303 /**
8304   * @}
8305   */
8306