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