1 /**
2 ******************************************************************************
3 * @file stm32g4xx_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) 2019 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 "stm32g4xx_hal.h"
192
193 /** @addtogroup STM32G4xx_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 (HAL_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 (HAL_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 (HAL_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 (HAL_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 (HAL_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 (HAL_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 (HAL_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 (HAL_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 (HAL_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 (HAL_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 (HAL_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 (HAL_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 (HAL_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 (HAL_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 (HAL_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 (HAL_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 (HAL_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_OR
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;
4642
4643 status = HAL_TIM_DMABurst_MultiWriteStart(htim, BurstBaseAddress, BurstRequestSrc, BurstBuffer, BurstLength,
4644 ((BurstLength) >> 8U) + 1U);
4645
4646
4647
4648 return status;
4649 }
4650
4651 /**
4652 * @brief Configure the DMA Burst to transfer multiple Data from the memory to the TIM peripheral
4653 * @param htim TIM handle
4654 * @param BurstBaseAddress TIM Base address from where the DMA will start the Data write
4655 * This parameter can be one of the following values:
4656 * @arg TIM_DMABASE_CR1
4657 * @arg TIM_DMABASE_CR2
4658 * @arg TIM_DMABASE_SMCR
4659 * @arg TIM_DMABASE_DIER
4660 * @arg TIM_DMABASE_SR
4661 * @arg TIM_DMABASE_EGR
4662 * @arg TIM_DMABASE_CCMR1
4663 * @arg TIM_DMABASE_CCMR2
4664 * @arg TIM_DMABASE_CCER
4665 * @arg TIM_DMABASE_CNT
4666 * @arg TIM_DMABASE_PSC
4667 * @arg TIM_DMABASE_ARR
4668 * @arg TIM_DMABASE_RCR
4669 * @arg TIM_DMABASE_CCR1
4670 * @arg TIM_DMABASE_CCR2
4671 * @arg TIM_DMABASE_CCR3
4672 * @arg TIM_DMABASE_CCR4
4673 * @arg TIM_DMABASE_BDTR
4674 * @arg TIM_DMABASE_CCMR3
4675 * @arg TIM_DMABASE_CCR5
4676 * @arg TIM_DMABASE_CCR6
4677 * @arg TIM_DMABASE_DTR2
4678 * @arg TIM_DMABASE_ECR
4679 * @arg TIM_DMABASE_TISEL
4680 * @arg TIM_DMABASE_AF1
4681 * @arg TIM_DMABASE_AF2
4682 * @arg TIM_DMABASE_OR
4683 * @param BurstRequestSrc TIM DMA Request sources
4684 * This parameter can be one of the following values:
4685 * @arg TIM_DMA_UPDATE: TIM update Interrupt source
4686 * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source
4687 * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source
4688 * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source
4689 * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source
4690 * @arg TIM_DMA_COM: TIM Commutation DMA source
4691 * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source
4692 * @param BurstBuffer The Buffer address.
4693 * @param BurstLength DMA Burst length. This parameter can be one value
4694 * between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_26TRANSFER.
4695 * @param DataLength Data length. This parameter can be one value
4696 * between 1 and 0xFFFF.
4697 * @retval HAL status
4698 */
HAL_TIM_DMABurst_MultiWriteStart(TIM_HandleTypeDef * htim,uint32_t BurstBaseAddress,uint32_t BurstRequestSrc,const uint32_t * BurstBuffer,uint32_t BurstLength,uint32_t DataLength)4699 HAL_StatusTypeDef HAL_TIM_DMABurst_MultiWriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress,
4700 uint32_t BurstRequestSrc, const uint32_t *BurstBuffer,
4701 uint32_t BurstLength, uint32_t DataLength)
4702 {
4703 HAL_StatusTypeDef status = HAL_OK;
4704
4705 /* Check the parameters */
4706 assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance));
4707 assert_param(IS_TIM_DMA_BASE(BurstBaseAddress));
4708 assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc));
4709 assert_param(IS_TIM_DMA_LENGTH(BurstLength));
4710 assert_param(IS_TIM_DMA_DATA_LENGTH(DataLength));
4711
4712 if (htim->DMABurstState == HAL_DMA_BURST_STATE_BUSY)
4713 {
4714 return HAL_BUSY;
4715 }
4716 else if (htim->DMABurstState == HAL_DMA_BURST_STATE_READY)
4717 {
4718 if ((BurstBuffer == NULL) && (BurstLength > 0U))
4719 {
4720 return HAL_ERROR;
4721 }
4722 else
4723 {
4724 htim->DMABurstState = HAL_DMA_BURST_STATE_BUSY;
4725 }
4726 }
4727 else
4728 {
4729 /* nothing to do */
4730 }
4731
4732 switch (BurstRequestSrc)
4733 {
4734 case TIM_DMA_UPDATE:
4735 {
4736 /* Set the DMA Period elapsed callbacks */
4737 htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt;
4738 htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt;
4739
4740 /* Set the DMA error callback */
4741 htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ;
4742
4743 /* Enable the DMA channel */
4744 if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)BurstBuffer,
4745 (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK)
4746 {
4747 /* Return error status */
4748 return HAL_ERROR;
4749 }
4750 break;
4751 }
4752 case TIM_DMA_CC1:
4753 {
4754 /* Set the DMA compare callbacks */
4755 htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt;
4756 htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;
4757
4758 /* Set the DMA error callback */
4759 htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ;
4760
4761 /* Enable the DMA channel */
4762 if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)BurstBuffer,
4763 (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK)
4764 {
4765 /* Return error status */
4766 return HAL_ERROR;
4767 }
4768 break;
4769 }
4770 case TIM_DMA_CC2:
4771 {
4772 /* Set the DMA compare callbacks */
4773 htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt;
4774 htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;
4775
4776 /* Set the DMA error callback */
4777 htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ;
4778
4779 /* Enable the DMA channel */
4780 if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)BurstBuffer,
4781 (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK)
4782 {
4783 /* Return error status */
4784 return HAL_ERROR;
4785 }
4786 break;
4787 }
4788 case TIM_DMA_CC3:
4789 {
4790 /* Set the DMA compare callbacks */
4791 htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt;
4792 htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;
4793
4794 /* Set the DMA error callback */
4795 htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ;
4796
4797 /* Enable the DMA channel */
4798 if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)BurstBuffer,
4799 (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK)
4800 {
4801 /* Return error status */
4802 return HAL_ERROR;
4803 }
4804 break;
4805 }
4806 case TIM_DMA_CC4:
4807 {
4808 /* Set the DMA compare callbacks */
4809 htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt;
4810 htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;
4811
4812 /* Set the DMA error callback */
4813 htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ;
4814
4815 /* Enable the DMA channel */
4816 if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)BurstBuffer,
4817 (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK)
4818 {
4819 /* Return error status */
4820 return HAL_ERROR;
4821 }
4822 break;
4823 }
4824 case TIM_DMA_COM:
4825 {
4826 /* Set the DMA commutation callbacks */
4827 htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt;
4828 htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback = TIMEx_DMACommutationHalfCplt;
4829
4830 /* Set the DMA error callback */
4831 htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError ;
4832
4833 /* Enable the DMA channel */
4834 if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)BurstBuffer,
4835 (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK)
4836 {
4837 /* Return error status */
4838 return HAL_ERROR;
4839 }
4840 break;
4841 }
4842 case TIM_DMA_TRIGGER:
4843 {
4844 /* Set the DMA trigger callbacks */
4845 htim->hdma[TIM_DMA_ID_TRIGGER]->XferCpltCallback = TIM_DMATriggerCplt;
4846 htim->hdma[TIM_DMA_ID_TRIGGER]->XferHalfCpltCallback = TIM_DMATriggerHalfCplt;
4847
4848 /* Set the DMA error callback */
4849 htim->hdma[TIM_DMA_ID_TRIGGER]->XferErrorCallback = TIM_DMAError ;
4850
4851 /* Enable the DMA channel */
4852 if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)BurstBuffer,
4853 (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK)
4854 {
4855 /* Return error status */
4856 return HAL_ERROR;
4857 }
4858 break;
4859 }
4860 default:
4861 status = HAL_ERROR;
4862 break;
4863 }
4864
4865 if (status == HAL_OK)
4866 {
4867 /* Configure the DMA Burst Mode */
4868 htim->Instance->DCR = (BurstBaseAddress | BurstLength);
4869 /* Enable the TIM DMA Request */
4870 __HAL_TIM_ENABLE_DMA(htim, BurstRequestSrc);
4871 }
4872
4873 /* Return function status */
4874 return status;
4875 }
4876
4877 /**
4878 * @brief Stops the TIM DMA Burst mode
4879 * @param htim TIM handle
4880 * @param BurstRequestSrc TIM DMA Request sources to disable
4881 * @retval HAL status
4882 */
HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef * htim,uint32_t BurstRequestSrc)4883 HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc)
4884 {
4885 HAL_StatusTypeDef status = HAL_OK;
4886
4887 /* Check the parameters */
4888 assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc));
4889
4890 /* Abort the DMA transfer (at least disable the DMA channel) */
4891 switch (BurstRequestSrc)
4892 {
4893 case TIM_DMA_UPDATE:
4894 {
4895 (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]);
4896 break;
4897 }
4898 case TIM_DMA_CC1:
4899 {
4900 (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]);
4901 break;
4902 }
4903 case TIM_DMA_CC2:
4904 {
4905 (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]);
4906 break;
4907 }
4908 case TIM_DMA_CC3:
4909 {
4910 (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]);
4911 break;
4912 }
4913 case TIM_DMA_CC4:
4914 {
4915 (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]);
4916 break;
4917 }
4918 case TIM_DMA_COM:
4919 {
4920 (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_COMMUTATION]);
4921 break;
4922 }
4923 case TIM_DMA_TRIGGER:
4924 {
4925 (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_TRIGGER]);
4926 break;
4927 }
4928 default:
4929 status = HAL_ERROR;
4930 break;
4931 }
4932
4933 if (status == HAL_OK)
4934 {
4935 /* Disable the TIM Update DMA request */
4936 __HAL_TIM_DISABLE_DMA(htim, BurstRequestSrc);
4937
4938 /* Change the DMA burst operation state */
4939 htim->DMABurstState = HAL_DMA_BURST_STATE_READY;
4940 }
4941
4942 /* Return function status */
4943 return status;
4944 }
4945
4946 /**
4947 * @brief Configure the DMA Burst to transfer Data from the TIM peripheral to the memory
4948 * @param htim TIM handle
4949 * @param BurstBaseAddress TIM Base address from where the DMA will start the Data read
4950 * This parameter can be one of the following values:
4951 * @arg TIM_DMABASE_CR1
4952 * @arg TIM_DMABASE_CR2
4953 * @arg TIM_DMABASE_SMCR
4954 * @arg TIM_DMABASE_DIER
4955 * @arg TIM_DMABASE_SR
4956 * @arg TIM_DMABASE_EGR
4957 * @arg TIM_DMABASE_CCMR1
4958 * @arg TIM_DMABASE_CCMR2
4959 * @arg TIM_DMABASE_CCER
4960 * @arg TIM_DMABASE_CNT
4961 * @arg TIM_DMABASE_PSC
4962 * @arg TIM_DMABASE_ARR
4963 * @arg TIM_DMABASE_RCR
4964 * @arg TIM_DMABASE_CCR1
4965 * @arg TIM_DMABASE_CCR2
4966 * @arg TIM_DMABASE_CCR3
4967 * @arg TIM_DMABASE_CCR4
4968 * @arg TIM_DMABASE_BDTR
4969 * @arg TIM_DMABASE_CCMR3
4970 * @arg TIM_DMABASE_CCR5
4971 * @arg TIM_DMABASE_CCR6
4972 * @arg TIM_DMABASE_DTR2
4973 * @arg TIM_DMABASE_ECR
4974 * @arg TIM_DMABASE_TISEL
4975 * @arg TIM_DMABASE_AF1
4976 * @arg TIM_DMABASE_AF2
4977 * @arg TIM_DMABASE_OR
4978 * @param BurstRequestSrc TIM DMA Request sources
4979 * This parameter can be one of the following values:
4980 * @arg TIM_DMA_UPDATE: TIM update Interrupt source
4981 * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source
4982 * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source
4983 * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source
4984 * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source
4985 * @arg TIM_DMA_COM: TIM Commutation DMA source
4986 * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source
4987 * @param BurstBuffer The Buffer address.
4988 * @param BurstLength DMA Burst length. This parameter can be one value
4989 * between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_26TRANSFER.
4990 * @note This function should be used only when BurstLength is equal to DMA data transfer length.
4991 * @retval HAL status
4992 */
HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef * htim,uint32_t BurstBaseAddress,uint32_t BurstRequestSrc,uint32_t * BurstBuffer,uint32_t BurstLength)4993 HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress,
4994 uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength)
4995 {
4996 HAL_StatusTypeDef status;
4997
4998 status = HAL_TIM_DMABurst_MultiReadStart(htim, BurstBaseAddress, BurstRequestSrc, BurstBuffer, BurstLength,
4999 ((BurstLength) >> 8U) + 1U);
5000
5001
5002 return status;
5003 }
5004
5005 /**
5006 * @brief Configure the DMA Burst to transfer Data from the TIM peripheral to the memory
5007 * @param htim TIM handle
5008 * @param BurstBaseAddress TIM Base address from where the DMA will start the Data read
5009 * This parameter can be one of the following values:
5010 * @arg TIM_DMABASE_CR1
5011 * @arg TIM_DMABASE_CR2
5012 * @arg TIM_DMABASE_SMCR
5013 * @arg TIM_DMABASE_DIER
5014 * @arg TIM_DMABASE_SR
5015 * @arg TIM_DMABASE_EGR
5016 * @arg TIM_DMABASE_CCMR1
5017 * @arg TIM_DMABASE_CCMR2
5018 * @arg TIM_DMABASE_CCER
5019 * @arg TIM_DMABASE_CNT
5020 * @arg TIM_DMABASE_PSC
5021 * @arg TIM_DMABASE_ARR
5022 * @arg TIM_DMABASE_RCR
5023 * @arg TIM_DMABASE_CCR1
5024 * @arg TIM_DMABASE_CCR2
5025 * @arg TIM_DMABASE_CCR3
5026 * @arg TIM_DMABASE_CCR4
5027 * @arg TIM_DMABASE_BDTR
5028 * @arg TIM_DMABASE_CCMR3
5029 * @arg TIM_DMABASE_CCR5
5030 * @arg TIM_DMABASE_CCR6
5031 * @arg TIM_DMABASE_DTR2
5032 * @arg TIM_DMABASE_ECR
5033 * @arg TIM_DMABASE_TISEL
5034 * @arg TIM_DMABASE_AF1
5035 * @arg TIM_DMABASE_AF2
5036 * @arg TIM_DMABASE_OR
5037 * @param BurstRequestSrc TIM DMA Request sources
5038 * This parameter can be one of the following values:
5039 * @arg TIM_DMA_UPDATE: TIM update Interrupt source
5040 * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source
5041 * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source
5042 * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source
5043 * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source
5044 * @arg TIM_DMA_COM: TIM Commutation DMA source
5045 * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source
5046 * @param BurstBuffer The Buffer address.
5047 * @param BurstLength DMA Burst length. This parameter can be one value
5048 * between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_26TRANSFER.
5049 * @param DataLength Data length. This parameter can be one value
5050 * between 1 and 0xFFFF.
5051 * @retval HAL status
5052 */
HAL_TIM_DMABurst_MultiReadStart(TIM_HandleTypeDef * htim,uint32_t BurstBaseAddress,uint32_t BurstRequestSrc,uint32_t * BurstBuffer,uint32_t BurstLength,uint32_t DataLength)5053 HAL_StatusTypeDef HAL_TIM_DMABurst_MultiReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress,
5054 uint32_t BurstRequestSrc, uint32_t *BurstBuffer,
5055 uint32_t BurstLength, uint32_t DataLength)
5056 {
5057 HAL_StatusTypeDef status = HAL_OK;
5058
5059 /* Check the parameters */
5060 assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance));
5061 assert_param(IS_TIM_DMA_BASE(BurstBaseAddress));
5062 assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc));
5063 assert_param(IS_TIM_DMA_LENGTH(BurstLength));
5064 assert_param(IS_TIM_DMA_DATA_LENGTH(DataLength));
5065
5066 if (htim->DMABurstState == HAL_DMA_BURST_STATE_BUSY)
5067 {
5068 return HAL_BUSY;
5069 }
5070 else if (htim->DMABurstState == HAL_DMA_BURST_STATE_READY)
5071 {
5072 if ((BurstBuffer == NULL) && (BurstLength > 0U))
5073 {
5074 return HAL_ERROR;
5075 }
5076 else
5077 {
5078 htim->DMABurstState = HAL_DMA_BURST_STATE_BUSY;
5079 }
5080 }
5081 else
5082 {
5083 /* nothing to do */
5084 }
5085 switch (BurstRequestSrc)
5086 {
5087 case TIM_DMA_UPDATE:
5088 {
5089 /* Set the DMA Period elapsed callbacks */
5090 htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt;
5091 htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt;
5092
5093 /* Set the DMA error callback */
5094 htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ;
5095
5096 /* Enable the DMA channel */
5097 if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer,
5098 DataLength) != HAL_OK)
5099 {
5100 /* Return error status */
5101 return HAL_ERROR;
5102 }
5103 break;
5104 }
5105 case TIM_DMA_CC1:
5106 {
5107 /* Set the DMA capture callbacks */
5108 htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt;
5109 htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt;
5110
5111 /* Set the DMA error callback */
5112 htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ;
5113
5114 /* Enable the DMA channel */
5115 if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer,
5116 DataLength) != HAL_OK)
5117 {
5118 /* Return error status */
5119 return HAL_ERROR;
5120 }
5121 break;
5122 }
5123 case TIM_DMA_CC2:
5124 {
5125 /* Set the DMA capture callbacks */
5126 htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt;
5127 htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt;
5128
5129 /* Set the DMA error callback */
5130 htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ;
5131
5132 /* Enable the DMA channel */
5133 if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer,
5134 DataLength) != HAL_OK)
5135 {
5136 /* Return error status */
5137 return HAL_ERROR;
5138 }
5139 break;
5140 }
5141 case TIM_DMA_CC3:
5142 {
5143 /* Set the DMA capture callbacks */
5144 htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMACaptureCplt;
5145 htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt;
5146
5147 /* Set the DMA error callback */
5148 htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ;
5149
5150 /* Enable the DMA channel */
5151 if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer,
5152 DataLength) != HAL_OK)
5153 {
5154 /* Return error status */
5155 return HAL_ERROR;
5156 }
5157 break;
5158 }
5159 case TIM_DMA_CC4:
5160 {
5161 /* Set the DMA capture callbacks */
5162 htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMACaptureCplt;
5163 htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt;
5164
5165 /* Set the DMA error callback */
5166 htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ;
5167
5168 /* Enable the DMA channel */
5169 if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer,
5170 DataLength) != HAL_OK)
5171 {
5172 /* Return error status */
5173 return HAL_ERROR;
5174 }
5175 break;
5176 }
5177 case TIM_DMA_COM:
5178 {
5179 /* Set the DMA commutation callbacks */
5180 htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt;
5181 htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback = TIMEx_DMACommutationHalfCplt;
5182
5183 /* Set the DMA error callback */
5184 htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError ;
5185
5186 /* Enable the DMA channel */
5187 if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer,
5188 DataLength) != HAL_OK)
5189 {
5190 /* Return error status */
5191 return HAL_ERROR;
5192 }
5193 break;
5194 }
5195 case TIM_DMA_TRIGGER:
5196 {
5197 /* Set the DMA trigger callbacks */
5198 htim->hdma[TIM_DMA_ID_TRIGGER]->XferCpltCallback = TIM_DMATriggerCplt;
5199 htim->hdma[TIM_DMA_ID_TRIGGER]->XferHalfCpltCallback = TIM_DMATriggerHalfCplt;
5200
5201 /* Set the DMA error callback */
5202 htim->hdma[TIM_DMA_ID_TRIGGER]->XferErrorCallback = TIM_DMAError ;
5203
5204 /* Enable the DMA channel */
5205 if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer,
5206 DataLength) != HAL_OK)
5207 {
5208 /* Return error status */
5209 return HAL_ERROR;
5210 }
5211 break;
5212 }
5213 default:
5214 status = HAL_ERROR;
5215 break;
5216 }
5217
5218 if (status == HAL_OK)
5219 {
5220 /* Configure the DMA Burst Mode */
5221 htim->Instance->DCR = (BurstBaseAddress | BurstLength);
5222
5223 /* Enable the TIM DMA Request */
5224 __HAL_TIM_ENABLE_DMA(htim, BurstRequestSrc);
5225 }
5226
5227 /* Return function status */
5228 return status;
5229 }
5230
5231 /**
5232 * @brief Stop the DMA burst reading
5233 * @param htim TIM handle
5234 * @param BurstRequestSrc TIM DMA Request sources to disable.
5235 * @retval HAL status
5236 */
HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef * htim,uint32_t BurstRequestSrc)5237 HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc)
5238 {
5239 HAL_StatusTypeDef status = HAL_OK;
5240
5241 /* Check the parameters */
5242 assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc));
5243
5244 /* Abort the DMA transfer (at least disable the DMA channel) */
5245 switch (BurstRequestSrc)
5246 {
5247 case TIM_DMA_UPDATE:
5248 {
5249 (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]);
5250 break;
5251 }
5252 case TIM_DMA_CC1:
5253 {
5254 (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]);
5255 break;
5256 }
5257 case TIM_DMA_CC2:
5258 {
5259 (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]);
5260 break;
5261 }
5262 case TIM_DMA_CC3:
5263 {
5264 (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]);
5265 break;
5266 }
5267 case TIM_DMA_CC4:
5268 {
5269 (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]);
5270 break;
5271 }
5272 case TIM_DMA_COM:
5273 {
5274 (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_COMMUTATION]);
5275 break;
5276 }
5277 case TIM_DMA_TRIGGER:
5278 {
5279 (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_TRIGGER]);
5280 break;
5281 }
5282 default:
5283 status = HAL_ERROR;
5284 break;
5285 }
5286
5287 if (status == HAL_OK)
5288 {
5289 /* Disable the TIM Update DMA request */
5290 __HAL_TIM_DISABLE_DMA(htim, BurstRequestSrc);
5291
5292 /* Change the DMA burst operation state */
5293 htim->DMABurstState = HAL_DMA_BURST_STATE_READY;
5294 }
5295
5296 /* Return function status */
5297 return status;
5298 }
5299
5300 /**
5301 * @brief Generate a software event
5302 * @param htim TIM handle
5303 * @param EventSource specifies the event source.
5304 * This parameter can be one of the following values:
5305 * @arg TIM_EVENTSOURCE_UPDATE: Timer update Event source
5306 * @arg TIM_EVENTSOURCE_CC1: Timer Capture Compare 1 Event source
5307 * @arg TIM_EVENTSOURCE_CC2: Timer Capture Compare 2 Event source
5308 * @arg TIM_EVENTSOURCE_CC3: Timer Capture Compare 3 Event source
5309 * @arg TIM_EVENTSOURCE_CC4: Timer Capture Compare 4 Event source
5310 * @arg TIM_EVENTSOURCE_COM: Timer COM event source
5311 * @arg TIM_EVENTSOURCE_TRIGGER: Timer Trigger Event source
5312 * @arg TIM_EVENTSOURCE_BREAK: Timer Break event source
5313 * @arg TIM_EVENTSOURCE_BREAK2: Timer Break2 event source
5314 * @note Basic timers can only generate an update event.
5315 * @note TIM_EVENTSOURCE_COM is relevant only with advanced timer instances.
5316 * @note TIM_EVENTSOURCE_BREAK and TIM_EVENTSOURCE_BREAK2 are relevant
5317 * only for timer instances supporting break input(s).
5318 * @retval HAL status
5319 */
5320
HAL_TIM_GenerateEvent(TIM_HandleTypeDef * htim,uint32_t EventSource)5321 HAL_StatusTypeDef HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource)
5322 {
5323 /* Check the parameters */
5324 assert_param(IS_TIM_INSTANCE(htim->Instance));
5325 assert_param(IS_TIM_EVENT_SOURCE(EventSource));
5326
5327 /* Process Locked */
5328 __HAL_LOCK(htim);
5329
5330 /* Change the TIM state */
5331 htim->State = HAL_TIM_STATE_BUSY;
5332
5333 /* Set the event sources */
5334 htim->Instance->EGR = EventSource;
5335
5336 /* Change the TIM state */
5337 htim->State = HAL_TIM_STATE_READY;
5338
5339 __HAL_UNLOCK(htim);
5340
5341 /* Return function status */
5342 return HAL_OK;
5343 }
5344
5345 /**
5346 * @brief Configures the OCRef clear feature
5347 * @param htim TIM handle
5348 * @param sClearInputConfig pointer to a TIM_ClearInputConfigTypeDef structure that
5349 * contains the OCREF clear feature and parameters for the TIM peripheral.
5350 * @param Channel specifies the TIM Channel
5351 * This parameter can be one of the following values:
5352 * @arg TIM_CHANNEL_1: TIM Channel 1
5353 * @arg TIM_CHANNEL_2: TIM Channel 2
5354 * @arg TIM_CHANNEL_3: TIM Channel 3
5355 * @arg TIM_CHANNEL_4: TIM Channel 4
5356 * @arg TIM_CHANNEL_5: TIM Channel 5
5357 * @arg TIM_CHANNEL_6: TIM Channel 6
5358 * @retval HAL status
5359 */
HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef * htim,const TIM_ClearInputConfigTypeDef * sClearInputConfig,uint32_t Channel)5360 HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim,
5361 const TIM_ClearInputConfigTypeDef *sClearInputConfig,
5362 uint32_t Channel)
5363 {
5364 HAL_StatusTypeDef status = HAL_OK;
5365
5366 /* Check the parameters */
5367 assert_param(IS_TIM_OCXREF_CLEAR_INSTANCE(htim->Instance));
5368 assert_param(IS_TIM_CLEARINPUT_SOURCE(sClearInputConfig->ClearInputSource));
5369
5370 /* Process Locked */
5371 __HAL_LOCK(htim);
5372
5373 htim->State = HAL_TIM_STATE_BUSY;
5374
5375 switch (sClearInputConfig->ClearInputSource)
5376 {
5377 case TIM_CLEARINPUTSOURCE_NONE:
5378 {
5379 /* Clear the OCREF clear selection bit and the the ETR Bits */
5380 if (IS_TIM_OCCS_INSTANCE(htim->Instance))
5381 {
5382 CLEAR_BIT(htim->Instance->SMCR, (TIM_SMCR_OCCS | TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP));
5383
5384 /* Clear TIMx_AF2_OCRSEL (reset value) */
5385 CLEAR_BIT(htim->Instance->AF2, TIMx_AF2_OCRSEL);
5386 }
5387 else
5388 {
5389 CLEAR_BIT(htim->Instance->SMCR, (TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP));
5390 }
5391 break;
5392 }
5393
5394 case TIM_CLEARINPUTSOURCE_COMP1:
5395 case TIM_CLEARINPUTSOURCE_COMP2:
5396 case TIM_CLEARINPUTSOURCE_COMP3:
5397 case TIM_CLEARINPUTSOURCE_COMP4:
5398 #if defined (COMP5)
5399 case TIM_CLEARINPUTSOURCE_COMP5:
5400 #endif /* COMP5 */
5401 #if defined (COMP6)
5402 case TIM_CLEARINPUTSOURCE_COMP6:
5403 #endif /* COMP6 */
5404 #if defined (COMP7)
5405 case TIM_CLEARINPUTSOURCE_COMP7:
5406 #endif /* COMP7 */
5407 {
5408 if (IS_TIM_OCCS_INSTANCE(htim->Instance))
5409 {
5410 /* Clear the OCREF clear selection bit */
5411 CLEAR_BIT(htim->Instance->SMCR, TIM_SMCR_OCCS);
5412 }
5413
5414 /* Set the clear input source */
5415 MODIFY_REG(htim->Instance->AF2, TIMx_AF2_OCRSEL, sClearInputConfig->ClearInputSource);
5416 break;
5417 }
5418
5419 case TIM_CLEARINPUTSOURCE_ETR:
5420 {
5421 /* Check the parameters */
5422 assert_param(IS_TIM_CLEARINPUT_POLARITY(sClearInputConfig->ClearInputPolarity));
5423 assert_param(IS_TIM_CLEARINPUT_PRESCALER(sClearInputConfig->ClearInputPrescaler));
5424 assert_param(IS_TIM_CLEARINPUT_FILTER(sClearInputConfig->ClearInputFilter));
5425
5426 /* When OCRef clear feature is used with ETR source, ETR prescaler must be off */
5427 if (sClearInputConfig->ClearInputPrescaler != TIM_CLEARINPUTPRESCALER_DIV1)
5428 {
5429 htim->State = HAL_TIM_STATE_READY;
5430 __HAL_UNLOCK(htim);
5431 return HAL_ERROR;
5432 }
5433
5434 TIM_ETR_SetConfig(htim->Instance,
5435 sClearInputConfig->ClearInputPrescaler,
5436 sClearInputConfig->ClearInputPolarity,
5437 sClearInputConfig->ClearInputFilter);
5438
5439 if (IS_TIM_OCCS_INSTANCE(htim->Instance))
5440 {
5441 /* Set the OCREF clear selection bit */
5442 SET_BIT(htim->Instance->SMCR, TIM_SMCR_OCCS);
5443
5444 /* Clear TIMx_AF2_OCRSEL (reset value) */
5445 CLEAR_BIT(htim->Instance->AF2, TIMx_AF2_OCRSEL);
5446 }
5447 break;
5448 }
5449
5450 default:
5451 status = HAL_ERROR;
5452 break;
5453 }
5454
5455 if (status == HAL_OK)
5456 {
5457 switch (Channel)
5458 {
5459 case TIM_CHANNEL_1:
5460 {
5461 if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE)
5462 {
5463 /* Enable the OCREF clear feature for Channel 1 */
5464 SET_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC1CE);
5465 }
5466 else
5467 {
5468 /* Disable the OCREF clear feature for Channel 1 */
5469 CLEAR_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC1CE);
5470 }
5471 break;
5472 }
5473 case TIM_CHANNEL_2:
5474 {
5475 if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE)
5476 {
5477 /* Enable the OCREF clear feature for Channel 2 */
5478 SET_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC2CE);
5479 }
5480 else
5481 {
5482 /* Disable the OCREF clear feature for Channel 2 */
5483 CLEAR_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC2CE);
5484 }
5485 break;
5486 }
5487 case TIM_CHANNEL_3:
5488 {
5489 if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE)
5490 {
5491 /* Enable the OCREF clear feature for Channel 3 */
5492 SET_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC3CE);
5493 }
5494 else
5495 {
5496 /* Disable the OCREF clear feature for Channel 3 */
5497 CLEAR_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC3CE);
5498 }
5499 break;
5500 }
5501 case TIM_CHANNEL_4:
5502 {
5503 if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE)
5504 {
5505 /* Enable the OCREF clear feature for Channel 4 */
5506 SET_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC4CE);
5507 }
5508 else
5509 {
5510 /* Disable the OCREF clear feature for Channel 4 */
5511 CLEAR_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC4CE);
5512 }
5513 break;
5514 }
5515 case TIM_CHANNEL_5:
5516 {
5517 if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE)
5518 {
5519 /* Enable the OCREF clear feature for Channel 5 */
5520 SET_BIT(htim->Instance->CCMR3, TIM_CCMR3_OC5CE);
5521 }
5522 else
5523 {
5524 /* Disable the OCREF clear feature for Channel 5 */
5525 CLEAR_BIT(htim->Instance->CCMR3, TIM_CCMR3_OC5CE);
5526 }
5527 break;
5528 }
5529 case TIM_CHANNEL_6:
5530 {
5531 if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE)
5532 {
5533 /* Enable the OCREF clear feature for Channel 6 */
5534 SET_BIT(htim->Instance->CCMR3, TIM_CCMR3_OC6CE);
5535 }
5536 else
5537 {
5538 /* Disable the OCREF clear feature for Channel 6 */
5539 CLEAR_BIT(htim->Instance->CCMR3, TIM_CCMR3_OC6CE);
5540 }
5541 break;
5542 }
5543 default:
5544 break;
5545 }
5546 }
5547
5548 htim->State = HAL_TIM_STATE_READY;
5549
5550 __HAL_UNLOCK(htim);
5551
5552 return status;
5553 }
5554
5555 /**
5556 * @brief Configures the clock source to be used
5557 * @param htim TIM handle
5558 * @param sClockSourceConfig pointer to a TIM_ClockConfigTypeDef structure that
5559 * contains the clock source information for the TIM peripheral.
5560 * @retval HAL status
5561 */
HAL_TIM_ConfigClockSource(TIM_HandleTypeDef * htim,const TIM_ClockConfigTypeDef * sClockSourceConfig)5562 HAL_StatusTypeDef HAL_TIM_ConfigClockSource(TIM_HandleTypeDef *htim, const TIM_ClockConfigTypeDef *sClockSourceConfig)
5563 {
5564 HAL_StatusTypeDef status = HAL_OK;
5565 uint32_t tmpsmcr;
5566
5567 /* Process Locked */
5568 __HAL_LOCK(htim);
5569
5570 htim->State = HAL_TIM_STATE_BUSY;
5571
5572 /* Check the parameters */
5573 assert_param(IS_TIM_CLOCKSOURCE(sClockSourceConfig->ClockSource));
5574
5575 /* Reset the SMS, TS, ECE, ETPS and ETRF bits */
5576 tmpsmcr = htim->Instance->SMCR;
5577 tmpsmcr &= ~(TIM_SMCR_SMS | TIM_SMCR_TS);
5578 tmpsmcr &= ~(TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP);
5579 htim->Instance->SMCR = tmpsmcr;
5580
5581 switch (sClockSourceConfig->ClockSource)
5582 {
5583 case TIM_CLOCKSOURCE_INTERNAL:
5584 {
5585 assert_param(IS_TIM_INSTANCE(htim->Instance));
5586 break;
5587 }
5588
5589 case TIM_CLOCKSOURCE_ETRMODE1:
5590 {
5591 /* Check whether or not the timer instance supports external trigger input mode 1 (ETRF)*/
5592 assert_param(IS_TIM_CLOCKSOURCE_ETRMODE1_INSTANCE(htim->Instance));
5593
5594 /* Check ETR input conditioning related parameters */
5595 assert_param(IS_TIM_CLOCKPRESCALER(sClockSourceConfig->ClockPrescaler));
5596 assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity));
5597 assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter));
5598
5599 /* Configure the ETR Clock source */
5600 TIM_ETR_SetConfig(htim->Instance,
5601 sClockSourceConfig->ClockPrescaler,
5602 sClockSourceConfig->ClockPolarity,
5603 sClockSourceConfig->ClockFilter);
5604
5605 /* Select the External clock mode1 and the ETRF trigger */
5606 tmpsmcr = htim->Instance->SMCR;
5607 tmpsmcr |= (TIM_SLAVEMODE_EXTERNAL1 | TIM_CLOCKSOURCE_ETRMODE1);
5608 /* Write to TIMx SMCR */
5609 htim->Instance->SMCR = tmpsmcr;
5610 break;
5611 }
5612
5613 case TIM_CLOCKSOURCE_ETRMODE2:
5614 {
5615 /* Check whether or not the timer instance supports external trigger input mode 2 (ETRF)*/
5616 assert_param(IS_TIM_CLOCKSOURCE_ETRMODE2_INSTANCE(htim->Instance));
5617
5618 /* Check ETR input conditioning related parameters */
5619 assert_param(IS_TIM_CLOCKPRESCALER(sClockSourceConfig->ClockPrescaler));
5620 assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity));
5621 assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter));
5622
5623 /* Configure the ETR Clock source */
5624 TIM_ETR_SetConfig(htim->Instance,
5625 sClockSourceConfig->ClockPrescaler,
5626 sClockSourceConfig->ClockPolarity,
5627 sClockSourceConfig->ClockFilter);
5628 /* Enable the External clock mode2 */
5629 htim->Instance->SMCR |= TIM_SMCR_ECE;
5630 break;
5631 }
5632
5633 case TIM_CLOCKSOURCE_TI1:
5634 {
5635 /* Check whether or not the timer instance supports external clock mode 1 */
5636 assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance));
5637
5638 /* Check TI1 input conditioning related parameters */
5639 assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity));
5640 assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter));
5641
5642 TIM_TI1_ConfigInputStage(htim->Instance,
5643 sClockSourceConfig->ClockPolarity,
5644 sClockSourceConfig->ClockFilter);
5645 TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI1);
5646 break;
5647 }
5648
5649 case TIM_CLOCKSOURCE_TI2:
5650 {
5651 /* Check whether or not the timer instance supports external clock mode 1 (ETRF)*/
5652 assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance));
5653
5654 /* Check TI2 input conditioning related parameters */
5655 assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity));
5656 assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter));
5657
5658 TIM_TI2_ConfigInputStage(htim->Instance,
5659 sClockSourceConfig->ClockPolarity,
5660 sClockSourceConfig->ClockFilter);
5661 TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI2);
5662 break;
5663 }
5664
5665 case TIM_CLOCKSOURCE_TI1ED:
5666 {
5667 /* Check whether or not the timer instance supports external clock mode 1 */
5668 assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance));
5669
5670 /* Check TI1 input conditioning related parameters */
5671 assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity));
5672 assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter));
5673
5674 TIM_TI1_ConfigInputStage(htim->Instance,
5675 sClockSourceConfig->ClockPolarity,
5676 sClockSourceConfig->ClockFilter);
5677 TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI1ED);
5678 break;
5679 }
5680
5681 case TIM_CLOCKSOURCE_ITR0:
5682 case TIM_CLOCKSOURCE_ITR1:
5683 case TIM_CLOCKSOURCE_ITR2:
5684 case TIM_CLOCKSOURCE_ITR3:
5685 #if defined (TIM5)
5686 case TIM_CLOCKSOURCE_ITR4:
5687 #endif /* TIM5 */
5688 case TIM_CLOCKSOURCE_ITR5:
5689 case TIM_CLOCKSOURCE_ITR6:
5690 case TIM_CLOCKSOURCE_ITR7:
5691 case TIM_CLOCKSOURCE_ITR8:
5692 #if defined (TIM20)
5693 case TIM_CLOCKSOURCE_ITR9:
5694 #endif /* TIM20 */
5695 #if defined (HRTIM1)
5696 case TIM_CLOCKSOURCE_ITR10:
5697 #endif /* HRTIM1 */
5698 case TIM_CLOCKSOURCE_ITR11:
5699 {
5700 /* Check whether or not the timer instance supports internal trigger input */
5701 assert_param(IS_TIM_CLOCKSOURCE_INSTANCE((htim->Instance), sClockSourceConfig->ClockSource));
5702
5703 TIM_ITRx_SetConfig(htim->Instance, sClockSourceConfig->ClockSource);
5704 break;
5705 }
5706
5707 default:
5708 status = HAL_ERROR;
5709 break;
5710 }
5711 htim->State = HAL_TIM_STATE_READY;
5712
5713 __HAL_UNLOCK(htim);
5714
5715 return status;
5716 }
5717
5718 /**
5719 * @brief Selects the signal connected to the TI1 input: direct from CH1_input
5720 * or a XOR combination between CH1_input, CH2_input & CH3_input
5721 * @param htim TIM handle.
5722 * @param TI1_Selection Indicate whether or not channel 1 is connected to the
5723 * output of a XOR gate.
5724 * This parameter can be one of the following values:
5725 * @arg TIM_TI1SELECTION_CH1: The TIMx_CH1 pin is connected to TI1 input
5726 * @arg TIM_TI1SELECTION_XORCOMBINATION: The TIMx_CH1, CH2 and CH3
5727 * pins are connected to the TI1 input (XOR combination)
5728 * @retval HAL status
5729 */
HAL_TIM_ConfigTI1Input(TIM_HandleTypeDef * htim,uint32_t TI1_Selection)5730 HAL_StatusTypeDef HAL_TIM_ConfigTI1Input(TIM_HandleTypeDef *htim, uint32_t TI1_Selection)
5731 {
5732 uint32_t tmpcr2;
5733
5734 /* Check the parameters */
5735 assert_param(IS_TIM_XOR_INSTANCE(htim->Instance));
5736 assert_param(IS_TIM_TI1SELECTION(TI1_Selection));
5737
5738 /* Get the TIMx CR2 register value */
5739 tmpcr2 = htim->Instance->CR2;
5740
5741 /* Reset the TI1 selection */
5742 tmpcr2 &= ~TIM_CR2_TI1S;
5743
5744 /* Set the TI1 selection */
5745 tmpcr2 |= TI1_Selection;
5746
5747 /* Write to TIMxCR2 */
5748 htim->Instance->CR2 = tmpcr2;
5749
5750 return HAL_OK;
5751 }
5752
5753 /**
5754 * @brief Configures the TIM in Slave mode
5755 * @param htim TIM handle.
5756 * @param sSlaveConfig pointer to a TIM_SlaveConfigTypeDef structure that
5757 * contains the selected trigger (internal trigger input, filtered
5758 * timer input or external trigger input) and the Slave mode
5759 * (Disable, Reset, Gated, Trigger, External clock mode 1, Reset + Trigger, Gated + Reset).
5760 * @retval HAL status
5761 */
HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef * htim,const TIM_SlaveConfigTypeDef * sSlaveConfig)5762 HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, const TIM_SlaveConfigTypeDef *sSlaveConfig)
5763 {
5764 /* Check the parameters */
5765 assert_param(IS_TIM_SLAVE_INSTANCE(htim->Instance));
5766 assert_param(IS_TIM_SLAVE_MODE(sSlaveConfig->SlaveMode));
5767 assert_param(IS_TIM_TRIGGER_INSTANCE(htim->Instance, sSlaveConfig->InputTrigger));
5768
5769 __HAL_LOCK(htim);
5770
5771 htim->State = HAL_TIM_STATE_BUSY;
5772
5773 if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK)
5774 {
5775 htim->State = HAL_TIM_STATE_READY;
5776 __HAL_UNLOCK(htim);
5777 return HAL_ERROR;
5778 }
5779
5780 /* Disable Trigger Interrupt */
5781 __HAL_TIM_DISABLE_IT(htim, TIM_IT_TRIGGER);
5782
5783 /* Disable Trigger DMA request */
5784 __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_TRIGGER);
5785
5786 htim->State = HAL_TIM_STATE_READY;
5787
5788 __HAL_UNLOCK(htim);
5789
5790 return HAL_OK;
5791 }
5792
5793 /**
5794 * @brief Configures the TIM in Slave mode in interrupt mode
5795 * @param htim TIM handle.
5796 * @param sSlaveConfig pointer to a TIM_SlaveConfigTypeDef structure that
5797 * contains the selected trigger (internal trigger input, filtered
5798 * timer input or external trigger input) and the Slave mode
5799 * (Disable, Reset, Gated, Trigger, External clock mode 1, Reset + Trigger, Gated + Reset).
5800 * @retval HAL status
5801 */
HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef * htim,const TIM_SlaveConfigTypeDef * sSlaveConfig)5802 HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim,
5803 const TIM_SlaveConfigTypeDef *sSlaveConfig)
5804 {
5805 /* Check the parameters */
5806 assert_param(IS_TIM_SLAVE_INSTANCE(htim->Instance));
5807 assert_param(IS_TIM_SLAVE_MODE(sSlaveConfig->SlaveMode));
5808 assert_param(IS_TIM_TRIGGER_INSTANCE(htim->Instance, sSlaveConfig->InputTrigger));
5809
5810 __HAL_LOCK(htim);
5811
5812 htim->State = HAL_TIM_STATE_BUSY;
5813
5814 if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK)
5815 {
5816 htim->State = HAL_TIM_STATE_READY;
5817 __HAL_UNLOCK(htim);
5818 return HAL_ERROR;
5819 }
5820
5821 /* Enable Trigger Interrupt */
5822 __HAL_TIM_ENABLE_IT(htim, TIM_IT_TRIGGER);
5823
5824 /* Disable Trigger DMA request */
5825 __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_TRIGGER);
5826
5827 htim->State = HAL_TIM_STATE_READY;
5828
5829 __HAL_UNLOCK(htim);
5830
5831 return HAL_OK;
5832 }
5833
5834 /**
5835 * @brief Read the captured value from Capture Compare unit
5836 * @param htim TIM handle.
5837 * @param Channel TIM Channels to be enabled
5838 * This parameter can be one of the following values:
5839 * @arg TIM_CHANNEL_1: TIM Channel 1 selected
5840 * @arg TIM_CHANNEL_2: TIM Channel 2 selected
5841 * @arg TIM_CHANNEL_3: TIM Channel 3 selected
5842 * @arg TIM_CHANNEL_4: TIM Channel 4 selected
5843 * @retval Captured value
5844 */
HAL_TIM_ReadCapturedValue(const TIM_HandleTypeDef * htim,uint32_t Channel)5845 uint32_t HAL_TIM_ReadCapturedValue(const TIM_HandleTypeDef *htim, uint32_t Channel)
5846 {
5847 uint32_t tmpreg = 0U;
5848
5849 switch (Channel)
5850 {
5851 case TIM_CHANNEL_1:
5852 {
5853 /* Check the parameters */
5854 assert_param(IS_TIM_CC1_INSTANCE(htim->Instance));
5855
5856 /* Return the capture 1 value */
5857 tmpreg = htim->Instance->CCR1;
5858
5859 break;
5860 }
5861 case TIM_CHANNEL_2:
5862 {
5863 /* Check the parameters */
5864 assert_param(IS_TIM_CC2_INSTANCE(htim->Instance));
5865
5866 /* Return the capture 2 value */
5867 tmpreg = htim->Instance->CCR2;
5868
5869 break;
5870 }
5871
5872 case TIM_CHANNEL_3:
5873 {
5874 /* Check the parameters */
5875 assert_param(IS_TIM_CC3_INSTANCE(htim->Instance));
5876
5877 /* Return the capture 3 value */
5878 tmpreg = htim->Instance->CCR3;
5879
5880 break;
5881 }
5882
5883 case TIM_CHANNEL_4:
5884 {
5885 /* Check the parameters */
5886 assert_param(IS_TIM_CC4_INSTANCE(htim->Instance));
5887
5888 /* Return the capture 4 value */
5889 tmpreg = htim->Instance->CCR4;
5890
5891 break;
5892 }
5893
5894 default:
5895 break;
5896 }
5897
5898 return tmpreg;
5899 }
5900
5901 /**
5902 * @}
5903 */
5904
5905 /** @defgroup TIM_Exported_Functions_Group9 TIM Callbacks functions
5906 * @brief TIM Callbacks functions
5907 *
5908 @verbatim
5909 ==============================================================================
5910 ##### TIM Callbacks functions #####
5911 ==============================================================================
5912 [..]
5913 This section provides TIM callback functions:
5914 (+) TIM Period elapsed callback
5915 (+) TIM Output Compare callback
5916 (+) TIM Input capture callback
5917 (+) TIM Trigger callback
5918 (+) TIM Error callback
5919 (+) TIM Index callback
5920 (+) TIM Direction change callback
5921 (+) TIM Index error callback
5922 (+) TIM Transition error callback
5923
5924 @endverbatim
5925 * @{
5926 */
5927
5928 /**
5929 * @brief Period elapsed callback in non-blocking mode
5930 * @param htim TIM handle
5931 * @retval None
5932 */
HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef * htim)5933 __weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
5934 {
5935 /* Prevent unused argument(s) compilation warning */
5936 UNUSED(htim);
5937
5938 /* NOTE : This function should not be modified, when the callback is needed,
5939 the HAL_TIM_PeriodElapsedCallback could be implemented in the user file
5940 */
5941 }
5942
5943 /**
5944 * @brief Period elapsed half complete callback in non-blocking mode
5945 * @param htim TIM handle
5946 * @retval None
5947 */
HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef * htim)5948 __weak void HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef *htim)
5949 {
5950 /* Prevent unused argument(s) compilation warning */
5951 UNUSED(htim);
5952
5953 /* NOTE : This function should not be modified, when the callback is needed,
5954 the HAL_TIM_PeriodElapsedHalfCpltCallback could be implemented in the user file
5955 */
5956 }
5957
5958 /**
5959 * @brief Output Compare callback in non-blocking mode
5960 * @param htim TIM OC handle
5961 * @retval None
5962 */
HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef * htim)5963 __weak void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
5964 {
5965 /* Prevent unused argument(s) compilation warning */
5966 UNUSED(htim);
5967
5968 /* NOTE : This function should not be modified, when the callback is needed,
5969 the HAL_TIM_OC_DelayElapsedCallback could be implemented in the user file
5970 */
5971 }
5972
5973 /**
5974 * @brief Input Capture callback in non-blocking mode
5975 * @param htim TIM IC handle
5976 * @retval None
5977 */
HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef * htim)5978 __weak void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
5979 {
5980 /* Prevent unused argument(s) compilation warning */
5981 UNUSED(htim);
5982
5983 /* NOTE : This function should not be modified, when the callback is needed,
5984 the HAL_TIM_IC_CaptureCallback could be implemented in the user file
5985 */
5986 }
5987
5988 /**
5989 * @brief Input Capture half complete callback in non-blocking mode
5990 * @param htim TIM IC handle
5991 * @retval None
5992 */
HAL_TIM_IC_CaptureHalfCpltCallback(TIM_HandleTypeDef * htim)5993 __weak void HAL_TIM_IC_CaptureHalfCpltCallback(TIM_HandleTypeDef *htim)
5994 {
5995 /* Prevent unused argument(s) compilation warning */
5996 UNUSED(htim);
5997
5998 /* NOTE : This function should not be modified, when the callback is needed,
5999 the HAL_TIM_IC_CaptureHalfCpltCallback could be implemented in the user file
6000 */
6001 }
6002
6003 /**
6004 * @brief PWM Pulse finished callback in non-blocking mode
6005 * @param htim TIM handle
6006 * @retval None
6007 */
HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef * htim)6008 __weak void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
6009 {
6010 /* Prevent unused argument(s) compilation warning */
6011 UNUSED(htim);
6012
6013 /* NOTE : This function should not be modified, when the callback is needed,
6014 the HAL_TIM_PWM_PulseFinishedCallback could be implemented in the user file
6015 */
6016 }
6017
6018 /**
6019 * @brief PWM Pulse finished half complete callback in non-blocking mode
6020 * @param htim TIM handle
6021 * @retval None
6022 */
HAL_TIM_PWM_PulseFinishedHalfCpltCallback(TIM_HandleTypeDef * htim)6023 __weak void HAL_TIM_PWM_PulseFinishedHalfCpltCallback(TIM_HandleTypeDef *htim)
6024 {
6025 /* Prevent unused argument(s) compilation warning */
6026 UNUSED(htim);
6027
6028 /* NOTE : This function should not be modified, when the callback is needed,
6029 the HAL_TIM_PWM_PulseFinishedHalfCpltCallback could be implemented in the user file
6030 */
6031 }
6032
6033 /**
6034 * @brief Hall Trigger detection callback in non-blocking mode
6035 * @param htim TIM handle
6036 * @retval None
6037 */
HAL_TIM_TriggerCallback(TIM_HandleTypeDef * htim)6038 __weak void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim)
6039 {
6040 /* Prevent unused argument(s) compilation warning */
6041 UNUSED(htim);
6042
6043 /* NOTE : This function should not be modified, when the callback is needed,
6044 the HAL_TIM_TriggerCallback could be implemented in the user file
6045 */
6046 }
6047
6048 /**
6049 * @brief Hall Trigger detection half complete callback in non-blocking mode
6050 * @param htim TIM handle
6051 * @retval None
6052 */
HAL_TIM_TriggerHalfCpltCallback(TIM_HandleTypeDef * htim)6053 __weak void HAL_TIM_TriggerHalfCpltCallback(TIM_HandleTypeDef *htim)
6054 {
6055 /* Prevent unused argument(s) compilation warning */
6056 UNUSED(htim);
6057
6058 /* NOTE : This function should not be modified, when the callback is needed,
6059 the HAL_TIM_TriggerHalfCpltCallback could be implemented in the user file
6060 */
6061 }
6062
6063 /**
6064 * @brief Timer error callback in non-blocking mode
6065 * @param htim TIM handle
6066 * @retval None
6067 */
HAL_TIM_ErrorCallback(TIM_HandleTypeDef * htim)6068 __weak void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim)
6069 {
6070 /* Prevent unused argument(s) compilation warning */
6071 UNUSED(htim);
6072
6073 /* NOTE : This function should not be modified, when the callback is needed,
6074 the HAL_TIM_ErrorCallback could be implemented in the user file
6075 */
6076 }
6077
6078 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
6079 /**
6080 * @brief Register a User TIM callback to be used instead of the weak predefined callback
6081 * @param htim tim handle
6082 * @param CallbackID ID of the callback to be registered
6083 * This parameter can be one of the following values:
6084 * @arg @ref HAL_TIM_BASE_MSPINIT_CB_ID Base MspInit Callback ID
6085 * @arg @ref HAL_TIM_BASE_MSPDEINIT_CB_ID Base MspDeInit Callback ID
6086 * @arg @ref HAL_TIM_IC_MSPINIT_CB_ID IC MspInit Callback ID
6087 * @arg @ref HAL_TIM_IC_MSPDEINIT_CB_ID IC MspDeInit Callback ID
6088 * @arg @ref HAL_TIM_OC_MSPINIT_CB_ID OC MspInit Callback ID
6089 * @arg @ref HAL_TIM_OC_MSPDEINIT_CB_ID OC MspDeInit Callback ID
6090 * @arg @ref HAL_TIM_PWM_MSPINIT_CB_ID PWM MspInit Callback ID
6091 * @arg @ref HAL_TIM_PWM_MSPDEINIT_CB_ID PWM MspDeInit Callback ID
6092 * @arg @ref HAL_TIM_ONE_PULSE_MSPINIT_CB_ID One Pulse MspInit Callback ID
6093 * @arg @ref HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID One Pulse MspDeInit Callback ID
6094 * @arg @ref HAL_TIM_ENCODER_MSPINIT_CB_ID Encoder MspInit Callback ID
6095 * @arg @ref HAL_TIM_ENCODER_MSPDEINIT_CB_ID Encoder MspDeInit Callback ID
6096 * @arg @ref HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID Hall Sensor MspInit Callback ID
6097 * @arg @ref HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID Hall Sensor MspDeInit Callback ID
6098 * @arg @ref HAL_TIM_PERIOD_ELAPSED_CB_ID Period Elapsed Callback ID
6099 * @arg @ref HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID Period Elapsed half complete Callback ID
6100 * @arg @ref HAL_TIM_TRIGGER_CB_ID Trigger Callback ID
6101 * @arg @ref HAL_TIM_TRIGGER_HALF_CB_ID Trigger half complete Callback ID
6102 * @arg @ref HAL_TIM_IC_CAPTURE_CB_ID Input Capture Callback ID
6103 * @arg @ref HAL_TIM_IC_CAPTURE_HALF_CB_ID Input Capture half complete Callback ID
6104 * @arg @ref HAL_TIM_OC_DELAY_ELAPSED_CB_ID Output Compare Delay Elapsed Callback ID
6105 * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_CB_ID PWM Pulse Finished Callback ID
6106 * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID PWM Pulse Finished half complete Callback ID
6107 * @arg @ref HAL_TIM_ERROR_CB_ID Error Callback ID
6108 * @arg @ref HAL_TIM_COMMUTATION_CB_ID Commutation Callback ID
6109 * @arg @ref HAL_TIM_COMMUTATION_HALF_CB_ID Commutation half complete Callback ID
6110 * @arg @ref HAL_TIM_BREAK_CB_ID Break Callback ID
6111 * @arg @ref HAL_TIM_BREAK2_CB_ID Break2 Callback ID
6112 * @arg @ref HAL_TIM_ENCODER_INDEX_CB_ID Encoder Index Callback ID
6113 * @arg @ref HAL_TIM_DIRECTION_CHANGE_CB_ID Direction Change Callback ID
6114 * @arg @ref HAL_TIM_INDEX_ERROR_CB_ID Index Error Callback ID
6115 * @arg @ref HAL_TIM_TRANSITION_ERROR_CB_ID Transition Error Callback ID
6116 * @param pCallback pointer to the callback function
6117 * @retval status
6118 */
HAL_TIM_RegisterCallback(TIM_HandleTypeDef * htim,HAL_TIM_CallbackIDTypeDef CallbackID,pTIM_CallbackTypeDef pCallback)6119 HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID,
6120 pTIM_CallbackTypeDef pCallback)
6121 {
6122 HAL_StatusTypeDef status = HAL_OK;
6123
6124 if (pCallback == NULL)
6125 {
6126 return HAL_ERROR;
6127 }
6128
6129 if (htim->State == HAL_TIM_STATE_READY)
6130 {
6131 switch (CallbackID)
6132 {
6133 case HAL_TIM_BASE_MSPINIT_CB_ID :
6134 htim->Base_MspInitCallback = pCallback;
6135 break;
6136
6137 case HAL_TIM_BASE_MSPDEINIT_CB_ID :
6138 htim->Base_MspDeInitCallback = pCallback;
6139 break;
6140
6141 case HAL_TIM_IC_MSPINIT_CB_ID :
6142 htim->IC_MspInitCallback = pCallback;
6143 break;
6144
6145 case HAL_TIM_IC_MSPDEINIT_CB_ID :
6146 htim->IC_MspDeInitCallback = pCallback;
6147 break;
6148
6149 case HAL_TIM_OC_MSPINIT_CB_ID :
6150 htim->OC_MspInitCallback = pCallback;
6151 break;
6152
6153 case HAL_TIM_OC_MSPDEINIT_CB_ID :
6154 htim->OC_MspDeInitCallback = pCallback;
6155 break;
6156
6157 case HAL_TIM_PWM_MSPINIT_CB_ID :
6158 htim->PWM_MspInitCallback = pCallback;
6159 break;
6160
6161 case HAL_TIM_PWM_MSPDEINIT_CB_ID :
6162 htim->PWM_MspDeInitCallback = pCallback;
6163 break;
6164
6165 case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID :
6166 htim->OnePulse_MspInitCallback = pCallback;
6167 break;
6168
6169 case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID :
6170 htim->OnePulse_MspDeInitCallback = pCallback;
6171 break;
6172
6173 case HAL_TIM_ENCODER_MSPINIT_CB_ID :
6174 htim->Encoder_MspInitCallback = pCallback;
6175 break;
6176
6177 case HAL_TIM_ENCODER_MSPDEINIT_CB_ID :
6178 htim->Encoder_MspDeInitCallback = pCallback;
6179 break;
6180
6181 case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID :
6182 htim->HallSensor_MspInitCallback = pCallback;
6183 break;
6184
6185 case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID :
6186 htim->HallSensor_MspDeInitCallback = pCallback;
6187 break;
6188
6189 case HAL_TIM_PERIOD_ELAPSED_CB_ID :
6190 htim->PeriodElapsedCallback = pCallback;
6191 break;
6192
6193 case HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID :
6194 htim->PeriodElapsedHalfCpltCallback = pCallback;
6195 break;
6196
6197 case HAL_TIM_TRIGGER_CB_ID :
6198 htim->TriggerCallback = pCallback;
6199 break;
6200
6201 case HAL_TIM_TRIGGER_HALF_CB_ID :
6202 htim->TriggerHalfCpltCallback = pCallback;
6203 break;
6204
6205 case HAL_TIM_IC_CAPTURE_CB_ID :
6206 htim->IC_CaptureCallback = pCallback;
6207 break;
6208
6209 case HAL_TIM_IC_CAPTURE_HALF_CB_ID :
6210 htim->IC_CaptureHalfCpltCallback = pCallback;
6211 break;
6212
6213 case HAL_TIM_OC_DELAY_ELAPSED_CB_ID :
6214 htim->OC_DelayElapsedCallback = pCallback;
6215 break;
6216
6217 case HAL_TIM_PWM_PULSE_FINISHED_CB_ID :
6218 htim->PWM_PulseFinishedCallback = pCallback;
6219 break;
6220
6221 case HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID :
6222 htim->PWM_PulseFinishedHalfCpltCallback = pCallback;
6223 break;
6224
6225 case HAL_TIM_ERROR_CB_ID :
6226 htim->ErrorCallback = pCallback;
6227 break;
6228
6229 case HAL_TIM_COMMUTATION_CB_ID :
6230 htim->CommutationCallback = pCallback;
6231 break;
6232
6233 case HAL_TIM_COMMUTATION_HALF_CB_ID :
6234 htim->CommutationHalfCpltCallback = pCallback;
6235 break;
6236
6237 case HAL_TIM_BREAK_CB_ID :
6238 htim->BreakCallback = pCallback;
6239 break;
6240
6241 case HAL_TIM_BREAK2_CB_ID :
6242 htim->Break2Callback = pCallback;
6243 break;
6244
6245 case HAL_TIM_ENCODER_INDEX_CB_ID :
6246 htim->EncoderIndexCallback = pCallback;
6247 break;
6248
6249 case HAL_TIM_DIRECTION_CHANGE_CB_ID :
6250 htim->DirectionChangeCallback = pCallback;
6251 break;
6252
6253 case HAL_TIM_INDEX_ERROR_CB_ID :
6254 htim->IndexErrorCallback = pCallback;
6255 break;
6256
6257 case HAL_TIM_TRANSITION_ERROR_CB_ID :
6258 htim->TransitionErrorCallback = pCallback;
6259 break;
6260
6261 default :
6262 /* Return error status */
6263 status = HAL_ERROR;
6264 break;
6265 }
6266 }
6267 else if (htim->State == HAL_TIM_STATE_RESET)
6268 {
6269 switch (CallbackID)
6270 {
6271 case HAL_TIM_BASE_MSPINIT_CB_ID :
6272 htim->Base_MspInitCallback = pCallback;
6273 break;
6274
6275 case HAL_TIM_BASE_MSPDEINIT_CB_ID :
6276 htim->Base_MspDeInitCallback = pCallback;
6277 break;
6278
6279 case HAL_TIM_IC_MSPINIT_CB_ID :
6280 htim->IC_MspInitCallback = pCallback;
6281 break;
6282
6283 case HAL_TIM_IC_MSPDEINIT_CB_ID :
6284 htim->IC_MspDeInitCallback = pCallback;
6285 break;
6286
6287 case HAL_TIM_OC_MSPINIT_CB_ID :
6288 htim->OC_MspInitCallback = pCallback;
6289 break;
6290
6291 case HAL_TIM_OC_MSPDEINIT_CB_ID :
6292 htim->OC_MspDeInitCallback = pCallback;
6293 break;
6294
6295 case HAL_TIM_PWM_MSPINIT_CB_ID :
6296 htim->PWM_MspInitCallback = pCallback;
6297 break;
6298
6299 case HAL_TIM_PWM_MSPDEINIT_CB_ID :
6300 htim->PWM_MspDeInitCallback = pCallback;
6301 break;
6302
6303 case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID :
6304 htim->OnePulse_MspInitCallback = pCallback;
6305 break;
6306
6307 case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID :
6308 htim->OnePulse_MspDeInitCallback = pCallback;
6309 break;
6310
6311 case HAL_TIM_ENCODER_MSPINIT_CB_ID :
6312 htim->Encoder_MspInitCallback = pCallback;
6313 break;
6314
6315 case HAL_TIM_ENCODER_MSPDEINIT_CB_ID :
6316 htim->Encoder_MspDeInitCallback = pCallback;
6317 break;
6318
6319 case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID :
6320 htim->HallSensor_MspInitCallback = pCallback;
6321 break;
6322
6323 case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID :
6324 htim->HallSensor_MspDeInitCallback = pCallback;
6325 break;
6326
6327 default :
6328 /* Return error status */
6329 status = HAL_ERROR;
6330 break;
6331 }
6332 }
6333 else
6334 {
6335 /* Return error status */
6336 status = HAL_ERROR;
6337 }
6338
6339 return status;
6340 }
6341
6342 /**
6343 * @brief Unregister a TIM callback
6344 * TIM callback is redirected to the weak predefined callback
6345 * @param htim tim handle
6346 * @param CallbackID ID of the callback to be unregistered
6347 * This parameter can be one of the following values:
6348 * @arg @ref HAL_TIM_BASE_MSPINIT_CB_ID Base MspInit Callback ID
6349 * @arg @ref HAL_TIM_BASE_MSPDEINIT_CB_ID Base MspDeInit Callback ID
6350 * @arg @ref HAL_TIM_IC_MSPINIT_CB_ID IC MspInit Callback ID
6351 * @arg @ref HAL_TIM_IC_MSPDEINIT_CB_ID IC MspDeInit Callback ID
6352 * @arg @ref HAL_TIM_OC_MSPINIT_CB_ID OC MspInit Callback ID
6353 * @arg @ref HAL_TIM_OC_MSPDEINIT_CB_ID OC MspDeInit Callback ID
6354 * @arg @ref HAL_TIM_PWM_MSPINIT_CB_ID PWM MspInit Callback ID
6355 * @arg @ref HAL_TIM_PWM_MSPDEINIT_CB_ID PWM MspDeInit Callback ID
6356 * @arg @ref HAL_TIM_ONE_PULSE_MSPINIT_CB_ID One Pulse MspInit Callback ID
6357 * @arg @ref HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID One Pulse MspDeInit Callback ID
6358 * @arg @ref HAL_TIM_ENCODER_MSPINIT_CB_ID Encoder MspInit Callback ID
6359 * @arg @ref HAL_TIM_ENCODER_MSPDEINIT_CB_ID Encoder MspDeInit Callback ID
6360 * @arg @ref HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID Hall Sensor MspInit Callback ID
6361 * @arg @ref HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID Hall Sensor MspDeInit Callback ID
6362 * @arg @ref HAL_TIM_PERIOD_ELAPSED_CB_ID Period Elapsed Callback ID
6363 * @arg @ref HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID Period Elapsed half complete Callback ID
6364 * @arg @ref HAL_TIM_TRIGGER_CB_ID Trigger Callback ID
6365 * @arg @ref HAL_TIM_TRIGGER_HALF_CB_ID Trigger half complete Callback ID
6366 * @arg @ref HAL_TIM_IC_CAPTURE_CB_ID Input Capture Callback ID
6367 * @arg @ref HAL_TIM_IC_CAPTURE_HALF_CB_ID Input Capture half complete Callback ID
6368 * @arg @ref HAL_TIM_OC_DELAY_ELAPSED_CB_ID Output Compare Delay Elapsed Callback ID
6369 * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_CB_ID PWM Pulse Finished Callback ID
6370 * @arg @ref HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID PWM Pulse Finished half complete Callback ID
6371 * @arg @ref HAL_TIM_ERROR_CB_ID Error Callback ID
6372 * @arg @ref HAL_TIM_COMMUTATION_CB_ID Commutation Callback ID
6373 * @arg @ref HAL_TIM_COMMUTATION_HALF_CB_ID Commutation half complete Callback ID
6374 * @arg @ref HAL_TIM_BREAK_CB_ID Break Callback ID
6375 * @arg @ref HAL_TIM_BREAK2_CB_ID Break2 Callback ID
6376 * @arg @ref HAL_TIM_ENCODER_INDEX_CB_ID Encoder Index Callback ID
6377 * @arg @ref HAL_TIM_DIRECTION_CHANGE_CB_ID Direction Change Callback ID
6378 * @arg @ref HAL_TIM_INDEX_ERROR_CB_ID Index Error Callback ID
6379 * @arg @ref HAL_TIM_TRANSITION_ERROR_CB_ID Transition Error Callback ID
6380 * @retval status
6381 */
HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef * htim,HAL_TIM_CallbackIDTypeDef CallbackID)6382 HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID)
6383 {
6384 HAL_StatusTypeDef status = HAL_OK;
6385
6386 if (htim->State == HAL_TIM_STATE_READY)
6387 {
6388 switch (CallbackID)
6389 {
6390 case HAL_TIM_BASE_MSPINIT_CB_ID :
6391 /* Legacy weak Base MspInit Callback */
6392 htim->Base_MspInitCallback = HAL_TIM_Base_MspInit;
6393 break;
6394
6395 case HAL_TIM_BASE_MSPDEINIT_CB_ID :
6396 /* Legacy weak Base Msp DeInit Callback */
6397 htim->Base_MspDeInitCallback = HAL_TIM_Base_MspDeInit;
6398 break;
6399
6400 case HAL_TIM_IC_MSPINIT_CB_ID :
6401 /* Legacy weak IC Msp Init Callback */
6402 htim->IC_MspInitCallback = HAL_TIM_IC_MspInit;
6403 break;
6404
6405 case HAL_TIM_IC_MSPDEINIT_CB_ID :
6406 /* Legacy weak IC Msp DeInit Callback */
6407 htim->IC_MspDeInitCallback = HAL_TIM_IC_MspDeInit;
6408 break;
6409
6410 case HAL_TIM_OC_MSPINIT_CB_ID :
6411 /* Legacy weak OC Msp Init Callback */
6412 htim->OC_MspInitCallback = HAL_TIM_OC_MspInit;
6413 break;
6414
6415 case HAL_TIM_OC_MSPDEINIT_CB_ID :
6416 /* Legacy weak OC Msp DeInit Callback */
6417 htim->OC_MspDeInitCallback = HAL_TIM_OC_MspDeInit;
6418 break;
6419
6420 case HAL_TIM_PWM_MSPINIT_CB_ID :
6421 /* Legacy weak PWM Msp Init Callback */
6422 htim->PWM_MspInitCallback = HAL_TIM_PWM_MspInit;
6423 break;
6424
6425 case HAL_TIM_PWM_MSPDEINIT_CB_ID :
6426 /* Legacy weak PWM Msp DeInit Callback */
6427 htim->PWM_MspDeInitCallback = HAL_TIM_PWM_MspDeInit;
6428 break;
6429
6430 case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID :
6431 /* Legacy weak One Pulse Msp Init Callback */
6432 htim->OnePulse_MspInitCallback = HAL_TIM_OnePulse_MspInit;
6433 break;
6434
6435 case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID :
6436 /* Legacy weak One Pulse Msp DeInit Callback */
6437 htim->OnePulse_MspDeInitCallback = HAL_TIM_OnePulse_MspDeInit;
6438 break;
6439
6440 case HAL_TIM_ENCODER_MSPINIT_CB_ID :
6441 /* Legacy weak Encoder Msp Init Callback */
6442 htim->Encoder_MspInitCallback = HAL_TIM_Encoder_MspInit;
6443 break;
6444
6445 case HAL_TIM_ENCODER_MSPDEINIT_CB_ID :
6446 /* Legacy weak Encoder Msp DeInit Callback */
6447 htim->Encoder_MspDeInitCallback = HAL_TIM_Encoder_MspDeInit;
6448 break;
6449
6450 case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID :
6451 /* Legacy weak Hall Sensor Msp Init Callback */
6452 htim->HallSensor_MspInitCallback = HAL_TIMEx_HallSensor_MspInit;
6453 break;
6454
6455 case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID :
6456 /* Legacy weak Hall Sensor Msp DeInit Callback */
6457 htim->HallSensor_MspDeInitCallback = HAL_TIMEx_HallSensor_MspDeInit;
6458 break;
6459
6460 case HAL_TIM_PERIOD_ELAPSED_CB_ID :
6461 /* Legacy weak Period Elapsed Callback */
6462 htim->PeriodElapsedCallback = HAL_TIM_PeriodElapsedCallback;
6463 break;
6464
6465 case HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID :
6466 /* Legacy weak Period Elapsed half complete Callback */
6467 htim->PeriodElapsedHalfCpltCallback = HAL_TIM_PeriodElapsedHalfCpltCallback;
6468 break;
6469
6470 case HAL_TIM_TRIGGER_CB_ID :
6471 /* Legacy weak Trigger Callback */
6472 htim->TriggerCallback = HAL_TIM_TriggerCallback;
6473 break;
6474
6475 case HAL_TIM_TRIGGER_HALF_CB_ID :
6476 /* Legacy weak Trigger half complete Callback */
6477 htim->TriggerHalfCpltCallback = HAL_TIM_TriggerHalfCpltCallback;
6478 break;
6479
6480 case HAL_TIM_IC_CAPTURE_CB_ID :
6481 /* Legacy weak IC Capture Callback */
6482 htim->IC_CaptureCallback = HAL_TIM_IC_CaptureCallback;
6483 break;
6484
6485 case HAL_TIM_IC_CAPTURE_HALF_CB_ID :
6486 /* Legacy weak IC Capture half complete Callback */
6487 htim->IC_CaptureHalfCpltCallback = HAL_TIM_IC_CaptureHalfCpltCallback;
6488 break;
6489
6490 case HAL_TIM_OC_DELAY_ELAPSED_CB_ID :
6491 /* Legacy weak OC Delay Elapsed Callback */
6492 htim->OC_DelayElapsedCallback = HAL_TIM_OC_DelayElapsedCallback;
6493 break;
6494
6495 case HAL_TIM_PWM_PULSE_FINISHED_CB_ID :
6496 /* Legacy weak PWM Pulse Finished Callback */
6497 htim->PWM_PulseFinishedCallback = HAL_TIM_PWM_PulseFinishedCallback;
6498 break;
6499
6500 case HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID :
6501 /* Legacy weak PWM Pulse Finished half complete Callback */
6502 htim->PWM_PulseFinishedHalfCpltCallback = HAL_TIM_PWM_PulseFinishedHalfCpltCallback;
6503 break;
6504
6505 case HAL_TIM_ERROR_CB_ID :
6506 /* Legacy weak Error Callback */
6507 htim->ErrorCallback = HAL_TIM_ErrorCallback;
6508 break;
6509
6510 case HAL_TIM_COMMUTATION_CB_ID :
6511 /* Legacy weak Commutation Callback */
6512 htim->CommutationCallback = HAL_TIMEx_CommutCallback;
6513 break;
6514
6515 case HAL_TIM_COMMUTATION_HALF_CB_ID :
6516 /* Legacy weak Commutation half complete Callback */
6517 htim->CommutationHalfCpltCallback = HAL_TIMEx_CommutHalfCpltCallback;
6518 break;
6519
6520 case HAL_TIM_BREAK_CB_ID :
6521 /* Legacy weak Break Callback */
6522 htim->BreakCallback = HAL_TIMEx_BreakCallback;
6523 break;
6524
6525 case HAL_TIM_BREAK2_CB_ID :
6526 /* Legacy weak Break2 Callback */
6527 htim->Break2Callback = HAL_TIMEx_Break2Callback;
6528 break;
6529
6530 case HAL_TIM_ENCODER_INDEX_CB_ID :
6531 /* Legacy weak Encoder Index Callback */
6532 htim->EncoderIndexCallback = HAL_TIMEx_EncoderIndexCallback;
6533 break;
6534
6535 case HAL_TIM_DIRECTION_CHANGE_CB_ID :
6536 /* Legacy weak Direction Change Callback */
6537 htim->DirectionChangeCallback = HAL_TIMEx_DirectionChangeCallback;
6538 break;
6539
6540 case HAL_TIM_INDEX_ERROR_CB_ID :
6541 /* Legacy weak Index Error Callback */
6542 htim->IndexErrorCallback = HAL_TIMEx_IndexErrorCallback;
6543 break;
6544
6545 case HAL_TIM_TRANSITION_ERROR_CB_ID :
6546 /* Legacy weak Transition Error Callback */
6547 htim->TransitionErrorCallback = HAL_TIMEx_TransitionErrorCallback;
6548 break;
6549
6550 default :
6551 /* Return error status */
6552 status = HAL_ERROR;
6553 break;
6554 }
6555 }
6556 else if (htim->State == HAL_TIM_STATE_RESET)
6557 {
6558 switch (CallbackID)
6559 {
6560 case HAL_TIM_BASE_MSPINIT_CB_ID :
6561 /* Legacy weak Base MspInit Callback */
6562 htim->Base_MspInitCallback = HAL_TIM_Base_MspInit;
6563 break;
6564
6565 case HAL_TIM_BASE_MSPDEINIT_CB_ID :
6566 /* Legacy weak Base Msp DeInit Callback */
6567 htim->Base_MspDeInitCallback = HAL_TIM_Base_MspDeInit;
6568 break;
6569
6570 case HAL_TIM_IC_MSPINIT_CB_ID :
6571 /* Legacy weak IC Msp Init Callback */
6572 htim->IC_MspInitCallback = HAL_TIM_IC_MspInit;
6573 break;
6574
6575 case HAL_TIM_IC_MSPDEINIT_CB_ID :
6576 /* Legacy weak IC Msp DeInit Callback */
6577 htim->IC_MspDeInitCallback = HAL_TIM_IC_MspDeInit;
6578 break;
6579
6580 case HAL_TIM_OC_MSPINIT_CB_ID :
6581 /* Legacy weak OC Msp Init Callback */
6582 htim->OC_MspInitCallback = HAL_TIM_OC_MspInit;
6583 break;
6584
6585 case HAL_TIM_OC_MSPDEINIT_CB_ID :
6586 /* Legacy weak OC Msp DeInit Callback */
6587 htim->OC_MspDeInitCallback = HAL_TIM_OC_MspDeInit;
6588 break;
6589
6590 case HAL_TIM_PWM_MSPINIT_CB_ID :
6591 /* Legacy weak PWM Msp Init Callback */
6592 htim->PWM_MspInitCallback = HAL_TIM_PWM_MspInit;
6593 break;
6594
6595 case HAL_TIM_PWM_MSPDEINIT_CB_ID :
6596 /* Legacy weak PWM Msp DeInit Callback */
6597 htim->PWM_MspDeInitCallback = HAL_TIM_PWM_MspDeInit;
6598 break;
6599
6600 case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID :
6601 /* Legacy weak One Pulse Msp Init Callback */
6602 htim->OnePulse_MspInitCallback = HAL_TIM_OnePulse_MspInit;
6603 break;
6604
6605 case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID :
6606 /* Legacy weak One Pulse Msp DeInit Callback */
6607 htim->OnePulse_MspDeInitCallback = HAL_TIM_OnePulse_MspDeInit;
6608 break;
6609
6610 case HAL_TIM_ENCODER_MSPINIT_CB_ID :
6611 /* Legacy weak Encoder Msp Init Callback */
6612 htim->Encoder_MspInitCallback = HAL_TIM_Encoder_MspInit;
6613 break;
6614
6615 case HAL_TIM_ENCODER_MSPDEINIT_CB_ID :
6616 /* Legacy weak Encoder Msp DeInit Callback */
6617 htim->Encoder_MspDeInitCallback = HAL_TIM_Encoder_MspDeInit;
6618 break;
6619
6620 case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID :
6621 /* Legacy weak Hall Sensor Msp Init Callback */
6622 htim->HallSensor_MspInitCallback = HAL_TIMEx_HallSensor_MspInit;
6623 break;
6624
6625 case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID :
6626 /* Legacy weak Hall Sensor Msp DeInit Callback */
6627 htim->HallSensor_MspDeInitCallback = HAL_TIMEx_HallSensor_MspDeInit;
6628 break;
6629
6630 default :
6631 /* Return error status */
6632 status = HAL_ERROR;
6633 break;
6634 }
6635 }
6636 else
6637 {
6638 /* Return error status */
6639 status = HAL_ERROR;
6640 }
6641
6642 return status;
6643 }
6644 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
6645
6646 /**
6647 * @}
6648 */
6649
6650 /** @defgroup TIM_Exported_Functions_Group10 TIM Peripheral State functions
6651 * @brief TIM Peripheral State functions
6652 *
6653 @verbatim
6654 ==============================================================================
6655 ##### Peripheral State functions #####
6656 ==============================================================================
6657 [..]
6658 This subsection permits to get in run-time the status of the peripheral
6659 and the data flow.
6660
6661 @endverbatim
6662 * @{
6663 */
6664
6665 /**
6666 * @brief Return the TIM Base handle state.
6667 * @param htim TIM Base handle
6668 * @retval HAL state
6669 */
HAL_TIM_Base_GetState(const TIM_HandleTypeDef * htim)6670 HAL_TIM_StateTypeDef HAL_TIM_Base_GetState(const TIM_HandleTypeDef *htim)
6671 {
6672 return htim->State;
6673 }
6674
6675 /**
6676 * @brief Return the TIM OC handle state.
6677 * @param htim TIM Output Compare handle
6678 * @retval HAL state
6679 */
HAL_TIM_OC_GetState(const TIM_HandleTypeDef * htim)6680 HAL_TIM_StateTypeDef HAL_TIM_OC_GetState(const TIM_HandleTypeDef *htim)
6681 {
6682 return htim->State;
6683 }
6684
6685 /**
6686 * @brief Return the TIM PWM handle state.
6687 * @param htim TIM handle
6688 * @retval HAL state
6689 */
HAL_TIM_PWM_GetState(const TIM_HandleTypeDef * htim)6690 HAL_TIM_StateTypeDef HAL_TIM_PWM_GetState(const TIM_HandleTypeDef *htim)
6691 {
6692 return htim->State;
6693 }
6694
6695 /**
6696 * @brief Return the TIM Input Capture handle state.
6697 * @param htim TIM IC handle
6698 * @retval HAL state
6699 */
HAL_TIM_IC_GetState(const TIM_HandleTypeDef * htim)6700 HAL_TIM_StateTypeDef HAL_TIM_IC_GetState(const TIM_HandleTypeDef *htim)
6701 {
6702 return htim->State;
6703 }
6704
6705 /**
6706 * @brief Return the TIM One Pulse Mode handle state.
6707 * @param htim TIM OPM handle
6708 * @retval HAL state
6709 */
HAL_TIM_OnePulse_GetState(const TIM_HandleTypeDef * htim)6710 HAL_TIM_StateTypeDef HAL_TIM_OnePulse_GetState(const TIM_HandleTypeDef *htim)
6711 {
6712 return htim->State;
6713 }
6714
6715 /**
6716 * @brief Return the TIM Encoder Mode handle state.
6717 * @param htim TIM Encoder Interface handle
6718 * @retval HAL state
6719 */
HAL_TIM_Encoder_GetState(const TIM_HandleTypeDef * htim)6720 HAL_TIM_StateTypeDef HAL_TIM_Encoder_GetState(const TIM_HandleTypeDef *htim)
6721 {
6722 return htim->State;
6723 }
6724
6725 /**
6726 * @brief Return the TIM Encoder Mode handle state.
6727 * @param htim TIM handle
6728 * @retval Active channel
6729 */
HAL_TIM_GetActiveChannel(const TIM_HandleTypeDef * htim)6730 HAL_TIM_ActiveChannel HAL_TIM_GetActiveChannel(const TIM_HandleTypeDef *htim)
6731 {
6732 return htim->Channel;
6733 }
6734
6735 /**
6736 * @brief Return actual state of the TIM channel.
6737 * @param htim TIM handle
6738 * @param Channel TIM Channel
6739 * This parameter can be one of the following values:
6740 * @arg TIM_CHANNEL_1: TIM Channel 1
6741 * @arg TIM_CHANNEL_2: TIM Channel 2
6742 * @arg TIM_CHANNEL_3: TIM Channel 3
6743 * @arg TIM_CHANNEL_4: TIM Channel 4
6744 * @arg TIM_CHANNEL_5: TIM Channel 5
6745 * @arg TIM_CHANNEL_6: TIM Channel 6
6746 * @retval TIM Channel state
6747 */
HAL_TIM_GetChannelState(const TIM_HandleTypeDef * htim,uint32_t Channel)6748 HAL_TIM_ChannelStateTypeDef HAL_TIM_GetChannelState(const TIM_HandleTypeDef *htim, uint32_t Channel)
6749 {
6750 HAL_TIM_ChannelStateTypeDef channel_state;
6751
6752 /* Check the parameters */
6753 assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel));
6754
6755 channel_state = TIM_CHANNEL_STATE_GET(htim, Channel);
6756
6757 return channel_state;
6758 }
6759
6760 /**
6761 * @brief Return actual state of a DMA burst operation.
6762 * @param htim TIM handle
6763 * @retval DMA burst state
6764 */
HAL_TIM_DMABurstState(const TIM_HandleTypeDef * htim)6765 HAL_TIM_DMABurstStateTypeDef HAL_TIM_DMABurstState(const TIM_HandleTypeDef *htim)
6766 {
6767 /* Check the parameters */
6768 assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance));
6769
6770 return htim->DMABurstState;
6771 }
6772
6773 /**
6774 * @}
6775 */
6776
6777 /**
6778 * @}
6779 */
6780
6781 /** @defgroup TIM_Private_Functions TIM Private Functions
6782 * @{
6783 */
6784
6785 /**
6786 * @brief TIM DMA error callback
6787 * @param hdma pointer to DMA handle.
6788 * @retval None
6789 */
TIM_DMAError(DMA_HandleTypeDef * hdma)6790 void TIM_DMAError(DMA_HandleTypeDef *hdma)
6791 {
6792 TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
6793
6794 if (hdma == htim->hdma[TIM_DMA_ID_CC1])
6795 {
6796 htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1;
6797 TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY);
6798 }
6799 else if (hdma == htim->hdma[TIM_DMA_ID_CC2])
6800 {
6801 htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2;
6802 TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY);
6803 }
6804 else if (hdma == htim->hdma[TIM_DMA_ID_CC3])
6805 {
6806 htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3;
6807 TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY);
6808 }
6809 else if (hdma == htim->hdma[TIM_DMA_ID_CC4])
6810 {
6811 htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4;
6812 TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_4, HAL_TIM_CHANNEL_STATE_READY);
6813 }
6814 else
6815 {
6816 htim->State = HAL_TIM_STATE_READY;
6817 }
6818
6819 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
6820 htim->ErrorCallback(htim);
6821 #else
6822 HAL_TIM_ErrorCallback(htim);
6823 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
6824
6825 htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;
6826 }
6827
6828 /**
6829 * @brief TIM DMA Delay Pulse complete callback.
6830 * @param hdma pointer to DMA handle.
6831 * @retval None
6832 */
TIM_DMADelayPulseCplt(DMA_HandleTypeDef * hdma)6833 static void TIM_DMADelayPulseCplt(DMA_HandleTypeDef *hdma)
6834 {
6835 TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
6836
6837 if (hdma == htim->hdma[TIM_DMA_ID_CC1])
6838 {
6839 htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1;
6840
6841 if (hdma->Init.Mode == DMA_NORMAL)
6842 {
6843 TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY);
6844 }
6845 }
6846 else if (hdma == htim->hdma[TIM_DMA_ID_CC2])
6847 {
6848 htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2;
6849
6850 if (hdma->Init.Mode == DMA_NORMAL)
6851 {
6852 TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY);
6853 }
6854 }
6855 else if (hdma == htim->hdma[TIM_DMA_ID_CC3])
6856 {
6857 htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3;
6858
6859 if (hdma->Init.Mode == DMA_NORMAL)
6860 {
6861 TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY);
6862 }
6863 }
6864 else if (hdma == htim->hdma[TIM_DMA_ID_CC4])
6865 {
6866 htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4;
6867
6868 if (hdma->Init.Mode == DMA_NORMAL)
6869 {
6870 TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_4, HAL_TIM_CHANNEL_STATE_READY);
6871 }
6872 }
6873 else
6874 {
6875 /* nothing to do */
6876 }
6877
6878 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
6879 htim->PWM_PulseFinishedCallback(htim);
6880 #else
6881 HAL_TIM_PWM_PulseFinishedCallback(htim);
6882 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
6883
6884 htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;
6885 }
6886
6887 /**
6888 * @brief TIM DMA Delay Pulse half complete callback.
6889 * @param hdma pointer to DMA handle.
6890 * @retval None
6891 */
TIM_DMADelayPulseHalfCplt(DMA_HandleTypeDef * hdma)6892 void TIM_DMADelayPulseHalfCplt(DMA_HandleTypeDef *hdma)
6893 {
6894 TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
6895
6896 if (hdma == htim->hdma[TIM_DMA_ID_CC1])
6897 {
6898 htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1;
6899 }
6900 else if (hdma == htim->hdma[TIM_DMA_ID_CC2])
6901 {
6902 htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2;
6903 }
6904 else if (hdma == htim->hdma[TIM_DMA_ID_CC3])
6905 {
6906 htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3;
6907 }
6908 else if (hdma == htim->hdma[TIM_DMA_ID_CC4])
6909 {
6910 htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4;
6911 }
6912 else
6913 {
6914 /* nothing to do */
6915 }
6916
6917 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
6918 htim->PWM_PulseFinishedHalfCpltCallback(htim);
6919 #else
6920 HAL_TIM_PWM_PulseFinishedHalfCpltCallback(htim);
6921 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
6922
6923 htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;
6924 }
6925
6926 /**
6927 * @brief TIM DMA Capture complete callback.
6928 * @param hdma pointer to DMA handle.
6929 * @retval None
6930 */
TIM_DMACaptureCplt(DMA_HandleTypeDef * hdma)6931 void TIM_DMACaptureCplt(DMA_HandleTypeDef *hdma)
6932 {
6933 TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
6934
6935 if (hdma == htim->hdma[TIM_DMA_ID_CC1])
6936 {
6937 htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1;
6938
6939 if (hdma->Init.Mode == DMA_NORMAL)
6940 {
6941 TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY);
6942 TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY);
6943 }
6944 }
6945 else if (hdma == htim->hdma[TIM_DMA_ID_CC2])
6946 {
6947 htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2;
6948
6949 if (hdma->Init.Mode == DMA_NORMAL)
6950 {
6951 TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY);
6952 TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY);
6953 }
6954 }
6955 else if (hdma == htim->hdma[TIM_DMA_ID_CC3])
6956 {
6957 htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3;
6958
6959 if (hdma->Init.Mode == DMA_NORMAL)
6960 {
6961 TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY);
6962 TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY);
6963 }
6964 }
6965 else if (hdma == htim->hdma[TIM_DMA_ID_CC4])
6966 {
6967 htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4;
6968
6969 if (hdma->Init.Mode == DMA_NORMAL)
6970 {
6971 TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_4, HAL_TIM_CHANNEL_STATE_READY);
6972 TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_4, HAL_TIM_CHANNEL_STATE_READY);
6973 }
6974 }
6975 else
6976 {
6977 /* nothing to do */
6978 }
6979
6980 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
6981 htim->IC_CaptureCallback(htim);
6982 #else
6983 HAL_TIM_IC_CaptureCallback(htim);
6984 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
6985
6986 htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;
6987 }
6988
6989 /**
6990 * @brief TIM DMA Capture half complete callback.
6991 * @param hdma pointer to DMA handle.
6992 * @retval None
6993 */
TIM_DMACaptureHalfCplt(DMA_HandleTypeDef * hdma)6994 void TIM_DMACaptureHalfCplt(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 }
7002 else if (hdma == htim->hdma[TIM_DMA_ID_CC2])
7003 {
7004 htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2;
7005 }
7006 else if (hdma == htim->hdma[TIM_DMA_ID_CC3])
7007 {
7008 htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3;
7009 }
7010 else if (hdma == htim->hdma[TIM_DMA_ID_CC4])
7011 {
7012 htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4;
7013 }
7014 else
7015 {
7016 /* nothing to do */
7017 }
7018
7019 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
7020 htim->IC_CaptureHalfCpltCallback(htim);
7021 #else
7022 HAL_TIM_IC_CaptureHalfCpltCallback(htim);
7023 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
7024
7025 htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;
7026 }
7027
7028 /**
7029 * @brief TIM DMA Period Elapse complete callback.
7030 * @param hdma pointer to DMA handle.
7031 * @retval None
7032 */
TIM_DMAPeriodElapsedCplt(DMA_HandleTypeDef * hdma)7033 static void TIM_DMAPeriodElapsedCplt(DMA_HandleTypeDef *hdma)
7034 {
7035 TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
7036
7037 if (htim->hdma[TIM_DMA_ID_UPDATE]->Init.Mode == DMA_NORMAL)
7038 {
7039 htim->State = HAL_TIM_STATE_READY;
7040 }
7041
7042 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
7043 htim->PeriodElapsedCallback(htim);
7044 #else
7045 HAL_TIM_PeriodElapsedCallback(htim);
7046 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
7047 }
7048
7049 /**
7050 * @brief TIM DMA Period Elapse half complete callback.
7051 * @param hdma pointer to DMA handle.
7052 * @retval None
7053 */
TIM_DMAPeriodElapsedHalfCplt(DMA_HandleTypeDef * hdma)7054 static void TIM_DMAPeriodElapsedHalfCplt(DMA_HandleTypeDef *hdma)
7055 {
7056 TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
7057
7058 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
7059 htim->PeriodElapsedHalfCpltCallback(htim);
7060 #else
7061 HAL_TIM_PeriodElapsedHalfCpltCallback(htim);
7062 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
7063 }
7064
7065 /**
7066 * @brief TIM DMA Trigger callback.
7067 * @param hdma pointer to DMA handle.
7068 * @retval None
7069 */
TIM_DMATriggerCplt(DMA_HandleTypeDef * hdma)7070 static void TIM_DMATriggerCplt(DMA_HandleTypeDef *hdma)
7071 {
7072 TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
7073
7074 if (htim->hdma[TIM_DMA_ID_TRIGGER]->Init.Mode == DMA_NORMAL)
7075 {
7076 htim->State = HAL_TIM_STATE_READY;
7077 }
7078
7079 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
7080 htim->TriggerCallback(htim);
7081 #else
7082 HAL_TIM_TriggerCallback(htim);
7083 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
7084 }
7085
7086 /**
7087 * @brief TIM DMA Trigger half complete callback.
7088 * @param hdma pointer to DMA handle.
7089 * @retval None
7090 */
TIM_DMATriggerHalfCplt(DMA_HandleTypeDef * hdma)7091 static void TIM_DMATriggerHalfCplt(DMA_HandleTypeDef *hdma)
7092 {
7093 TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
7094
7095 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
7096 htim->TriggerHalfCpltCallback(htim);
7097 #else
7098 HAL_TIM_TriggerHalfCpltCallback(htim);
7099 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
7100 }
7101
7102 /**
7103 * @brief Time Base configuration
7104 * @param TIMx TIM peripheral
7105 * @param Structure TIM Base configuration structure
7106 * @retval None
7107 */
TIM_Base_SetConfig(TIM_TypeDef * TIMx,const TIM_Base_InitTypeDef * Structure)7108 void TIM_Base_SetConfig(TIM_TypeDef *TIMx, const TIM_Base_InitTypeDef *Structure)
7109 {
7110 uint32_t tmpcr1;
7111 tmpcr1 = TIMx->CR1;
7112
7113 /* Set TIM Time Base Unit parameters ---------------------------------------*/
7114 if (IS_TIM_COUNTER_MODE_SELECT_INSTANCE(TIMx))
7115 {
7116 /* Select the Counter Mode */
7117 tmpcr1 &= ~(TIM_CR1_DIR | TIM_CR1_CMS);
7118 tmpcr1 |= Structure->CounterMode;
7119 }
7120
7121 if (IS_TIM_CLOCK_DIVISION_INSTANCE(TIMx))
7122 {
7123 /* Set the clock division */
7124 tmpcr1 &= ~TIM_CR1_CKD;
7125 tmpcr1 |= (uint32_t)Structure->ClockDivision;
7126 }
7127
7128 /* Set the auto-reload preload */
7129 MODIFY_REG(tmpcr1, TIM_CR1_ARPE, Structure->AutoReloadPreload);
7130
7131 TIMx->CR1 = tmpcr1;
7132
7133 /* Set the Autoreload value */
7134 TIMx->ARR = (uint32_t)Structure->Period ;
7135
7136 /* Set the Prescaler value */
7137 TIMx->PSC = Structure->Prescaler;
7138
7139 if (IS_TIM_REPETITION_COUNTER_INSTANCE(TIMx))
7140 {
7141 /* Set the Repetition Counter value */
7142 TIMx->RCR = Structure->RepetitionCounter;
7143 }
7144
7145 /* Generate an update event to reload the Prescaler
7146 and the repetition counter (only for advanced timer) value immediately */
7147 TIMx->EGR = TIM_EGR_UG;
7148
7149 /* Check if the update flag is set after the Update Generation, if so clear the UIF flag */
7150 if (HAL_IS_BIT_SET(TIMx->SR, TIM_FLAG_UPDATE))
7151 {
7152 /* Clear the update flag */
7153 CLEAR_BIT(TIMx->SR, TIM_FLAG_UPDATE);
7154 }
7155 }
7156
7157 /**
7158 * @brief Timer Output Compare 1 configuration
7159 * @param TIMx to select the TIM peripheral
7160 * @param OC_Config The output configuration structure
7161 * @retval None
7162 */
TIM_OC1_SetConfig(TIM_TypeDef * TIMx,const TIM_OC_InitTypeDef * OC_Config)7163 static void TIM_OC1_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config)
7164 {
7165 uint32_t tmpccmrx;
7166 uint32_t tmpccer;
7167 uint32_t tmpcr2;
7168
7169 /* Get the TIMx CCER register value */
7170 tmpccer = TIMx->CCER;
7171
7172 /* Disable the Channel 1: Reset the CC1E Bit */
7173 TIMx->CCER &= ~TIM_CCER_CC1E;
7174
7175 /* Get the TIMx CR2 register value */
7176 tmpcr2 = TIMx->CR2;
7177
7178 /* Get the TIMx CCMR1 register value */
7179 tmpccmrx = TIMx->CCMR1;
7180
7181 /* Reset the Output Compare Mode Bits */
7182 tmpccmrx &= ~TIM_CCMR1_OC1M;
7183 tmpccmrx &= ~TIM_CCMR1_CC1S;
7184 /* Select the Output Compare Mode */
7185 tmpccmrx |= OC_Config->OCMode;
7186
7187 /* Reset the Output Polarity level */
7188 tmpccer &= ~TIM_CCER_CC1P;
7189 /* Set the Output Compare Polarity */
7190 tmpccer |= OC_Config->OCPolarity;
7191
7192 if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_1))
7193 {
7194 /* Check parameters */
7195 assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity));
7196
7197 /* Reset the Output N Polarity level */
7198 tmpccer &= ~TIM_CCER_CC1NP;
7199 /* Set the Output N Polarity */
7200 tmpccer |= OC_Config->OCNPolarity;
7201 /* Reset the Output N State */
7202 tmpccer &= ~TIM_CCER_CC1NE;
7203 }
7204
7205 if (IS_TIM_BREAK_INSTANCE(TIMx))
7206 {
7207 /* Check parameters */
7208 assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState));
7209 assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState));
7210
7211 /* Reset the Output Compare and Output Compare N IDLE State */
7212 tmpcr2 &= ~TIM_CR2_OIS1;
7213 tmpcr2 &= ~TIM_CR2_OIS1N;
7214 /* Set the Output Idle state */
7215 tmpcr2 |= OC_Config->OCIdleState;
7216 /* Set the Output N Idle state */
7217 tmpcr2 |= OC_Config->OCNIdleState;
7218 }
7219
7220 /* Write to TIMx CR2 */
7221 TIMx->CR2 = tmpcr2;
7222
7223 /* Write to TIMx CCMR1 */
7224 TIMx->CCMR1 = tmpccmrx;
7225
7226 /* Set the Capture Compare Register value */
7227 TIMx->CCR1 = OC_Config->Pulse;
7228
7229 /* Write to TIMx CCER */
7230 TIMx->CCER = tmpccer;
7231 }
7232
7233 /**
7234 * @brief Timer Output Compare 2 configuration
7235 * @param TIMx to select the TIM peripheral
7236 * @param OC_Config The output configuration structure
7237 * @retval None
7238 */
TIM_OC2_SetConfig(TIM_TypeDef * TIMx,const TIM_OC_InitTypeDef * OC_Config)7239 void TIM_OC2_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config)
7240 {
7241 uint32_t tmpccmrx;
7242 uint32_t tmpccer;
7243 uint32_t tmpcr2;
7244
7245 /* Get the TIMx CCER register value */
7246 tmpccer = TIMx->CCER;
7247
7248 /* Disable the Channel 2: Reset the CC2E Bit */
7249 TIMx->CCER &= ~TIM_CCER_CC2E;
7250
7251 /* Get the TIMx CR2 register value */
7252 tmpcr2 = TIMx->CR2;
7253
7254 /* Get the TIMx CCMR1 register value */
7255 tmpccmrx = TIMx->CCMR1;
7256
7257 /* Reset the Output Compare mode and Capture/Compare selection Bits */
7258 tmpccmrx &= ~TIM_CCMR1_OC2M;
7259 tmpccmrx &= ~TIM_CCMR1_CC2S;
7260
7261 /* Select the Output Compare Mode */
7262 tmpccmrx |= (OC_Config->OCMode << 8U);
7263
7264 /* Reset the Output Polarity level */
7265 tmpccer &= ~TIM_CCER_CC2P;
7266 /* Set the Output Compare Polarity */
7267 tmpccer |= (OC_Config->OCPolarity << 4U);
7268
7269 if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_2))
7270 {
7271 assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity));
7272
7273 /* Reset the Output N Polarity level */
7274 tmpccer &= ~TIM_CCER_CC2NP;
7275 /* Set the Output N Polarity */
7276 tmpccer |= (OC_Config->OCNPolarity << 4U);
7277 /* Reset the Output N State */
7278 tmpccer &= ~TIM_CCER_CC2NE;
7279 }
7280
7281 if (IS_TIM_BREAK_INSTANCE(TIMx))
7282 {
7283 /* Check parameters */
7284 assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState));
7285 assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState));
7286
7287 /* Reset the Output Compare and Output Compare N IDLE State */
7288 tmpcr2 &= ~TIM_CR2_OIS2;
7289 tmpcr2 &= ~TIM_CR2_OIS2N;
7290 /* Set the Output Idle state */
7291 tmpcr2 |= (OC_Config->OCIdleState << 2U);
7292 /* Set the Output N Idle state */
7293 tmpcr2 |= (OC_Config->OCNIdleState << 2U);
7294 }
7295
7296 /* Write to TIMx CR2 */
7297 TIMx->CR2 = tmpcr2;
7298
7299 /* Write to TIMx CCMR1 */
7300 TIMx->CCMR1 = tmpccmrx;
7301
7302 /* Set the Capture Compare Register value */
7303 TIMx->CCR2 = OC_Config->Pulse;
7304
7305 /* Write to TIMx CCER */
7306 TIMx->CCER = tmpccer;
7307 }
7308
7309 /**
7310 * @brief Timer Output Compare 3 configuration
7311 * @param TIMx to select the TIM peripheral
7312 * @param OC_Config The output configuration structure
7313 * @retval None
7314 */
TIM_OC3_SetConfig(TIM_TypeDef * TIMx,const TIM_OC_InitTypeDef * OC_Config)7315 static void TIM_OC3_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config)
7316 {
7317 uint32_t tmpccmrx;
7318 uint32_t tmpccer;
7319 uint32_t tmpcr2;
7320
7321 /* Get the TIMx CCER register value */
7322 tmpccer = TIMx->CCER;
7323
7324 /* Disable the Channel 3: Reset the CC2E Bit */
7325 TIMx->CCER &= ~TIM_CCER_CC3E;
7326
7327 /* Get the TIMx CR2 register value */
7328 tmpcr2 = TIMx->CR2;
7329
7330 /* Get the TIMx CCMR2 register value */
7331 tmpccmrx = TIMx->CCMR2;
7332
7333 /* Reset the Output Compare mode and Capture/Compare selection Bits */
7334 tmpccmrx &= ~TIM_CCMR2_OC3M;
7335 tmpccmrx &= ~TIM_CCMR2_CC3S;
7336 /* Select the Output Compare Mode */
7337 tmpccmrx |= OC_Config->OCMode;
7338
7339 /* Reset the Output Polarity level */
7340 tmpccer &= ~TIM_CCER_CC3P;
7341 /* Set the Output Compare Polarity */
7342 tmpccer |= (OC_Config->OCPolarity << 8U);
7343
7344 if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_3))
7345 {
7346 assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity));
7347
7348 /* Reset the Output N Polarity level */
7349 tmpccer &= ~TIM_CCER_CC3NP;
7350 /* Set the Output N Polarity */
7351 tmpccer |= (OC_Config->OCNPolarity << 8U);
7352 /* Reset the Output N State */
7353 tmpccer &= ~TIM_CCER_CC3NE;
7354 }
7355
7356 if (IS_TIM_BREAK_INSTANCE(TIMx))
7357 {
7358 /* Check parameters */
7359 assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState));
7360 assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState));
7361
7362 /* Reset the Output Compare and Output Compare N IDLE State */
7363 tmpcr2 &= ~TIM_CR2_OIS3;
7364 tmpcr2 &= ~TIM_CR2_OIS3N;
7365 /* Set the Output Idle state */
7366 tmpcr2 |= (OC_Config->OCIdleState << 4U);
7367 /* Set the Output N Idle state */
7368 tmpcr2 |= (OC_Config->OCNIdleState << 4U);
7369 }
7370
7371 /* Write to TIMx CR2 */
7372 TIMx->CR2 = tmpcr2;
7373
7374 /* Write to TIMx CCMR2 */
7375 TIMx->CCMR2 = tmpccmrx;
7376
7377 /* Set the Capture Compare Register value */
7378 TIMx->CCR3 = OC_Config->Pulse;
7379
7380 /* Write to TIMx CCER */
7381 TIMx->CCER = tmpccer;
7382 }
7383
7384 /**
7385 * @brief Timer Output Compare 4 configuration
7386 * @param TIMx to select the TIM peripheral
7387 * @param OC_Config The output configuration structure
7388 * @retval None
7389 */
TIM_OC4_SetConfig(TIM_TypeDef * TIMx,const TIM_OC_InitTypeDef * OC_Config)7390 static void TIM_OC4_SetConfig(TIM_TypeDef *TIMx, const TIM_OC_InitTypeDef *OC_Config)
7391 {
7392 uint32_t tmpccmrx;
7393 uint32_t tmpccer;
7394 uint32_t tmpcr2;
7395
7396 /* Get the TIMx CCER register value */
7397 tmpccer = TIMx->CCER;
7398
7399 /* Disable the Channel 4: Reset the CC4E Bit */
7400 TIMx->CCER &= ~TIM_CCER_CC4E;
7401
7402 /* Get the TIMx CR2 register value */
7403 tmpcr2 = TIMx->CR2;
7404
7405 /* Get the TIMx CCMR2 register value */
7406 tmpccmrx = TIMx->CCMR2;
7407
7408 /* Reset the Output Compare mode and Capture/Compare selection Bits */
7409 tmpccmrx &= ~TIM_CCMR2_OC4M;
7410 tmpccmrx &= ~TIM_CCMR2_CC4S;
7411
7412 /* Select the Output Compare Mode */
7413 tmpccmrx |= (OC_Config->OCMode << 8U);
7414
7415 /* Reset the Output Polarity level */
7416 tmpccer &= ~TIM_CCER_CC4P;
7417 /* Set the Output Compare Polarity */
7418 tmpccer |= (OC_Config->OCPolarity << 12U);
7419
7420 if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_4))
7421 {
7422 assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity));
7423
7424 /* Reset the Output N Polarity level */
7425 tmpccer &= ~TIM_CCER_CC4NP;
7426 /* Set the Output N Polarity */
7427 tmpccer |= (OC_Config->OCNPolarity << 12U);
7428 /* Reset the Output N State */
7429 tmpccer &= ~TIM_CCER_CC4NE;
7430 }
7431
7432 if (IS_TIM_BREAK_INSTANCE(TIMx))
7433 {
7434 /* Check parameters */
7435 assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState));
7436 assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState));
7437
7438 /* Reset the Output Compare IDLE State */
7439 tmpcr2 &= ~TIM_CR2_OIS4;
7440 /* Reset the Output Compare N IDLE State */
7441 tmpcr2 &= ~TIM_CR2_OIS4N;
7442
7443 /* Set the Output Idle state */
7444 tmpcr2 |= (OC_Config->OCIdleState << 6U);
7445 /* Set the Output N Idle state */
7446 tmpcr2 |= (OC_Config->OCNIdleState << 6U);
7447 }
7448
7449 /* Write to TIMx CR2 */
7450 TIMx->CR2 = tmpcr2;
7451
7452 /* Write to TIMx CCMR2 */
7453 TIMx->CCMR2 = tmpccmrx;
7454
7455 /* Set the Capture Compare Register value */
7456 TIMx->CCR4 = OC_Config->Pulse;
7457
7458 /* Write to TIMx CCER */
7459 TIMx->CCER = tmpccer;
7460 }
7461
7462 /**
7463 * @brief Timer Output Compare 5 configuration
7464 * @param TIMx to select the TIM peripheral
7465 * @param OC_Config The output configuration structure
7466 * @retval None
7467 */
TIM_OC5_SetConfig(TIM_TypeDef * TIMx,const TIM_OC_InitTypeDef * OC_Config)7468 static void TIM_OC5_SetConfig(TIM_TypeDef *TIMx,
7469 const TIM_OC_InitTypeDef *OC_Config)
7470 {
7471 uint32_t tmpccmrx;
7472 uint32_t tmpccer;
7473 uint32_t tmpcr2;
7474
7475 /* Get the TIMx CCER register value */
7476 tmpccer = TIMx->CCER;
7477
7478 /* Disable the output: Reset the CCxE Bit */
7479 TIMx->CCER &= ~TIM_CCER_CC5E;
7480
7481 /* Get the TIMx CR2 register value */
7482 tmpcr2 = TIMx->CR2;
7483 /* Get the TIMx CCMR1 register value */
7484 tmpccmrx = TIMx->CCMR3;
7485
7486 /* Reset the Output Compare Mode Bits */
7487 tmpccmrx &= ~(TIM_CCMR3_OC5M);
7488 /* Select the Output Compare Mode */
7489 tmpccmrx |= OC_Config->OCMode;
7490
7491 /* Reset the Output Polarity level */
7492 tmpccer &= ~TIM_CCER_CC5P;
7493 /* Set the Output Compare Polarity */
7494 tmpccer |= (OC_Config->OCPolarity << 16U);
7495
7496 if (IS_TIM_BREAK_INSTANCE(TIMx))
7497 {
7498 /* Reset the Output Compare IDLE State */
7499 tmpcr2 &= ~TIM_CR2_OIS5;
7500 /* Set the Output Idle state */
7501 tmpcr2 |= (OC_Config->OCIdleState << 8U);
7502 }
7503 /* Write to TIMx CR2 */
7504 TIMx->CR2 = tmpcr2;
7505
7506 /* Write to TIMx CCMR3 */
7507 TIMx->CCMR3 = tmpccmrx;
7508
7509 /* Set the Capture Compare Register value */
7510 TIMx->CCR5 = OC_Config->Pulse;
7511
7512 /* Write to TIMx CCER */
7513 TIMx->CCER = tmpccer;
7514 }
7515
7516 /**
7517 * @brief Timer Output Compare 6 configuration
7518 * @param TIMx to select the TIM peripheral
7519 * @param OC_Config The output configuration structure
7520 * @retval None
7521 */
TIM_OC6_SetConfig(TIM_TypeDef * TIMx,const TIM_OC_InitTypeDef * OC_Config)7522 static void TIM_OC6_SetConfig(TIM_TypeDef *TIMx,
7523 const TIM_OC_InitTypeDef *OC_Config)
7524 {
7525 uint32_t tmpccmrx;
7526 uint32_t tmpccer;
7527 uint32_t tmpcr2;
7528
7529 /* Get the TIMx CCER register value */
7530 tmpccer = TIMx->CCER;
7531
7532 /* Disable the output: Reset the CCxE Bit */
7533 TIMx->CCER &= ~TIM_CCER_CC6E;
7534
7535 /* Get the TIMx CR2 register value */
7536 tmpcr2 = TIMx->CR2;
7537 /* Get the TIMx CCMR1 register value */
7538 tmpccmrx = TIMx->CCMR3;
7539
7540 /* Reset the Output Compare Mode Bits */
7541 tmpccmrx &= ~(TIM_CCMR3_OC6M);
7542 /* Select the Output Compare Mode */
7543 tmpccmrx |= (OC_Config->OCMode << 8U);
7544
7545 /* Reset the Output Polarity level */
7546 tmpccer &= (uint32_t)~TIM_CCER_CC6P;
7547 /* Set the Output Compare Polarity */
7548 tmpccer |= (OC_Config->OCPolarity << 20U);
7549
7550 if (IS_TIM_BREAK_INSTANCE(TIMx))
7551 {
7552 /* Reset the Output Compare IDLE State */
7553 tmpcr2 &= ~TIM_CR2_OIS6;
7554 /* Set the Output Idle state */
7555 tmpcr2 |= (OC_Config->OCIdleState << 10U);
7556 }
7557
7558 /* Write to TIMx CR2 */
7559 TIMx->CR2 = tmpcr2;
7560
7561 /* Write to TIMx CCMR3 */
7562 TIMx->CCMR3 = tmpccmrx;
7563
7564 /* Set the Capture Compare Register value */
7565 TIMx->CCR6 = OC_Config->Pulse;
7566
7567 /* Write to TIMx CCER */
7568 TIMx->CCER = tmpccer;
7569 }
7570
7571 /**
7572 * @brief Slave Timer configuration function
7573 * @param htim TIM handle
7574 * @param sSlaveConfig Slave timer configuration
7575 * @retval None
7576 */
TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef * htim,const TIM_SlaveConfigTypeDef * sSlaveConfig)7577 static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim,
7578 const TIM_SlaveConfigTypeDef *sSlaveConfig)
7579 {
7580 HAL_StatusTypeDef status = HAL_OK;
7581 uint32_t tmpsmcr;
7582 uint32_t tmpccmr1;
7583 uint32_t tmpccer;
7584
7585 /* Get the TIMx SMCR register value */
7586 tmpsmcr = htim->Instance->SMCR;
7587
7588 /* Reset the Trigger Selection Bits */
7589 tmpsmcr &= ~TIM_SMCR_TS;
7590 /* Set the Input Trigger source */
7591 tmpsmcr |= sSlaveConfig->InputTrigger;
7592
7593 /* Reset the slave mode Bits */
7594 tmpsmcr &= ~TIM_SMCR_SMS;
7595 /* Set the slave mode */
7596 tmpsmcr |= sSlaveConfig->SlaveMode;
7597
7598 /* Write to TIMx SMCR */
7599 htim->Instance->SMCR = tmpsmcr;
7600
7601 /* Configure the trigger prescaler, filter, and polarity */
7602 switch (sSlaveConfig->InputTrigger)
7603 {
7604 case TIM_TS_ETRF:
7605 {
7606 /* Check the parameters */
7607 assert_param(IS_TIM_CLOCKSOURCE_ETRMODE1_INSTANCE(htim->Instance));
7608 assert_param(IS_TIM_TRIGGERPRESCALER(sSlaveConfig->TriggerPrescaler));
7609 assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity));
7610 assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter));
7611 /* Configure the ETR Trigger source */
7612 TIM_ETR_SetConfig(htim->Instance,
7613 sSlaveConfig->TriggerPrescaler,
7614 sSlaveConfig->TriggerPolarity,
7615 sSlaveConfig->TriggerFilter);
7616 break;
7617 }
7618
7619 case TIM_TS_TI1F_ED:
7620 {
7621 /* Check the parameters */
7622 assert_param(IS_TIM_CC1_INSTANCE(htim->Instance));
7623 assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter));
7624
7625 if ((sSlaveConfig->SlaveMode == TIM_SLAVEMODE_GATED) || \
7626 (sSlaveConfig->SlaveMode == TIM_SLAVEMODE_COMBINED_GATEDRESET))
7627 {
7628 return HAL_ERROR;
7629 }
7630
7631 /* Disable the Channel 1: Reset the CC1E Bit */
7632 tmpccer = htim->Instance->CCER;
7633 htim->Instance->CCER &= ~TIM_CCER_CC1E;
7634 tmpccmr1 = htim->Instance->CCMR1;
7635
7636 /* Set the filter */
7637 tmpccmr1 &= ~TIM_CCMR1_IC1F;
7638 tmpccmr1 |= ((sSlaveConfig->TriggerFilter) << 4U);
7639
7640 /* Write to TIMx CCMR1 and CCER registers */
7641 htim->Instance->CCMR1 = tmpccmr1;
7642 htim->Instance->CCER = tmpccer;
7643 break;
7644 }
7645
7646 case TIM_TS_TI1FP1:
7647 {
7648 /* Check the parameters */
7649 assert_param(IS_TIM_CC1_INSTANCE(htim->Instance));
7650 assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity));
7651 assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter));
7652
7653 /* Configure TI1 Filter and Polarity */
7654 TIM_TI1_ConfigInputStage(htim->Instance,
7655 sSlaveConfig->TriggerPolarity,
7656 sSlaveConfig->TriggerFilter);
7657 break;
7658 }
7659
7660 case TIM_TS_TI2FP2:
7661 {
7662 /* Check the parameters */
7663 assert_param(IS_TIM_CC2_INSTANCE(htim->Instance));
7664 assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity));
7665 assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter));
7666
7667 /* Configure TI2 Filter and Polarity */
7668 TIM_TI2_ConfigInputStage(htim->Instance,
7669 sSlaveConfig->TriggerPolarity,
7670 sSlaveConfig->TriggerFilter);
7671 break;
7672 }
7673
7674 case TIM_TS_ITR0:
7675 case TIM_TS_ITR1:
7676 case TIM_TS_ITR2:
7677 case TIM_TS_ITR3:
7678 #if defined (TIM5)
7679 case TIM_TS_ITR4:
7680 #endif /* TIM5 */
7681 case TIM_TS_ITR5:
7682 case TIM_TS_ITR6:
7683 case TIM_TS_ITR7:
7684 case TIM_TS_ITR8:
7685 #if defined (TIM20)
7686 case TIM_TS_ITR9:
7687 #endif /* TIM20 */
7688 #if defined (HRTIM1)
7689 case TIM_TS_ITR10:
7690 #endif /* HRTIM1 */
7691 case TIM_TS_ITR11:
7692 {
7693 /* Check the parameter */
7694 assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_INSTANCE((htim->Instance), sSlaveConfig->InputTrigger));
7695 break;
7696 }
7697
7698 default:
7699 status = HAL_ERROR;
7700 break;
7701 }
7702
7703 return status;
7704 }
7705
7706 /**
7707 * @brief Configure the TI1 as Input.
7708 * @param TIMx to select the TIM peripheral.
7709 * @param TIM_ICPolarity The Input Polarity.
7710 * This parameter can be one of the following values:
7711 * @arg TIM_ICPOLARITY_RISING
7712 * @arg TIM_ICPOLARITY_FALLING
7713 * @arg TIM_ICPOLARITY_BOTHEDGE
7714 * @param TIM_ICSelection specifies the input to be used.
7715 * This parameter can be one of the following values:
7716 * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 1 is selected to be connected to IC1.
7717 * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 1 is selected to be connected to IC2.
7718 * @arg TIM_ICSELECTION_TRC: TIM Input 1 is selected to be connected to TRC.
7719 * @param TIM_ICFilter Specifies the Input Capture Filter.
7720 * This parameter must be a value between 0x00 and 0x0F.
7721 * @retval None
7722 * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI2FP1
7723 * (on channel2 path) is used as the input signal. Therefore CCMR1 must be
7724 * protected against un-initialized filter and polarity values.
7725 */
TIM_TI1_SetConfig(TIM_TypeDef * TIMx,uint32_t TIM_ICPolarity,uint32_t TIM_ICSelection,uint32_t TIM_ICFilter)7726 void TIM_TI1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection,
7727 uint32_t TIM_ICFilter)
7728 {
7729 uint32_t tmpccmr1;
7730 uint32_t tmpccer;
7731
7732 /* Disable the Channel 1: Reset the CC1E Bit */
7733 tmpccer = TIMx->CCER;
7734 TIMx->CCER &= ~TIM_CCER_CC1E;
7735 tmpccmr1 = TIMx->CCMR1;
7736
7737 /* Select the Input */
7738 if (IS_TIM_CC2_INSTANCE(TIMx) != RESET)
7739 {
7740 tmpccmr1 &= ~TIM_CCMR1_CC1S;
7741 tmpccmr1 |= TIM_ICSelection;
7742 }
7743 else
7744 {
7745 tmpccmr1 |= TIM_CCMR1_CC1S_0;
7746 }
7747
7748 /* Set the filter */
7749 tmpccmr1 &= ~TIM_CCMR1_IC1F;
7750 tmpccmr1 |= ((TIM_ICFilter << 4U) & TIM_CCMR1_IC1F);
7751
7752 /* Select the Polarity and set the CC1E Bit */
7753 tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP);
7754 tmpccer |= (TIM_ICPolarity & (TIM_CCER_CC1P | TIM_CCER_CC1NP));
7755
7756 /* Write to TIMx CCMR1 and CCER registers */
7757 TIMx->CCMR1 = tmpccmr1;
7758 TIMx->CCER = tmpccer;
7759 }
7760
7761 /**
7762 * @brief Configure the Polarity and Filter for TI1.
7763 * @param TIMx to select the TIM peripheral.
7764 * @param TIM_ICPolarity The Input Polarity.
7765 * This parameter can be one of the following values:
7766 * @arg TIM_ICPOLARITY_RISING
7767 * @arg TIM_ICPOLARITY_FALLING
7768 * @arg TIM_ICPOLARITY_BOTHEDGE
7769 * @param TIM_ICFilter Specifies the Input Capture Filter.
7770 * This parameter must be a value between 0x00 and 0x0F.
7771 * @retval None
7772 */
TIM_TI1_ConfigInputStage(TIM_TypeDef * TIMx,uint32_t TIM_ICPolarity,uint32_t TIM_ICFilter)7773 static void TIM_TI1_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter)
7774 {
7775 uint32_t tmpccmr1;
7776 uint32_t tmpccer;
7777
7778 /* Disable the Channel 1: Reset the CC1E Bit */
7779 tmpccer = TIMx->CCER;
7780 TIMx->CCER &= ~TIM_CCER_CC1E;
7781 tmpccmr1 = TIMx->CCMR1;
7782
7783 /* Set the filter */
7784 tmpccmr1 &= ~TIM_CCMR1_IC1F;
7785 tmpccmr1 |= (TIM_ICFilter << 4U);
7786
7787 /* Select the Polarity and set the CC1E Bit */
7788 tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP);
7789 tmpccer |= TIM_ICPolarity;
7790
7791 /* Write to TIMx CCMR1 and CCER registers */
7792 TIMx->CCMR1 = tmpccmr1;
7793 TIMx->CCER = tmpccer;
7794 }
7795
7796 /**
7797 * @brief Configure the TI2 as Input.
7798 * @param TIMx to select the TIM peripheral
7799 * @param TIM_ICPolarity The Input Polarity.
7800 * This parameter can be one of the following values:
7801 * @arg TIM_ICPOLARITY_RISING
7802 * @arg TIM_ICPOLARITY_FALLING
7803 * @arg TIM_ICPOLARITY_BOTHEDGE
7804 * @param TIM_ICSelection specifies the input to be used.
7805 * This parameter can be one of the following values:
7806 * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 2 is selected to be connected to IC2.
7807 * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 2 is selected to be connected to IC1.
7808 * @arg TIM_ICSELECTION_TRC: TIM Input 2 is selected to be connected to TRC.
7809 * @param TIM_ICFilter Specifies the Input Capture Filter.
7810 * This parameter must be a value between 0x00 and 0x0F.
7811 * @retval None
7812 * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI1FP2
7813 * (on channel1 path) is used as the input signal. Therefore CCMR1 must be
7814 * protected against un-initialized filter and polarity values.
7815 */
TIM_TI2_SetConfig(TIM_TypeDef * TIMx,uint32_t TIM_ICPolarity,uint32_t TIM_ICSelection,uint32_t TIM_ICFilter)7816 static void TIM_TI2_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection,
7817 uint32_t TIM_ICFilter)
7818 {
7819 uint32_t tmpccmr1;
7820 uint32_t tmpccer;
7821
7822 /* Disable the Channel 2: Reset the CC2E Bit */
7823 tmpccer = TIMx->CCER;
7824 TIMx->CCER &= ~TIM_CCER_CC2E;
7825 tmpccmr1 = TIMx->CCMR1;
7826
7827 /* Select the Input */
7828 tmpccmr1 &= ~TIM_CCMR1_CC2S;
7829 tmpccmr1 |= (TIM_ICSelection << 8U);
7830
7831 /* Set the filter */
7832 tmpccmr1 &= ~TIM_CCMR1_IC2F;
7833 tmpccmr1 |= ((TIM_ICFilter << 12U) & TIM_CCMR1_IC2F);
7834
7835 /* Select the Polarity and set the CC2E Bit */
7836 tmpccer &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP);
7837 tmpccer |= ((TIM_ICPolarity << 4U) & (TIM_CCER_CC2P | TIM_CCER_CC2NP));
7838
7839 /* Write to TIMx CCMR1 and CCER registers */
7840 TIMx->CCMR1 = tmpccmr1 ;
7841 TIMx->CCER = tmpccer;
7842 }
7843
7844 /**
7845 * @brief Configure the Polarity and Filter for TI2.
7846 * @param TIMx to select the TIM peripheral.
7847 * @param TIM_ICPolarity The Input Polarity.
7848 * This parameter can be one of the following values:
7849 * @arg TIM_ICPOLARITY_RISING
7850 * @arg TIM_ICPOLARITY_FALLING
7851 * @arg TIM_ICPOLARITY_BOTHEDGE
7852 * @param TIM_ICFilter Specifies the Input Capture Filter.
7853 * This parameter must be a value between 0x00 and 0x0F.
7854 * @retval None
7855 */
TIM_TI2_ConfigInputStage(TIM_TypeDef * TIMx,uint32_t TIM_ICPolarity,uint32_t TIM_ICFilter)7856 static void TIM_TI2_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter)
7857 {
7858 uint32_t tmpccmr1;
7859 uint32_t tmpccer;
7860
7861 /* Disable the Channel 2: Reset the CC2E Bit */
7862 tmpccer = TIMx->CCER;
7863 TIMx->CCER &= ~TIM_CCER_CC2E;
7864 tmpccmr1 = TIMx->CCMR1;
7865
7866 /* Set the filter */
7867 tmpccmr1 &= ~TIM_CCMR1_IC2F;
7868 tmpccmr1 |= (TIM_ICFilter << 12U);
7869
7870 /* Select the Polarity and set the CC2E Bit */
7871 tmpccer &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP);
7872 tmpccer |= (TIM_ICPolarity << 4U);
7873
7874 /* Write to TIMx CCMR1 and CCER registers */
7875 TIMx->CCMR1 = tmpccmr1 ;
7876 TIMx->CCER = tmpccer;
7877 }
7878
7879 /**
7880 * @brief Configure the TI3 as Input.
7881 * @param TIMx to select the TIM peripheral
7882 * @param TIM_ICPolarity The Input Polarity.
7883 * This parameter can be one of the following values:
7884 * @arg TIM_ICPOLARITY_RISING
7885 * @arg TIM_ICPOLARITY_FALLING
7886 * @arg TIM_ICPOLARITY_BOTHEDGE
7887 * @param TIM_ICSelection specifies the input to be used.
7888 * This parameter can be one of the following values:
7889 * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 3 is selected to be connected to IC3.
7890 * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 3 is selected to be connected to IC4.
7891 * @arg TIM_ICSELECTION_TRC: TIM Input 3 is selected to be connected to TRC.
7892 * @param TIM_ICFilter Specifies the Input Capture Filter.
7893 * This parameter must be a value between 0x00 and 0x0F.
7894 * @retval None
7895 * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI3FP4
7896 * (on channel1 path) is used as the input signal. Therefore CCMR2 must be
7897 * protected against un-initialized filter and polarity values.
7898 */
TIM_TI3_SetConfig(TIM_TypeDef * TIMx,uint32_t TIM_ICPolarity,uint32_t TIM_ICSelection,uint32_t TIM_ICFilter)7899 static void TIM_TI3_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection,
7900 uint32_t TIM_ICFilter)
7901 {
7902 uint32_t tmpccmr2;
7903 uint32_t tmpccer;
7904
7905 /* Disable the Channel 3: Reset the CC3E Bit */
7906 tmpccer = TIMx->CCER;
7907 TIMx->CCER &= ~TIM_CCER_CC3E;
7908 tmpccmr2 = TIMx->CCMR2;
7909
7910 /* Select the Input */
7911 tmpccmr2 &= ~TIM_CCMR2_CC3S;
7912 tmpccmr2 |= TIM_ICSelection;
7913
7914 /* Set the filter */
7915 tmpccmr2 &= ~TIM_CCMR2_IC3F;
7916 tmpccmr2 |= ((TIM_ICFilter << 4U) & TIM_CCMR2_IC3F);
7917
7918 /* Select the Polarity and set the CC3E Bit */
7919 tmpccer &= ~(TIM_CCER_CC3P | TIM_CCER_CC3NP);
7920 tmpccer |= ((TIM_ICPolarity << 8U) & (TIM_CCER_CC3P | TIM_CCER_CC3NP));
7921
7922 /* Write to TIMx CCMR2 and CCER registers */
7923 TIMx->CCMR2 = tmpccmr2;
7924 TIMx->CCER = tmpccer;
7925 }
7926
7927 /**
7928 * @brief Configure the TI4 as Input.
7929 * @param TIMx to select the TIM peripheral
7930 * @param TIM_ICPolarity The Input Polarity.
7931 * This parameter can be one of the following values:
7932 * @arg TIM_ICPOLARITY_RISING
7933 * @arg TIM_ICPOLARITY_FALLING
7934 * @arg TIM_ICPOLARITY_BOTHEDGE
7935 * @param TIM_ICSelection specifies the input to be used.
7936 * This parameter can be one of the following values:
7937 * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 4 is selected to be connected to IC4.
7938 * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 4 is selected to be connected to IC3.
7939 * @arg TIM_ICSELECTION_TRC: TIM Input 4 is selected to be connected to TRC.
7940 * @param TIM_ICFilter Specifies the Input Capture Filter.
7941 * This parameter must be a value between 0x00 and 0x0F.
7942 * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI4FP3
7943 * (on channel1 path) is used as the input signal. Therefore CCMR2 must be
7944 * protected against un-initialized filter and polarity values.
7945 * @retval None
7946 */
TIM_TI4_SetConfig(TIM_TypeDef * TIMx,uint32_t TIM_ICPolarity,uint32_t TIM_ICSelection,uint32_t TIM_ICFilter)7947 static void TIM_TI4_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection,
7948 uint32_t TIM_ICFilter)
7949 {
7950 uint32_t tmpccmr2;
7951 uint32_t tmpccer;
7952
7953 /* Disable the Channel 4: Reset the CC4E Bit */
7954 tmpccer = TIMx->CCER;
7955 TIMx->CCER &= ~TIM_CCER_CC4E;
7956 tmpccmr2 = TIMx->CCMR2;
7957
7958 /* Select the Input */
7959 tmpccmr2 &= ~TIM_CCMR2_CC4S;
7960 tmpccmr2 |= (TIM_ICSelection << 8U);
7961
7962 /* Set the filter */
7963 tmpccmr2 &= ~TIM_CCMR2_IC4F;
7964 tmpccmr2 |= ((TIM_ICFilter << 12U) & TIM_CCMR2_IC4F);
7965
7966 /* Select the Polarity and set the CC4E Bit */
7967 tmpccer &= ~(TIM_CCER_CC4P | TIM_CCER_CC4NP);
7968 tmpccer |= ((TIM_ICPolarity << 12U) & (TIM_CCER_CC4P | TIM_CCER_CC4NP));
7969
7970 /* Write to TIMx CCMR2 and CCER registers */
7971 TIMx->CCMR2 = tmpccmr2;
7972 TIMx->CCER = tmpccer ;
7973 }
7974
7975 /**
7976 * @brief Selects the Input Trigger source
7977 * @param TIMx to select the TIM peripheral
7978 * @param InputTriggerSource The Input Trigger source.
7979 * This parameter can be one of the following values:
7980 * @arg TIM_TS_ITR0: Internal Trigger 0
7981 * @arg TIM_TS_ITR1: Internal Trigger 1
7982 * @arg TIM_TS_ITR2: Internal Trigger 2
7983 * @arg TIM_TS_ITR3: Internal Trigger 3
7984 * @arg TIM_TS_ITR4: Internal Trigger 4 (*)
7985 * @arg TIM_TS_ITR5: Internal Trigger 5
7986 * @arg TIM_TS_ITR6: Internal Trigger 6
7987 * @arg TIM_TS_ITR7: Internal Trigger 7
7988 * @arg TIM_TS_ITR8: Internal Trigger 8
7989 * @arg TIM_TS_ITR9: Internal Trigger 9 (*)
7990 * @arg TIM_TS_ITR10: Internal Trigger 10
7991 * @arg TIM_TS_ITR11: Internal Trigger 11
7992 * @arg TIM_TS_TI1F_ED: TI1 Edge Detector
7993 * @arg TIM_TS_TI1FP1: Filtered Timer Input 1
7994 * @arg TIM_TS_TI2FP2: Filtered Timer Input 2
7995 * @arg TIM_TS_ETRF: External Trigger input
7996 *
7997 * (*) Value not defined in all devices.
7998 *
7999 * @retval None
8000 */
TIM_ITRx_SetConfig(TIM_TypeDef * TIMx,uint32_t InputTriggerSource)8001 static void TIM_ITRx_SetConfig(TIM_TypeDef *TIMx, uint32_t InputTriggerSource)
8002 {
8003 uint32_t tmpsmcr;
8004
8005 /* Get the TIMx SMCR register value */
8006 tmpsmcr = TIMx->SMCR;
8007 /* Reset the TS Bits */
8008 tmpsmcr &= ~TIM_SMCR_TS;
8009 /* Set the Input Trigger source and the slave mode*/
8010 tmpsmcr |= (InputTriggerSource | TIM_SLAVEMODE_EXTERNAL1);
8011 /* Write to TIMx SMCR */
8012 TIMx->SMCR = tmpsmcr;
8013 }
8014 /**
8015 * @brief Configures the TIMx External Trigger (ETR).
8016 * @param TIMx to select the TIM peripheral
8017 * @param TIM_ExtTRGPrescaler The external Trigger Prescaler.
8018 * This parameter can be one of the following values:
8019 * @arg TIM_ETRPRESCALER_DIV1: ETRP Prescaler OFF.
8020 * @arg TIM_ETRPRESCALER_DIV2: ETRP frequency divided by 2.
8021 * @arg TIM_ETRPRESCALER_DIV4: ETRP frequency divided by 4.
8022 * @arg TIM_ETRPRESCALER_DIV8: ETRP frequency divided by 8.
8023 * @param TIM_ExtTRGPolarity The external Trigger Polarity.
8024 * This parameter can be one of the following values:
8025 * @arg TIM_ETRPOLARITY_INVERTED: active low or falling edge active.
8026 * @arg TIM_ETRPOLARITY_NONINVERTED: active high or rising edge active.
8027 * @param ExtTRGFilter External Trigger Filter.
8028 * This parameter must be a value between 0x00 and 0x0F
8029 * @retval None
8030 */
TIM_ETR_SetConfig(TIM_TypeDef * TIMx,uint32_t TIM_ExtTRGPrescaler,uint32_t TIM_ExtTRGPolarity,uint32_t ExtTRGFilter)8031 void TIM_ETR_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ExtTRGPrescaler,
8032 uint32_t TIM_ExtTRGPolarity, uint32_t ExtTRGFilter)
8033 {
8034 uint32_t tmpsmcr;
8035
8036 tmpsmcr = TIMx->SMCR;
8037
8038 /* Reset the ETR Bits */
8039 tmpsmcr &= ~(TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP);
8040
8041 /* Set the Prescaler, the Filter value and the Polarity */
8042 tmpsmcr |= (uint32_t)(TIM_ExtTRGPrescaler | (TIM_ExtTRGPolarity | (ExtTRGFilter << 8U)));
8043
8044 /* Write to TIMx SMCR */
8045 TIMx->SMCR = tmpsmcr;
8046 }
8047
8048 /**
8049 * @brief Enables or disables the TIM Capture Compare Channel x.
8050 * @param TIMx to select the TIM peripheral
8051 * @param Channel specifies the TIM Channel
8052 * This parameter can be one of the following values:
8053 * @arg TIM_CHANNEL_1: TIM Channel 1
8054 * @arg TIM_CHANNEL_2: TIM Channel 2
8055 * @arg TIM_CHANNEL_3: TIM Channel 3
8056 * @arg TIM_CHANNEL_4: TIM Channel 4
8057 * @arg TIM_CHANNEL_5: TIM Channel 5 selected
8058 * @arg TIM_CHANNEL_6: TIM Channel 6 selected
8059 * @param ChannelState specifies the TIM Channel CCxE bit new state.
8060 * This parameter can be: TIM_CCx_ENABLE or TIM_CCx_DISABLE.
8061 * @retval None
8062 */
TIM_CCxChannelCmd(TIM_TypeDef * TIMx,uint32_t Channel,uint32_t ChannelState)8063 void TIM_CCxChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelState)
8064 {
8065 uint32_t tmp;
8066
8067 /* Check the parameters */
8068 assert_param(IS_TIM_CC1_INSTANCE(TIMx));
8069 assert_param(IS_TIM_CHANNELS(Channel));
8070
8071 tmp = TIM_CCER_CC1E << (Channel & 0x1FU); /* 0x1FU = 31 bits max shift */
8072
8073 /* Reset the CCxE Bit */
8074 TIMx->CCER &= ~tmp;
8075
8076 /* Set or reset the CCxE Bit */
8077 TIMx->CCER |= (uint32_t)(ChannelState << (Channel & 0x1FU)); /* 0x1FU = 31 bits max shift */
8078 }
8079
8080 #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
8081 /**
8082 * @brief Reset interrupt callbacks to the legacy weak callbacks.
8083 * @param htim pointer to a TIM_HandleTypeDef structure that contains
8084 * the configuration information for TIM module.
8085 * @retval None
8086 */
TIM_ResetCallback(TIM_HandleTypeDef * htim)8087 void TIM_ResetCallback(TIM_HandleTypeDef *htim)
8088 {
8089 /* Reset the TIM callback to the legacy weak callbacks */
8090 htim->PeriodElapsedCallback = HAL_TIM_PeriodElapsedCallback;
8091 htim->PeriodElapsedHalfCpltCallback = HAL_TIM_PeriodElapsedHalfCpltCallback;
8092 htim->TriggerCallback = HAL_TIM_TriggerCallback;
8093 htim->TriggerHalfCpltCallback = HAL_TIM_TriggerHalfCpltCallback;
8094 htim->IC_CaptureCallback = HAL_TIM_IC_CaptureCallback;
8095 htim->IC_CaptureHalfCpltCallback = HAL_TIM_IC_CaptureHalfCpltCallback;
8096 htim->OC_DelayElapsedCallback = HAL_TIM_OC_DelayElapsedCallback;
8097 htim->PWM_PulseFinishedCallback = HAL_TIM_PWM_PulseFinishedCallback;
8098 htim->PWM_PulseFinishedHalfCpltCallback = HAL_TIM_PWM_PulseFinishedHalfCpltCallback;
8099 htim->ErrorCallback = HAL_TIM_ErrorCallback;
8100 htim->CommutationCallback = HAL_TIMEx_CommutCallback;
8101 htim->CommutationHalfCpltCallback = HAL_TIMEx_CommutHalfCpltCallback;
8102 htim->BreakCallback = HAL_TIMEx_BreakCallback;
8103 htim->Break2Callback = HAL_TIMEx_Break2Callback;
8104 htim->EncoderIndexCallback = HAL_TIMEx_EncoderIndexCallback;
8105 htim->DirectionChangeCallback = HAL_TIMEx_DirectionChangeCallback;
8106 htim->IndexErrorCallback = HAL_TIMEx_IndexErrorCallback;
8107 htim->TransitionErrorCallback = HAL_TIMEx_TransitionErrorCallback;
8108 }
8109 #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
8110
8111 /**
8112 * @}
8113 */
8114
8115 #endif /* HAL_TIM_MODULE_ENABLED */
8116 /**
8117 * @}
8118 */
8119
8120 /**
8121 * @}
8122 */
8123