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