comparison f103c8/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c @ 2:0c59e7a7782a

Working on GPIO and RCC
author cin
date Mon, 16 Jan 2017 11:04:47 +0300
parents
children
comparison
equal deleted inserted replaced
1:a0b14b11ad9f 2:0c59e7a7782a
1 /**
2 ******************************************************************************
3 * @file stm32f1xx_hal_tim_ex.c
4 * @author MCD Application Team
5 * @version V1.0.4
6 * @date 29-April-2016
7 * @brief TIM HAL module driver.
8 * This file provides firmware functions to manage the following
9 * functionalities of the Timer Extended peripheral:
10 * + Time Hall Sensor Interface Initialization
11 * + Time Hall Sensor Interface Start
12 * + Time Complementary signal bread and dead time configuration
13 * + Time Master and Slave synchronization configuration
14 * + Timer remapping capabilities configuration
15 @verbatim
16 ==============================================================================
17 ##### TIMER Extended features #####
18 ==============================================================================
19 [..]
20 The Timer Extended features include:
21 (#) Complementary outputs with programmable dead-time for :
22 (++) Output Compare
23 (++) PWM generation (Edge and Center-aligned Mode)
24 (++) One-pulse mode output
25 (#) Synchronization circuit to control the timer with external signals and to
26 interconnect several timers together.
27 (#) Break input to put the timer output signals in reset state or in a known state.
28 (#) Supports incremental (quadrature) encoder and hall-sensor circuitry for
29 positioning purposes
30
31 ##### How to use this driver #####
32 ==============================================================================
33 [..]
34 (#) Initialize the TIM low level resources by implementing the following functions
35 depending from feature used :
36 (++) Complementary Output Compare : HAL_TIM_OC_MspInit()
37 (++) Complementary PWM generation : HAL_TIM_PWM_MspInit()
38 (++) Complementary One-pulse mode output : HAL_TIM_OnePulse_MspInit()
39 (++) Hall Sensor output : HAL_TIMEx_HallSensor_MspInit()
40
41 (#) Initialize the TIM low level resources :
42 (##) Enable the TIM interface clock using __HAL_RCC_TIMx_CLK_ENABLE();
43 (##) TIM pins configuration
44 (+++) Enable the clock for the TIM GPIOs using the following function:
45 __HAL_RCC_GPIOx_CLK_ENABLE();
46 (+++) Configure these TIM pins in Alternate function mode using HAL_GPIO_Init();
47
48 (#) The external Clock can be configured, if needed (the default clock is the
49 internal clock from the APBx), using the following function:
50 HAL_TIM_ConfigClockSource, the clock configuration should be done before
51 any start function.
52
53 (#) Configure the TIM in the desired functioning mode using one of the
54 initialization function of this driver:
55 (++) HAL_TIMEx_HallSensor_Init and HAL_TIMEx_ConfigCommutationEvent: to use the
56 Timer Hall Sensor Interface and the commutation event with the corresponding
57 Interrupt and DMA request if needed (Note that One Timer is used to interface
58 with the Hall sensor Interface and another Timer should be used to use
59 the commutation event).
60
61 (#) Activate the TIM peripheral using one of the start functions:
62 (++) Complementary Output Compare : HAL_TIMEx_OCN_Start(), HAL_TIMEx_OCN_Start_DMA(), HAL_TIMEx_OCN_Start_IT()
63 (++) Complementary PWM generation : HAL_TIMEx_PWMN_Start(), HAL_TIMEx_PWMN_Start_DMA(), HAL_TIMEx_PWMN_Start_IT()
64 (++) Complementary One-pulse mode output : HAL_TIMEx_OnePulseN_Start(), HAL_TIMEx_OnePulseN_Start_IT()
65 (++) Hall Sensor output : HAL_TIMEx_HallSensor_Start(), HAL_TIMEx_HallSensor_Start_DMA(), HAL_TIMEx_HallSensor_Start_IT().
66
67
68 @endverbatim
69 ******************************************************************************
70 * @attention
71 *
72 * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
73 *
74 * Redistribution and use in source and binary forms, with or without modification,
75 * are permitted provided that the following conditions are met:
76 * 1. Redistributions of source code must retain the above copyright notice,
77 * this list of conditions and the following disclaimer.
78 * 2. Redistributions in binary form must reproduce the above copyright notice,
79 * this list of conditions and the following disclaimer in the documentation
80 * and/or other materials provided with the distribution.
81 * 3. Neither the name of STMicroelectronics nor the names of its contributors
82 * may be used to endorse or promote products derived from this software
83 * without specific prior written permission.
84 *
85 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
86 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
87 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
88 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
89 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
90 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
91 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
92 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
93 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
94 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
95 *
96 ******************************************************************************
97 */
98
99 /* Includes ------------------------------------------------------------------*/
100 #include "stm32f1xx_hal.h"
101
102 /** @addtogroup STM32F1xx_HAL_Driver
103 * @{
104 */
105
106 /** @defgroup TIMEx TIMEx
107 * @brief TIM Extended HAL module driver
108 * @{
109 */
110
111 #ifdef HAL_TIM_MODULE_ENABLED
112
113 /* Private typedef -----------------------------------------------------------*/
114 /* Private define ------------------------------------------------------------*/
115 /* Private macro -------------------------------------------------------------*/
116 /* Private variables ---------------------------------------------------------*/
117 /* Private function prototypes -----------------------------------------------*/
118
119 #if defined (STM32F100xB) || defined (STM32F100xE) || \
120 defined (STM32F103x6) || defined (STM32F103xB) || defined (STM32F103xE) || defined (STM32F103xG) || \
121 defined (STM32F105xC) || defined (STM32F107xC)
122 /** @defgroup TIMEx_Private_Functions TIMEx Private Functions
123 * @{
124 */
125 static void TIM_CCxNChannelCmd(TIM_TypeDef* TIMx, uint32_t Channel, uint32_t ChannelNState);
126 /**
127 * @}
128 */
129 #endif /* defined(STM32F100xB) || defined(STM32F100xE) || */
130 /* defined(STM32F103x6) || defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG) || */
131 /* defined(STM32F105xC) || defined(STM32F107xC) */
132
133 /* Exported functions ---------------------------------------------------------*/
134
135 /** @defgroup TIMEx_Exported_Functions TIMEx Exported Functions
136 * @{
137 */
138
139
140 /** @defgroup TIMEx_Exported_Functions_Group1 Timer Hall Sensor functions
141 * @brief Timer Hall Sensor functions
142 *
143 @verbatim
144 ==============================================================================
145 ##### Timer Hall Sensor functions #####
146 ==============================================================================
147 [..]
148 This section provides functions allowing to:
149 (+) Initialize and configure TIM HAL Sensor.
150 (+) De-initialize TIM HAL Sensor.
151 (+) Start the Hall Sensor Interface.
152 (+) Stop the Hall Sensor Interface.
153 (+) Start the Hall Sensor Interface and enable interrupts.
154 (+) Stop the Hall Sensor Interface and disable interrupts.
155 (+) Start the Hall Sensor Interface and enable DMA transfers.
156 (+) Stop the Hall Sensor Interface and disable DMA transfers.
157
158 @endverbatim
159 * @{
160 */
161 /**
162 * @brief Initializes the TIM Hall Sensor Interface and create the associated handle.
163 * @param htim : TIM Encoder Interface handle
164 * @param sConfig : TIM Hall Sensor configuration structure
165 * @retval HAL status
166 */
167 HAL_StatusTypeDef HAL_TIMEx_HallSensor_Init(TIM_HandleTypeDef *htim, TIM_HallSensor_InitTypeDef* sConfig)
168 {
169 TIM_OC_InitTypeDef OC_Config;
170
171 /* Check the TIM handle allocation */
172 if(htim == NULL)
173 {
174 return HAL_ERROR;
175 }
176
177 assert_param(IS_TIM_XOR_INSTANCE(htim->Instance));
178 assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode));
179 assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision));
180 assert_param(IS_TIM_IC_POLARITY(sConfig->IC1Polarity));
181 assert_param(IS_TIM_IC_PRESCALER(sConfig->IC1Prescaler));
182 assert_param(IS_TIM_IC_FILTER(sConfig->IC1Filter));
183
184 if(htim->State == HAL_TIM_STATE_RESET)
185 {
186 /* Allocate lock resource and initialize it */
187 htim->Lock = HAL_UNLOCKED;
188
189 /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */
190 HAL_TIMEx_HallSensor_MspInit(htim);
191 }
192
193 /* Set the TIM state */
194 htim->State= HAL_TIM_STATE_BUSY;
195
196 /* Configure the Time base in the Encoder Mode */
197 TIM_Base_SetConfig(htim->Instance, &htim->Init);
198
199 /* Configure the Channel 1 as Input Channel to interface with the three Outputs of the Hall sensor */
200 TIM_TI1_SetConfig(htim->Instance, sConfig->IC1Polarity, TIM_ICSELECTION_TRC, sConfig->IC1Filter);
201
202 /* Reset the IC1PSC Bits */
203 htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC;
204 /* Set the IC1PSC value */
205 htim->Instance->CCMR1 |= sConfig->IC1Prescaler;
206
207 /* Enable the Hall sensor interface (XOR function of the three inputs) */
208 htim->Instance->CR2 |= TIM_CR2_TI1S;
209
210 /* Select the TIM_TS_TI1F_ED signal as Input trigger for the TIM */
211 htim->Instance->SMCR &= ~TIM_SMCR_TS;
212 htim->Instance->SMCR |= TIM_TS_TI1F_ED;
213
214 /* Use the TIM_TS_TI1F_ED signal to reset the TIM counter each edge detection */
215 htim->Instance->SMCR &= ~TIM_SMCR_SMS;
216 htim->Instance->SMCR |= TIM_SLAVEMODE_RESET;
217
218 /* Program channel 2 in PWM 2 mode with the desired Commutation_Delay*/
219 OC_Config.OCFastMode = TIM_OCFAST_DISABLE;
220 OC_Config.OCIdleState = TIM_OCIDLESTATE_RESET;
221 OC_Config.OCMode = TIM_OCMODE_PWM2;
222 OC_Config.OCNIdleState = TIM_OCNIDLESTATE_RESET;
223 OC_Config.OCNPolarity = TIM_OCNPOLARITY_HIGH;
224 OC_Config.OCPolarity = TIM_OCPOLARITY_HIGH;
225 OC_Config.Pulse = sConfig->Commutation_Delay;
226
227 TIM_OC2_SetConfig(htim->Instance, &OC_Config);
228
229 /* Select OC2REF as trigger output on TRGO: write the MMS bits in the TIMx_CR2
230 register to 101 */
231 htim->Instance->CR2 &= ~TIM_CR2_MMS;
232 htim->Instance->CR2 |= TIM_TRGO_OC2REF;
233
234 /* Initialize the TIM state*/
235 htim->State= HAL_TIM_STATE_READY;
236
237 return HAL_OK;
238 }
239
240 /**
241 * @brief DeInitializes the TIM Hall Sensor interface
242 * @param htim : TIM Hall Sensor handle
243 * @retval HAL status
244 */
245 HAL_StatusTypeDef HAL_TIMEx_HallSensor_DeInit(TIM_HandleTypeDef *htim)
246 {
247 /* Check the parameters */
248 assert_param(IS_TIM_INSTANCE(htim->Instance));
249
250 htim->State = HAL_TIM_STATE_BUSY;
251
252 /* Disable the TIM Peripheral Clock */
253 __HAL_TIM_DISABLE(htim);
254
255 /* DeInit the low level hardware: GPIO, CLOCK, NVIC */
256 HAL_TIMEx_HallSensor_MspDeInit(htim);
257
258 /* Change TIM state */
259 htim->State = HAL_TIM_STATE_RESET;
260
261 /* Release Lock */
262 __HAL_UNLOCK(htim);
263
264 return HAL_OK;
265 }
266
267 /**
268 * @brief Initializes the TIM Hall Sensor MSP.
269 * @param htim : TIM handle
270 * @retval None
271 */
272 __weak void HAL_TIMEx_HallSensor_MspInit(TIM_HandleTypeDef *htim)
273 {
274 /* Prevent unused argument(s) compilation warning */
275 UNUSED(htim);
276 /* NOTE : This function Should not be modified, when the callback is needed,
277 the HAL_TIMEx_HallSensor_MspInit could be implemented in the user file
278 */
279 }
280
281 /**
282 * @brief DeInitializes TIM Hall Sensor MSP.
283 * @param htim : TIM handle
284 * @retval None
285 */
286 __weak void HAL_TIMEx_HallSensor_MspDeInit(TIM_HandleTypeDef *htim)
287 {
288 /* Prevent unused argument(s) compilation warning */
289 UNUSED(htim);
290 /* NOTE : This function Should not be modified, when the callback is needed,
291 the HAL_TIMEx_HallSensor_MspDeInit could be implemented in the user file
292 */
293 }
294
295 /**
296 * @brief Starts the TIM Hall Sensor Interface.
297 * @param htim : TIM Hall Sensor handle
298 * @retval HAL status
299 */
300 HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start(TIM_HandleTypeDef *htim)
301 {
302 /* Check the parameters */
303 assert_param(IS_TIM_XOR_INSTANCE(htim->Instance));
304
305 /* Enable the Input Capture channel 1
306 (in the Hall Sensor Interface the 3 possible channels that are used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */
307 TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE);
308
309 /* Enable the Peripheral */
310 __HAL_TIM_ENABLE(htim);
311
312 /* Return function status */
313 return HAL_OK;
314 }
315
316 /**
317 * @brief Stops the TIM Hall sensor Interface.
318 * @param htim : TIM Hall Sensor handle
319 * @retval HAL status
320 */
321 HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop(TIM_HandleTypeDef *htim)
322 {
323 /* Check the parameters */
324 assert_param(IS_TIM_XOR_INSTANCE(htim->Instance));
325
326 /* Disable the Input Capture channel 1
327 (in the Hall Sensor Interface the 3 possible channels that are used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */
328 TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE);
329
330 /* Disable the Peripheral */
331 __HAL_TIM_DISABLE(htim);
332
333 /* Return function status */
334 return HAL_OK;
335 }
336
337 /**
338 * @brief Starts the TIM Hall Sensor Interface in interrupt mode.
339 * @param htim : TIM Hall Sensor handle
340 * @retval HAL status
341 */
342 HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_IT(TIM_HandleTypeDef *htim)
343 {
344 /* Check the parameters */
345 assert_param(IS_TIM_XOR_INSTANCE(htim->Instance));
346
347 /* Enable the capture compare Interrupts 1 event */
348 __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1);
349
350 /* Enable the Input Capture channel 1
351 (in the Hall Sensor Interface the 3 possible channels that are used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */
352 TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE);
353
354 /* Enable the Peripheral */
355 __HAL_TIM_ENABLE(htim);
356
357 /* Return function status */
358 return HAL_OK;
359 }
360
361 /**
362 * @brief Stops the TIM Hall Sensor Interface in interrupt mode.
363 * @param htim : TIM handle
364 * @retval HAL status
365 */
366 HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_IT(TIM_HandleTypeDef *htim)
367 {
368 /* Check the parameters */
369 assert_param(IS_TIM_XOR_INSTANCE(htim->Instance));
370
371 /* Disable the Input Capture channel 1
372 (in the Hall Sensor Interface the 3 possible channels that are used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */
373 TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE);
374
375 /* Disable the capture compare Interrupts event */
376 __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1);
377
378 /* Disable the Peripheral */
379 __HAL_TIM_DISABLE(htim);
380
381 /* Return function status */
382 return HAL_OK;
383 }
384
385 /**
386 * @brief Starts the TIM Hall Sensor Interface in DMA mode.
387 * @param htim : TIM Hall Sensor handle
388 * @param pData : The destination Buffer address.
389 * @param Length : The length of data to be transferred from TIM peripheral to memory.
390 * @retval HAL status
391 */
392 HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length)
393 {
394 /* Check the parameters */
395 assert_param(IS_TIM_XOR_INSTANCE(htim->Instance));
396
397 if((htim->State == HAL_TIM_STATE_BUSY))
398 {
399 return HAL_BUSY;
400 }
401 else if((htim->State == HAL_TIM_STATE_READY))
402 {
403 if(((uint32_t)pData == 0 ) && (Length > 0))
404 {
405 return HAL_ERROR;
406 }
407 else
408 {
409 htim->State = HAL_TIM_STATE_BUSY;
410 }
411 }
412 /* Enable the Input Capture channel 1
413 (in the Hall Sensor Interface the 3 possible channels that are used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */
414 TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE);
415
416 /* Set the DMA Input Capture 1 Callback */
417 htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt;
418 /* Set the DMA error callback */
419 htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ;
420
421 /* Enable the DMA channel for Capture 1*/
422 HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData, Length);
423
424 /* Enable the capture compare 1 Interrupt */
425 __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1);
426
427 /* Enable the Peripheral */
428 __HAL_TIM_ENABLE(htim);
429
430 /* Return function status */
431 return HAL_OK;
432 }
433
434 /**
435 * @brief Stops the TIM Hall Sensor Interface in DMA mode.
436 * @param htim : TIM handle
437 * @retval HAL status
438 */
439 HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_DMA(TIM_HandleTypeDef *htim)
440 {
441 /* Check the parameters */
442 assert_param(IS_TIM_XOR_INSTANCE(htim->Instance));
443
444 /* Disable the Input Capture channel 1
445 (in the Hall Sensor Interface the 3 possible channels that are used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */
446 TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE);
447
448
449 /* Disable the capture compare Interrupts 1 event */
450 __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1);
451
452 /* Disable the Peripheral */
453 __HAL_TIM_DISABLE(htim);
454
455 /* Return function status */
456 return HAL_OK;
457 }
458
459 /**
460 * @}
461 */
462
463 #if defined (STM32F100xB) || defined (STM32F100xE) || \
464 defined (STM32F103x6) || defined (STM32F103xB) || defined (STM32F103xE) || defined (STM32F103xG) || \
465 defined (STM32F105xC) || defined (STM32F107xC)
466
467 /** @defgroup TIMEx_Exported_Functions_Group2 Timer Complementary Output Compare functions
468 * @brief Timer Complementary Output Compare functions
469 *
470 @verbatim
471 ==============================================================================
472 ##### Timer Complementary Output Compare functions #####
473 ==============================================================================
474 [..]
475 This section provides functions allowing to:
476 (+) Start the Complementary Output Compare/PWM.
477 (+) Stop the Complementary Output Compare/PWM.
478 (+) Start the Complementary Output Compare/PWM and enable interrupts.
479 (+) Stop the Complementary Output Compare/PWM and disable interrupts.
480 (+) Start the Complementary Output Compare/PWM and enable DMA transfers.
481 (+) Stop the Complementary Output Compare/PWM and disable DMA transfers.
482
483 @endverbatim
484 * @{
485 */
486
487 /**
488 * @brief Starts the TIM Output Compare signal generation on the complementary
489 * output.
490 * @param htim : TIM Output Compare handle
491 * @param Channel : TIM Channel to be enabled
492 * This parameter can be one of the following values:
493 * @arg TIM_CHANNEL_1: TIM Channel 1 selected
494 * @arg TIM_CHANNEL_2: TIM Channel 2 selected
495 * @arg TIM_CHANNEL_3: TIM Channel 3 selected
496 * @arg TIM_CHANNEL_4: TIM Channel 4 selected
497 * @retval HAL status
498 */
499 HAL_StatusTypeDef HAL_TIMEx_OCN_Start(TIM_HandleTypeDef *htim, uint32_t Channel)
500 {
501 /* Check the parameters */
502 assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel));
503
504 /* Enable the Capture compare channel N */
505 TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE);
506
507 /* Enable the Main Ouput */
508 __HAL_TIM_MOE_ENABLE(htim);
509
510 /* Enable the Peripheral */
511 __HAL_TIM_ENABLE(htim);
512
513 /* Return function status */
514 return HAL_OK;
515 }
516
517 /**
518 * @brief Stops the TIM Output Compare signal generation on the complementary
519 * output.
520 * @param htim : TIM handle
521 * @param Channel : TIM Channel to be disabled
522 * This parameter can be one of the following values:
523 * @arg TIM_CHANNEL_1: TIM Channel 1 selected
524 * @arg TIM_CHANNEL_2: TIM Channel 2 selected
525 * @arg TIM_CHANNEL_3: TIM Channel 3 selected
526 * @arg TIM_CHANNEL_4: TIM Channel 4 selected
527 * @retval HAL status
528 */
529 HAL_StatusTypeDef HAL_TIMEx_OCN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel)
530 {
531 /* Check the parameters */
532 assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel));
533
534 /* Disable the Capture compare channel N */
535 TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE);
536
537 /* Disable the Main Ouput */
538 __HAL_TIM_MOE_DISABLE(htim);
539
540 /* Disable the Peripheral */
541 __HAL_TIM_DISABLE(htim);
542
543 /* Return function status */
544 return HAL_OK;
545 }
546
547 /**
548 * @brief Starts the TIM Output Compare signal generation in interrupt mode
549 * on the complementary output.
550 * @param htim : TIM OC handle
551 * @param Channel : TIM Channel to be enabled
552 * This parameter can be one of the following values:
553 * @arg TIM_CHANNEL_1: TIM Channel 1 selected
554 * @arg TIM_CHANNEL_2: TIM Channel 2 selected
555 * @arg TIM_CHANNEL_3: TIM Channel 3 selected
556 * @arg TIM_CHANNEL_4: TIM Channel 4 selected
557 * @retval HAL status
558 */
559 HAL_StatusTypeDef HAL_TIMEx_OCN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel)
560 {
561 /* Check the parameters */
562 assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel));
563
564 switch (Channel)
565 {
566 case TIM_CHANNEL_1:
567 {
568 /* Enable the TIM Output Compare interrupt */
569 __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1);
570 }
571 break;
572
573 case TIM_CHANNEL_2:
574 {
575 /* Enable the TIM Output Compare interrupt */
576 __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2);
577 }
578 break;
579
580 case TIM_CHANNEL_3:
581 {
582 /* Enable the TIM Output Compare interrupt */
583 __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3);
584 }
585 break;
586
587 case TIM_CHANNEL_4:
588 {
589 /* Enable the TIM Output Compare interrupt */
590 __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4);
591 }
592 break;
593
594 default:
595 break;
596 }
597
598 /* Enable the TIM Break interrupt */
599 __HAL_TIM_ENABLE_IT(htim, TIM_IT_BREAK);
600
601 /* Enable the Capture compare channel N */
602 TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE);
603
604 /* Enable the Main Ouput */
605 __HAL_TIM_MOE_ENABLE(htim);
606
607 /* Enable the Peripheral */
608 __HAL_TIM_ENABLE(htim);
609
610 /* Return function status */
611 return HAL_OK;
612 }
613
614 /**
615 * @brief Stops the TIM Output Compare signal generation in interrupt mode
616 * on the complementary output.
617 * @param htim : TIM Output Compare handle
618 * @param Channel : TIM Channel to be disabled
619 * This parameter can be one of the following values:
620 * @arg TIM_CHANNEL_1: TIM Channel 1 selected
621 * @arg TIM_CHANNEL_2: TIM Channel 2 selected
622 * @arg TIM_CHANNEL_3: TIM Channel 3 selected
623 * @arg TIM_CHANNEL_4: TIM Channel 4 selected
624 * @retval HAL status
625 */
626 HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel)
627 {
628 uint32_t tmpccer = 0;
629
630 /* Check the parameters */
631 assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel));
632
633 switch (Channel)
634 {
635 case TIM_CHANNEL_1:
636 {
637 /* Disable the TIM Output Compare interrupt */
638 __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1);
639 }
640 break;
641
642 case TIM_CHANNEL_2:
643 {
644 /* Disable the TIM Output Compare interrupt */
645 __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2);
646 }
647 break;
648
649 case TIM_CHANNEL_3:
650 {
651 /* Disable the TIM Output Compare interrupt */
652 __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3);
653 }
654 break;
655
656 case TIM_CHANNEL_4:
657 {
658 /* Disable the TIM Output Compare interrupt */
659 __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4);
660 }
661 break;
662
663 default:
664 break;
665 }
666
667 /* Disable the Capture compare channel N */
668 TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE);
669
670 /* Disable the TIM Break interrupt (only if no more channel is active) */
671 tmpccer = htim->Instance->CCER;
672 if ((tmpccer & (TIM_CCER_CC1NE | TIM_CCER_CC2NE | TIM_CCER_CC3NE)) == RESET)
673 {
674 __HAL_TIM_DISABLE_IT(htim, TIM_IT_BREAK);
675 }
676
677 /* Disable the Main Ouput */
678 __HAL_TIM_MOE_DISABLE(htim);
679
680 /* Disable the Peripheral */
681 __HAL_TIM_DISABLE(htim);
682
683 /* Return function status */
684 return HAL_OK;
685 }
686
687 /**
688 * @brief Starts the TIM Output Compare signal generation in DMA mode
689 * on the complementary output.
690 * @param htim : TIM Output Compare handle
691 * @param Channel : TIM Channel to be enabled
692 * This parameter can be one of the following values:
693 * @arg TIM_CHANNEL_1: TIM Channel 1 selected
694 * @arg TIM_CHANNEL_2: TIM Channel 2 selected
695 * @arg TIM_CHANNEL_3: TIM Channel 3 selected
696 * @arg TIM_CHANNEL_4: TIM Channel 4 selected
697 * @param pData : The source Buffer address.
698 * @param Length : The length of data to be transferred from memory to TIM peripheral
699 * @retval HAL status
700 */
701 HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length)
702 {
703 /* Check the parameters */
704 assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel));
705
706 if((htim->State == HAL_TIM_STATE_BUSY))
707 {
708 return HAL_BUSY;
709 }
710 else if((htim->State == HAL_TIM_STATE_READY))
711 {
712 if(((uint32_t)pData == 0 ) && (Length > 0))
713 {
714 return HAL_ERROR;
715 }
716 else
717 {
718 htim->State = HAL_TIM_STATE_BUSY;
719 }
720 }
721 switch (Channel)
722 {
723 case TIM_CHANNEL_1:
724 {
725 /* Set the DMA Period elapsed callback */
726 htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt;
727
728 /* Set the DMA error callback */
729 htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ;
730
731 /* Enable the DMA channel */
732 HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, Length);
733
734 /* Enable the TIM Output Compare DMA request */
735 __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1);
736 }
737 break;
738
739 case TIM_CHANNEL_2:
740 {
741 /* Set the DMA Period elapsed callback */
742 htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt;
743
744 /* Set the DMA error callback */
745 htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ;
746
747 /* Enable the DMA channel */
748 HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, Length);
749
750 /* Enable the TIM Output Compare DMA request */
751 __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2);
752 }
753 break;
754
755 case TIM_CHANNEL_3:
756 {
757 /* Set the DMA Period elapsed callback */
758 htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt;
759
760 /* Set the DMA error callback */
761 htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ;
762
763 /* Enable the DMA channel */
764 HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3,Length);
765
766 /* Enable the TIM Output Compare DMA request */
767 __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3);
768 }
769 break;
770
771 case TIM_CHANNEL_4:
772 {
773 /* Set the DMA Period elapsed callback */
774 htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt;
775
776 /* Set the DMA error callback */
777 htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ;
778
779 /* Enable the DMA channel */
780 HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)pData, (uint32_t)&htim->Instance->CCR4, Length);
781
782 /* Enable the TIM Output Compare DMA request */
783 __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4);
784 }
785 break;
786
787 default:
788 break;
789 }
790
791 /* Enable the Capture compare channel N */
792 TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE);
793
794 /* Enable the Main Ouput */
795 __HAL_TIM_MOE_ENABLE(htim);
796
797 /* Enable the Peripheral */
798 __HAL_TIM_ENABLE(htim);
799
800 /* Return function status */
801 return HAL_OK;
802 }
803
804 /**
805 * @brief Stops the TIM Output Compare signal generation in DMA mode
806 * on the complementary output.
807 * @param htim : TIM Output Compare handle
808 * @param Channel : TIM Channel to be disabled
809 * This parameter can be one of the following values:
810 * @arg TIM_CHANNEL_1: TIM Channel 1 selected
811 * @arg TIM_CHANNEL_2: TIM Channel 2 selected
812 * @arg TIM_CHANNEL_3: TIM Channel 3 selected
813 * @arg TIM_CHANNEL_4: TIM Channel 4 selected
814 * @retval HAL status
815 */
816 HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel)
817 {
818 /* Check the parameters */
819 assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel));
820
821 switch (Channel)
822 {
823 case TIM_CHANNEL_1:
824 {
825 /* Disable the TIM Output Compare DMA request */
826 __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1);
827 }
828 break;
829
830 case TIM_CHANNEL_2:
831 {
832 /* Disable the TIM Output Compare DMA request */
833 __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2);
834 }
835 break;
836
837 case TIM_CHANNEL_3:
838 {
839 /* Disable the TIM Output Compare DMA request */
840 __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3);
841 }
842 break;
843
844 case TIM_CHANNEL_4:
845 {
846 /* Disable the TIM Output Compare interrupt */
847 __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4);
848 }
849 break;
850
851 default:
852 break;
853 }
854
855 /* Disable the Capture compare channel N */
856 TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE);
857
858 /* Disable the Main Ouput */
859 __HAL_TIM_MOE_DISABLE(htim);
860
861 /* Disable the Peripheral */
862 __HAL_TIM_DISABLE(htim);
863
864 /* Change the htim state */
865 htim->State = HAL_TIM_STATE_READY;
866
867 /* Return function status */
868 return HAL_OK;
869 }
870
871 /**
872 * @}
873 */
874
875 /** @defgroup TIMEx_Exported_Functions_Group3 Timer Complementary PWM functions
876 * @brief Timer Complementary PWM functions
877 *
878 @verbatim
879 ==============================================================================
880 ##### Timer Complementary PWM functions #####
881 ==============================================================================
882 [..]
883 This section provides functions allowing to:
884 (+) Start the Complementary PWM.
885 (+) Stop the Complementary PWM.
886 (+) Start the Complementary PWM and enable interrupts.
887 (+) Stop the Complementary PWM and disable interrupts.
888 (+) Start the Complementary PWM and enable DMA transfers.
889 (+) Stop the Complementary PWM and disable DMA transfers.
890 (+) Start the Complementary Input Capture measurement.
891 (+) Stop the Complementary Input Capture.
892 (+) Start the Complementary Input Capture and enable interrupts.
893 (+) Stop the Complementary Input Capture and disable interrupts.
894 (+) Start the Complementary Input Capture and enable DMA transfers.
895 (+) Stop the Complementary Input Capture and disable DMA transfers.
896 (+) Start the Complementary One Pulse generation.
897 (+) Stop the Complementary One Pulse.
898 (+) Start the Complementary One Pulse and enable interrupts.
899 (+) Stop the Complementary One Pulse and disable interrupts.
900
901 @endverbatim
902 * @{
903 */
904
905 /**
906 * @brief Starts the PWM signal generation on the complementary output.
907 * @param htim : TIM handle
908 * @param Channel : TIM Channel to be enabled
909 * This parameter can be one of the following values:
910 * @arg TIM_CHANNEL_1: TIM Channel 1 selected
911 * @arg TIM_CHANNEL_2: TIM Channel 2 selected
912 * @arg TIM_CHANNEL_3: TIM Channel 3 selected
913 * @arg TIM_CHANNEL_4: TIM Channel 4 selected
914 * @retval HAL status
915 */
916 HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef *htim, uint32_t Channel)
917 {
918 /* Check the parameters */
919 assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel));
920
921 /* Enable the complementary PWM output */
922 TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE);
923
924 /* Enable the Main Ouput */
925 __HAL_TIM_MOE_ENABLE(htim);
926
927 /* Enable the Peripheral */
928 __HAL_TIM_ENABLE(htim);
929
930 /* Return function status */
931 return HAL_OK;
932 }
933
934 /**
935 * @brief Stops the PWM signal generation on the complementary output.
936 * @param htim : TIM handle
937 * @param Channel : TIM Channel to be disabled
938 * This parameter can be one of the following values:
939 * @arg TIM_CHANNEL_1: TIM Channel 1 selected
940 * @arg TIM_CHANNEL_2: TIM Channel 2 selected
941 * @arg TIM_CHANNEL_3: TIM Channel 3 selected
942 * @arg TIM_CHANNEL_4: TIM Channel 4 selected
943 * @retval HAL status
944 */
945 HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel)
946 {
947 /* Check the parameters */
948 assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel));
949
950 /* Disable the complementary PWM output */
951 TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE);
952
953 /* Disable the Main Ouput */
954 __HAL_TIM_MOE_DISABLE(htim);
955
956 /* Disable the Peripheral */
957 __HAL_TIM_DISABLE(htim);
958
959 /* Return function status */
960 return HAL_OK;
961 }
962
963 /**
964 * @brief Starts the PWM signal generation in interrupt mode on the
965 * complementary output.
966 * @param htim : TIM handle
967 * @param Channel : TIM Channel to be disabled
968 * This parameter can be one of the following values:
969 * @arg TIM_CHANNEL_1: TIM Channel 1 selected
970 * @arg TIM_CHANNEL_2: TIM Channel 2 selected
971 * @arg TIM_CHANNEL_3: TIM Channel 3 selected
972 * @arg TIM_CHANNEL_4: TIM Channel 4 selected
973 * @retval HAL status
974 */
975 HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel)
976 {
977 /* Check the parameters */
978 assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel));
979
980 switch (Channel)
981 {
982 case TIM_CHANNEL_1:
983 {
984 /* Enable the TIM Capture/Compare 1 interrupt */
985 __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1);
986 }
987 break;
988
989 case TIM_CHANNEL_2:
990 {
991 /* Enable the TIM Capture/Compare 2 interrupt */
992 __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2);
993 }
994 break;
995
996 case TIM_CHANNEL_3:
997 {
998 /* Enable the TIM Capture/Compare 3 interrupt */
999 __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3);
1000 }
1001 break;
1002
1003 case TIM_CHANNEL_4:
1004 {
1005 /* Enable the TIM Capture/Compare 4 interrupt */
1006 __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4);
1007 }
1008 break;
1009
1010 default:
1011 break;
1012 }
1013
1014 /* Enable the TIM Break interrupt */
1015 __HAL_TIM_ENABLE_IT(htim, TIM_IT_BREAK);
1016
1017 /* Enable the complementary PWM output */
1018 TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE);
1019
1020 /* Enable the Main Ouput */
1021 __HAL_TIM_MOE_ENABLE(htim);
1022
1023 /* Enable the Peripheral */
1024 __HAL_TIM_ENABLE(htim);
1025
1026 /* Return function status */
1027 return HAL_OK;
1028 }
1029
1030 /**
1031 * @brief Stops the PWM signal generation in interrupt mode on the
1032 * complementary output.
1033 * @param htim : TIM handle
1034 * @param Channel : TIM Channel to be disabled
1035 * This parameter can be one of the following values:
1036 * @arg TIM_CHANNEL_1: TIM Channel 1 selected
1037 * @arg TIM_CHANNEL_2: TIM Channel 2 selected
1038 * @arg TIM_CHANNEL_3: TIM Channel 3 selected
1039 * @arg TIM_CHANNEL_4: TIM Channel 4 selected
1040 * @retval HAL status
1041 */
1042 HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_IT (TIM_HandleTypeDef *htim, uint32_t Channel)
1043 {
1044 uint32_t tmpccer = 0;
1045
1046 /* Check the parameters */
1047 assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel));
1048
1049 switch (Channel)
1050 {
1051 case TIM_CHANNEL_1:
1052 {
1053 /* Disable the TIM Capture/Compare 1 interrupt */
1054 __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1);
1055 }
1056 break;
1057
1058 case TIM_CHANNEL_2:
1059 {
1060 /* Disable the TIM Capture/Compare 2 interrupt */
1061 __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2);
1062 }
1063 break;
1064
1065 case TIM_CHANNEL_3:
1066 {
1067 /* Disable the TIM Capture/Compare 3 interrupt */
1068 __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3);
1069 }
1070 break;
1071
1072 case TIM_CHANNEL_4:
1073 {
1074 /* Disable the TIM Capture/Compare 3 interrupt */
1075 __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4);
1076 }
1077 break;
1078
1079 default:
1080 break;
1081 }
1082
1083 /* Disable the complementary PWM output */
1084 TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE);
1085
1086 /* Disable the TIM Break interrupt (only if no more channel is active) */
1087 tmpccer = htim->Instance->CCER;
1088 if ((tmpccer & (TIM_CCER_CC1NE | TIM_CCER_CC2NE | TIM_CCER_CC3NE)) == RESET)
1089 {
1090 __HAL_TIM_DISABLE_IT(htim, TIM_IT_BREAK);
1091 }
1092
1093 /* Disable the Main Ouput */
1094 __HAL_TIM_MOE_DISABLE(htim);
1095
1096 /* Disable the Peripheral */
1097 __HAL_TIM_DISABLE(htim);
1098
1099 /* Return function status */
1100 return HAL_OK;
1101 }
1102
1103 /**
1104 * @brief Starts the TIM PWM signal generation in DMA mode on the
1105 * complementary output
1106 * @param htim : TIM handle
1107 * @param Channel : TIM Channel to be enabled
1108 * This parameter can be one of the following values:
1109 * @arg TIM_CHANNEL_1: TIM Channel 1 selected
1110 * @arg TIM_CHANNEL_2: TIM Channel 2 selected
1111 * @arg TIM_CHANNEL_3: TIM Channel 3 selected
1112 * @arg TIM_CHANNEL_4: TIM Channel 4 selected
1113 * @param pData : The source Buffer address.
1114 * @param Length : The length of data to be transferred from memory to TIM peripheral
1115 * @retval HAL status
1116 */
1117 HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length)
1118 {
1119 /* Check the parameters */
1120 assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel));
1121
1122 if((htim->State == HAL_TIM_STATE_BUSY))
1123 {
1124 return HAL_BUSY;
1125 }
1126 else if((htim->State == HAL_TIM_STATE_READY))
1127 {
1128 if(((uint32_t)pData == 0 ) && (Length > 0))
1129 {
1130 return HAL_ERROR;
1131 }
1132 else
1133 {
1134 htim->State = HAL_TIM_STATE_BUSY;
1135 }
1136 }
1137 switch (Channel)
1138 {
1139 case TIM_CHANNEL_1:
1140 {
1141 /* Set the DMA Period elapsed callback */
1142 htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt;
1143
1144 /* Set the DMA error callback */
1145 htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ;
1146
1147 /* Enable the DMA channel */
1148 HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, Length);
1149
1150 /* Enable the TIM Capture/Compare 1 DMA request */
1151 __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1);
1152 }
1153 break;
1154
1155 case TIM_CHANNEL_2:
1156 {
1157 /* Set the DMA Period elapsed callback */
1158 htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt;
1159
1160 /* Set the DMA error callback */
1161 htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ;
1162
1163 /* Enable the DMA channel */
1164 HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, Length);
1165
1166 /* Enable the TIM Capture/Compare 2 DMA request */
1167 __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2);
1168 }
1169 break;
1170
1171 case TIM_CHANNEL_3:
1172 {
1173 /* Set the DMA Period elapsed callback */
1174 htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt;
1175
1176 /* Set the DMA error callback */
1177 htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ;
1178
1179 /* Enable the DMA channel */
1180 HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3,Length);
1181
1182 /* Enable the TIM Capture/Compare 3 DMA request */
1183 __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3);
1184 }
1185 break;
1186
1187 case TIM_CHANNEL_4:
1188 {
1189 /* Set the DMA Period elapsed callback */
1190 htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt;
1191
1192 /* Set the DMA error callback */
1193 htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ;
1194
1195 /* Enable the DMA channel */
1196 HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)pData, (uint32_t)&htim->Instance->CCR4, Length);
1197
1198 /* Enable the TIM Capture/Compare 4 DMA request */
1199 __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4);
1200 }
1201 break;
1202
1203 default:
1204 break;
1205 }
1206
1207 /* Enable the complementary PWM output */
1208 TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE);
1209
1210 /* Enable the Main Ouput */
1211 __HAL_TIM_MOE_ENABLE(htim);
1212
1213 /* Enable the Peripheral */
1214 __HAL_TIM_ENABLE(htim);
1215
1216 /* Return function status */
1217 return HAL_OK;
1218 }
1219
1220 /**
1221 * @brief Stops the TIM PWM signal generation in DMA mode on the complementary
1222 * output
1223 * @param htim : TIM handle
1224 * @param Channel : TIM Channel to be disabled
1225 * This parameter can be one of the following values:
1226 * @arg TIM_CHANNEL_1: TIM Channel 1 selected
1227 * @arg TIM_CHANNEL_2: TIM Channel 2 selected
1228 * @arg TIM_CHANNEL_3: TIM Channel 3 selected
1229 * @arg TIM_CHANNEL_4: TIM Channel 4 selected
1230 * @retval HAL status
1231 */
1232 HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel)
1233 {
1234 /* Check the parameters */
1235 assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel));
1236
1237 switch (Channel)
1238 {
1239 case TIM_CHANNEL_1:
1240 {
1241 /* Disable the TIM Capture/Compare 1 DMA request */
1242 __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1);
1243 }
1244 break;
1245
1246 case TIM_CHANNEL_2:
1247 {
1248 /* Disable the TIM Capture/Compare 2 DMA request */
1249 __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2);
1250 }
1251 break;
1252
1253 case TIM_CHANNEL_3:
1254 {
1255 /* Disable the TIM Capture/Compare 3 DMA request */
1256 __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3);
1257 }
1258 break;
1259
1260 case TIM_CHANNEL_4:
1261 {
1262 /* Disable the TIM Capture/Compare 4 DMA request */
1263 __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4);
1264 }
1265 break;
1266
1267 default:
1268 break;
1269 }
1270
1271 /* Disable the complementary PWM output */
1272 TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE);
1273
1274 /* Disable the Main Ouput */
1275 __HAL_TIM_MOE_DISABLE(htim);
1276
1277 /* Disable the Peripheral */
1278 __HAL_TIM_DISABLE(htim);
1279
1280 /* Change the htim state */
1281 htim->State = HAL_TIM_STATE_READY;
1282
1283 /* Return function status */
1284 return HAL_OK;
1285 }
1286
1287 /**
1288 * @}
1289 */
1290
1291 /** @defgroup TIMEx_Exported_Functions_Group4 Timer Complementary One Pulse functions
1292 * @brief Timer Complementary One Pulse functions
1293 *
1294 @verbatim
1295 ==============================================================================
1296 ##### Timer Complementary One Pulse functions #####
1297 ==============================================================================
1298 [..]
1299 This section provides functions allowing to:
1300 (+) Start the Complementary One Pulse generation.
1301 (+) Stop the Complementary One Pulse.
1302 (+) Start the Complementary One Pulse and enable interrupts.
1303 (+) Stop the Complementary One Pulse and disable interrupts.
1304
1305 @endverbatim
1306 * @{
1307 */
1308
1309 /**
1310 * @brief Starts the TIM One Pulse signal generation on the complemetary
1311 * output.
1312 * @param htim : TIM One Pulse handle
1313 * @param OutputChannel : TIM Channel to be enabled
1314 * This parameter can be one of the following values:
1315 * @arg TIM_CHANNEL_1: TIM Channel 1 selected
1316 * @arg TIM_CHANNEL_2: TIM Channel 2 selected
1317 * @retval HAL status
1318 */
1319 HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel)
1320 {
1321 /* Check the parameters */
1322 assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel));
1323
1324 /* Enable the complementary One Pulse output */
1325 TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_ENABLE);
1326
1327 /* Enable the Main Ouput */
1328 __HAL_TIM_MOE_ENABLE(htim);
1329
1330 /* Return function status */
1331 return HAL_OK;
1332 }
1333
1334 /**
1335 * @brief Stops the TIM One Pulse signal generation on the complementary
1336 * output.
1337 * @param htim : TIM One Pulse handle
1338 * @param OutputChannel : TIM Channel to be disabled
1339 * This parameter can be one of the following values:
1340 * @arg TIM_CHANNEL_1: TIM Channel 1 selected
1341 * @arg TIM_CHANNEL_2: TIM Channel 2 selected
1342 * @retval HAL status
1343 */
1344 HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel)
1345 {
1346
1347 /* Check the parameters */
1348 assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel));
1349
1350 /* Disable the complementary One Pulse output */
1351 TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_DISABLE);
1352
1353 /* Disable the Main Ouput */
1354 __HAL_TIM_MOE_DISABLE(htim);
1355
1356 /* Disable the Peripheral */
1357 __HAL_TIM_DISABLE(htim);
1358
1359 /* Return function status */
1360 return HAL_OK;
1361 }
1362
1363 /**
1364 * @brief Starts the TIM One Pulse signal generation in interrupt mode on the
1365 * complementary channel.
1366 * @param htim : TIM One Pulse handle
1367 * @param OutputChannel : TIM Channel to be enabled
1368 * This parameter can be one of the following values:
1369 * @arg TIM_CHANNEL_1: TIM Channel 1 selected
1370 * @arg TIM_CHANNEL_2: TIM Channel 2 selected
1371 * @retval HAL status
1372 */
1373 HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel)
1374 {
1375 /* Check the parameters */
1376 assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel));
1377
1378 /* Enable the TIM Capture/Compare 1 interrupt */
1379 __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1);
1380
1381 /* Enable the TIM Capture/Compare 2 interrupt */
1382 __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2);
1383
1384 /* Enable the complementary One Pulse output */
1385 TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_ENABLE);
1386
1387 /* Enable the Main Ouput */
1388 __HAL_TIM_MOE_ENABLE(htim);
1389
1390 /* Return function status */
1391 return HAL_OK;
1392 }
1393
1394 /**
1395 * @brief Stops the TIM One Pulse signal generation in interrupt mode on the
1396 * complementary channel.
1397 * @param htim : TIM One Pulse handle
1398 * @param OutputChannel : TIM Channel to be disabled
1399 * This parameter can be one of the following values:
1400 * @arg TIM_CHANNEL_1: TIM Channel 1 selected
1401 * @arg TIM_CHANNEL_2: TIM Channel 2 selected
1402 * @retval HAL status
1403 */
1404 HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel)
1405 {
1406 /* Check the parameters */
1407 assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel));
1408
1409 /* Disable the TIM Capture/Compare 1 interrupt */
1410 __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1);
1411
1412 /* Disable the TIM Capture/Compare 2 interrupt */
1413 __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2);
1414
1415 /* Disable the complementary One Pulse output */
1416 TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_DISABLE);
1417
1418 /* Disable the Main Ouput */
1419 __HAL_TIM_MOE_DISABLE(htim);
1420
1421 /* Disable the Peripheral */
1422 __HAL_TIM_DISABLE(htim);
1423
1424 /* Return function status */
1425 return HAL_OK;
1426 }
1427
1428 /**
1429 * @}
1430 */
1431
1432 #endif /* defined(STM32F100xB) || defined(STM32F100xE) || */
1433 /* defined(STM32F103x6) || defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG) || */
1434 /* defined(STM32F105xC) || defined(STM32F107xC) */
1435
1436 /** @defgroup TIMEx_Exported_Functions_Group5 Peripheral Control functions
1437 * @brief Peripheral Control functions
1438 *
1439 @verbatim
1440 ==============================================================================
1441 ##### Peripheral Control functions #####
1442 ==============================================================================
1443 [..]
1444 This section provides functions allowing to:
1445 (+) Configure the commutation event in case of use of the Hall sensor interface.
1446 (+) Configure Complementary channels, break features and dead time.
1447 (+) Configure Master synchronization.
1448
1449 @endverbatim
1450 * @{
1451 */
1452
1453 #if defined (STM32F100xB) || defined (STM32F100xE) || \
1454 defined (STM32F103x6) || defined (STM32F103xB) || defined (STM32F103xE) || defined (STM32F103xG) || \
1455 defined (STM32F105xC) || defined (STM32F107xC)
1456
1457 /**
1458 * @brief Configure the TIM commutation event sequence.
1459 * @note: this function is mandatory to use the commutation event in order to
1460 * update the configuration at each commutation detection on the TRGI input of the Timer,
1461 * the typical use of this feature is with the use of another Timer(interface Timer)
1462 * configured in Hall sensor interface, this interface Timer will generate the
1463 * commutation at its TRGO output (connected to Timer used in this function) each time
1464 * the TI1 of the Interface Timer detect a commutation at its input TI1.
1465 * @param htim : TIM handle
1466 * @param InputTrigger : the Internal trigger corresponding to the Timer Interfacing with the Hall sensor
1467 * This parameter can be one of the following values:
1468 * @arg TIM_TS_ITR0: Internal trigger 0 selected
1469 * @arg TIM_TS_ITR1: Internal trigger 1 selected
1470 * @arg TIM_TS_ITR2: Internal trigger 2 selected
1471 * @arg TIM_TS_ITR3: Internal trigger 3 selected
1472 * @arg TIM_TS_NONE: No trigger is needed
1473 * @param CommutationSource : the Commutation Event source
1474 * This parameter can be one of the following values:
1475 * @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer
1476 * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit
1477 * @retval HAL status
1478 */
1479 HAL_StatusTypeDef HAL_TIMEx_ConfigCommutationEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource)
1480 {
1481 /* Check the parameters */
1482 assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance));
1483 assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger));
1484
1485 __HAL_LOCK(htim);
1486
1487 if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) ||
1488 (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3))
1489 {
1490 /* Select the Input trigger */
1491 htim->Instance->SMCR &= ~TIM_SMCR_TS;
1492 htim->Instance->SMCR |= InputTrigger;
1493 }
1494
1495 /* Select the Capture Compare preload feature */
1496 htim->Instance->CR2 |= TIM_CR2_CCPC;
1497 /* Select the Commutation event source */
1498 htim->Instance->CR2 &= ~TIM_CR2_CCUS;
1499 htim->Instance->CR2 |= CommutationSource;
1500
1501 __HAL_UNLOCK(htim);
1502
1503 return HAL_OK;
1504 }
1505
1506 /**
1507 * @brief Configure the TIM commutation event sequence with interrupt.
1508 * @note: this function is mandatory to use the commutation event in order to
1509 * update the configuration at each commutation detection on the TRGI input of the Timer,
1510 * the typical use of this feature is with the use of another Timer(interface Timer)
1511 * configured in Hall sensor interface, this interface Timer will generate the
1512 * commutation at its TRGO output (connected to Timer used in this function) each time
1513 * the TI1 of the Interface Timer detect a commutation at its input TI1.
1514 * @param htim : TIM handle
1515 * @param InputTrigger : the Internal trigger corresponding to the Timer Interfacing with the Hall sensor
1516 * This parameter can be one of the following values:
1517 * @arg TIM_TS_ITR0: Internal trigger 0 selected
1518 * @arg TIM_TS_ITR1: Internal trigger 1 selected
1519 * @arg TIM_TS_ITR2: Internal trigger 2 selected
1520 * @arg TIM_TS_ITR3: Internal trigger 3 selected
1521 * @arg TIM_TS_NONE: No trigger is needed
1522 * @param CommutationSource : the Commutation Event source
1523 * This parameter can be one of the following values:
1524 * @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer
1525 * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit
1526 * @retval HAL status
1527 */
1528 HAL_StatusTypeDef HAL_TIMEx_ConfigCommutationEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource)
1529 {
1530 /* Check the parameters */
1531 assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance));
1532 assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger));
1533
1534 __HAL_LOCK(htim);
1535
1536 if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) ||
1537 (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3))
1538 {
1539 /* Select the Input trigger */
1540 htim->Instance->SMCR &= ~TIM_SMCR_TS;
1541 htim->Instance->SMCR |= InputTrigger;
1542 }
1543
1544 /* Select the Capture Compare preload feature */
1545 htim->Instance->CR2 |= TIM_CR2_CCPC;
1546 /* Select the Commutation event source */
1547 htim->Instance->CR2 &= ~TIM_CR2_CCUS;
1548 htim->Instance->CR2 |= CommutationSource;
1549
1550 /* Enable the Commutation Interrupt Request */
1551 __HAL_TIM_ENABLE_IT(htim, TIM_IT_COM);
1552
1553 __HAL_UNLOCK(htim);
1554
1555 return HAL_OK;
1556 }
1557
1558 /**
1559 * @brief Configure the TIM commutation event sequence with DMA.
1560 * @note: this function is mandatory to use the commutation event in order to
1561 * update the configuration at each commutation detection on the TRGI input of the Timer,
1562 * the typical use of this feature is with the use of another Timer(interface Timer)
1563 * configured in Hall sensor interface, this interface Timer will generate the
1564 * commutation at its TRGO output (connected to Timer used in this function) each time
1565 * the TI1 of the Interface Timer detect a commutation at its input TI1.
1566 * @note: The user should configure the DMA in his own software, in This function only the COMDE bit is set
1567 * @param htim : TIM handle
1568 * @param InputTrigger : the Internal trigger corresponding to the Timer Interfacing with the Hall sensor
1569 * This parameter can be one of the following values:
1570 * @arg TIM_TS_ITR0: Internal trigger 0 selected
1571 * @arg TIM_TS_ITR1: Internal trigger 1 selected
1572 * @arg TIM_TS_ITR2: Internal trigger 2 selected
1573 * @arg TIM_TS_ITR3: Internal trigger 3 selected
1574 * @arg TIM_TS_NONE: No trigger is needed
1575 * @param CommutationSource : the Commutation Event source
1576 * This parameter can be one of the following values:
1577 * @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer
1578 * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit
1579 * @retval HAL status
1580 */
1581 HAL_StatusTypeDef HAL_TIMEx_ConfigCommutationEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource)
1582 {
1583 /* Check the parameters */
1584 assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance));
1585 assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger));
1586
1587 __HAL_LOCK(htim);
1588
1589 if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) ||
1590 (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3))
1591 {
1592 /* Select the Input trigger */
1593 htim->Instance->SMCR &= ~TIM_SMCR_TS;
1594 htim->Instance->SMCR |= InputTrigger;
1595 }
1596
1597 /* Select the Capture Compare preload feature */
1598 htim->Instance->CR2 |= TIM_CR2_CCPC;
1599 /* Select the Commutation event source */
1600 htim->Instance->CR2 &= ~TIM_CR2_CCUS;
1601 htim->Instance->CR2 |= CommutationSource;
1602
1603 /* Enable the Commutation DMA Request */
1604 /* Set the DMA Commutation Callback */
1605 htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt;
1606 /* Set the DMA error callback */
1607 htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError;
1608
1609 /* Enable the Commutation DMA Request */
1610 __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_COM);
1611
1612 __HAL_UNLOCK(htim);
1613
1614 return HAL_OK;
1615 }
1616
1617 /**
1618 * @brief Configures the Break feature, dead time, Lock level, OSSI/OSSR State
1619 * and the AOE(automatic output enable).
1620 * @param htim : TIM handle
1621 * @param sBreakDeadTimeConfig : pointer to a TIM_ConfigBreakDeadConfigTypeDef structure that
1622 * contains the BDTR Register configuration information for the TIM peripheral.
1623 * @retval HAL status
1624 */
1625 HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim,
1626 TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig)
1627 {
1628 /* Check the parameters */
1629 assert_param(IS_TIM_BREAK_INSTANCE(htim->Instance));
1630 assert_param(IS_TIM_OSSR_STATE(sBreakDeadTimeConfig->OffStateRunMode));
1631 assert_param(IS_TIM_OSSI_STATE(sBreakDeadTimeConfig->OffStateIDLEMode));
1632 assert_param(IS_TIM_LOCK_LEVEL(sBreakDeadTimeConfig->LockLevel));
1633 assert_param(IS_TIM_DEADTIME(sBreakDeadTimeConfig->DeadTime));
1634 assert_param(IS_TIM_BREAK_STATE(sBreakDeadTimeConfig->BreakState));
1635 assert_param(IS_TIM_BREAK_POLARITY(sBreakDeadTimeConfig->BreakPolarity));
1636 assert_param(IS_TIM_AUTOMATIC_OUTPUT_STATE(sBreakDeadTimeConfig->AutomaticOutput));
1637
1638 /* Process Locked */
1639 __HAL_LOCK(htim);
1640
1641 htim->State = HAL_TIM_STATE_BUSY;
1642
1643 /* Set the Lock level, the Break enable Bit and the Polarity, the OSSR State,
1644 the OSSI State, the dead time value and the Automatic Output Enable Bit */
1645 htim->Instance->BDTR = (uint32_t)sBreakDeadTimeConfig->OffStateRunMode |
1646 sBreakDeadTimeConfig->OffStateIDLEMode |
1647 sBreakDeadTimeConfig->LockLevel |
1648 sBreakDeadTimeConfig->DeadTime |
1649 sBreakDeadTimeConfig->BreakState |
1650 sBreakDeadTimeConfig->BreakPolarity |
1651 sBreakDeadTimeConfig->AutomaticOutput;
1652
1653
1654 htim->State = HAL_TIM_STATE_READY;
1655
1656 __HAL_UNLOCK(htim);
1657
1658 return HAL_OK;
1659 }
1660
1661 #endif /* defined(STM32F100xB) || defined(STM32F100xE) || */
1662 /* defined(STM32F103x6) || defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG) || */
1663 /* defined(STM32F105xC) || defined(STM32F107xC) */
1664
1665 /**
1666 * @brief Configures the TIM in master mode.
1667 * @param htim : TIM handle.
1668 * @param sMasterConfig : pointer to a TIM_MasterConfigTypeDef structure that
1669 * contains the selected trigger output (TRGO) and the Master/Slave
1670 * mode.
1671 * @retval HAL status
1672 */
1673 HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, TIM_MasterConfigTypeDef * sMasterConfig)
1674 {
1675 /* Check the parameters */
1676 assert_param(IS_TIM_MASTER_INSTANCE(htim->Instance));
1677 assert_param(IS_TIM_TRGO_SOURCE(sMasterConfig->MasterOutputTrigger));
1678 assert_param(IS_TIM_MSM_STATE(sMasterConfig->MasterSlaveMode));
1679
1680 __HAL_LOCK(htim);
1681
1682 htim->State = HAL_TIM_STATE_BUSY;
1683
1684 /* Reset the MMS Bits */
1685 htim->Instance->CR2 &= ~TIM_CR2_MMS;
1686 /* Select the TRGO source */
1687 htim->Instance->CR2 |= sMasterConfig->MasterOutputTrigger;
1688
1689 /* Reset the MSM Bit */
1690 htim->Instance->SMCR &= ~TIM_SMCR_MSM;
1691 /* Set or Reset the MSM Bit */
1692 htim->Instance->SMCR |= sMasterConfig->MasterSlaveMode;
1693
1694 htim->State = HAL_TIM_STATE_READY;
1695
1696 __HAL_UNLOCK(htim);
1697
1698 return HAL_OK;
1699 }
1700
1701 /**
1702 * @}
1703 */
1704
1705 /** @defgroup TIMEx_Exported_Functions_Group6 Extension Callbacks functions
1706 * @brief Extension Callbacks functions
1707 *
1708 @verbatim
1709 ==============================================================================
1710 ##### Extension Callbacks functions #####
1711 ==============================================================================
1712 [..]
1713 This section provides Extension TIM callback functions:
1714 (+) Timer Commutation callback
1715 (+) Timer Break callback
1716
1717 @endverbatim
1718 * @{
1719 */
1720
1721 /**
1722 * @brief Hall commutation changed callback in non blocking mode
1723 * @param htim : TIM handle
1724 * @retval None
1725 */
1726 __weak void HAL_TIMEx_CommutationCallback(TIM_HandleTypeDef *htim)
1727 {
1728 /* Prevent unused argument(s) compilation warning */
1729 UNUSED(htim);
1730 /* NOTE : This function Should not be modified, when the callback is needed,
1731 the HAL_TIMEx_CommutationCallback could be implemented in the user file
1732 */
1733 }
1734
1735 /**
1736 * @brief Hall Break detection callback in non blocking mode
1737 * @param htim : TIM handle
1738 * @retval None
1739 */
1740 __weak void HAL_TIMEx_BreakCallback(TIM_HandleTypeDef *htim)
1741 {
1742 /* Prevent unused argument(s) compilation warning */
1743 UNUSED(htim);
1744 /* NOTE : This function Should not be modified, when the callback is needed,
1745 the HAL_TIMEx_BreakCallback could be implemented in the user file
1746 */
1747 }
1748
1749 /**
1750 * @brief TIM DMA Commutation callback.
1751 * @param hdma : pointer to DMA handle.
1752 * @retval None
1753 */
1754 void TIMEx_DMACommutationCplt(DMA_HandleTypeDef *hdma)
1755 {
1756 TIM_HandleTypeDef* htim = ( TIM_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
1757
1758 htim->State= HAL_TIM_STATE_READY;
1759
1760 HAL_TIMEx_CommutationCallback(htim);
1761 }
1762
1763 /**
1764 * @}
1765 */
1766
1767 #if defined (STM32F100xB) || defined (STM32F100xE) || \
1768 defined (STM32F103x6) || defined (STM32F103xB) || defined (STM32F103xE) || defined (STM32F103xG) || \
1769 defined (STM32F105xC) || defined (STM32F107xC)
1770
1771 /** @defgroup TIMEx_Exported_Functions_Group7 Extension Peripheral State functions
1772 * @brief Extension Peripheral State functions
1773 *
1774 @verbatim
1775 ==============================================================================
1776 ##### Extension Peripheral State functions #####
1777 ==============================================================================
1778 [..]
1779 This subsection permit to get in run-time the status of the peripheral
1780 and the data flow.
1781
1782 @endverbatim
1783 * @{
1784 */
1785
1786 /**
1787 * @brief Return the TIM Hall Sensor interface state
1788 * @param htim : TIM Hall Sensor handle
1789 * @retval HAL state
1790 */
1791 HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(TIM_HandleTypeDef *htim)
1792 {
1793 return htim->State;
1794 }
1795
1796 /**
1797 * @}
1798 */
1799 #endif /* defined(STM32F100xB) || defined(STM32F100xE) || */
1800 /* defined(STM32F103x6) || defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG) || */
1801 /* defined(STM32F105xC) || defined(STM32F107xC) */
1802
1803 /**
1804 * @}
1805 */
1806
1807 #if defined (STM32F100xB) || defined (STM32F100xE) || \
1808 defined (STM32F103x6) || defined (STM32F103xB) || defined (STM32F103xE) || defined (STM32F103xG) || \
1809 defined (STM32F105xC) || defined (STM32F107xC)
1810
1811 /** @addtogroup TIMEx_Private_Functions
1812 * @{
1813 */
1814
1815 /**
1816 * @brief Enables or disables the TIM Capture Compare Channel xN.
1817 * @param TIMx to select the TIM peripheral
1818 * @param Channel : specifies the TIM Channel
1819 * This parameter can be one of the following values:
1820 * @arg TIM_Channel_1: TIM Channel 1
1821 * @arg TIM_Channel_2: TIM Channel 2
1822 * @arg TIM_Channel_3: TIM Channel 3
1823 * @param ChannelNState : specifies the TIM Channel CCxNE bit new state.
1824 * This parameter can be: TIM_CCxN_ENABLE or TIM_CCxN_Disable.
1825 * @retval None
1826 */
1827 static void TIM_CCxNChannelCmd(TIM_TypeDef* TIMx, uint32_t Channel, uint32_t ChannelNState)
1828 {
1829 uint32_t tmp = 0;
1830
1831 tmp = TIM_CCER_CC1NE << Channel;
1832
1833 /* Reset the CCxNE Bit */
1834 TIMx->CCER &= ~tmp;
1835
1836 /* Set or reset the CCxNE Bit */
1837 TIMx->CCER |= (uint32_t)(ChannelNState << Channel);
1838 }
1839
1840 /**
1841 * @}
1842 */
1843
1844 #endif /* defined(STM32F100xB) || defined(STM32F100xE) || */
1845 /* defined(STM32F103x6) || defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG) || */
1846 /* defined(STM32F105xC) || defined(STM32F107xC) */
1847
1848 #endif /* HAL_TIM_MODULE_ENABLED */
1849 /**
1850 * @}
1851 */
1852
1853 /**
1854 * @}
1855 */
1856
1857 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/