Merge pull request #93 from zyp/master
[fw/stlink] / example / libs_stm / src / stm32l1xx / stm32l1xx_tim.c
1 /**\r
2   ******************************************************************************\r
3   * @file    stm32l1xx_tim.c\r
4   * @author  MCD Application Team\r
5   * @version V1.0.0\r
6   * @date    31-December-2010\r
7   * @brief   This file provides firmware functions to manage the following \r
8   *          functionalities of the TIM peripheral:\r
9   *            - TimeBase management\r
10   *            - Output Compare management\r
11   *            - Input Capture management\r
12   *            - Interrupts, DMA and flags management\r
13   *            - Clocks management\r
14   *            - Synchronization management\r
15   *            - Specific interface management\r
16   *            - Specific remapping management      \r
17   *              \r
18   *  @verbatim\r
19   *  \r
20   *          ===================================================================\r
21   *                                 How to use this driver\r
22   *          ===================================================================\r
23   *          This driver provides functions to configure and program the TIM \r
24   *          of all STM32L1xx devices\r
25   *          These functions are split in 8 groups: \r
26   *   \r
27   *          1. TIM TimeBase management: this group includes all needed functions \r
28   *             to configure the TM Timebase unit:\r
29   *                   - Set/Get Prescaler\r
30   *                   - Set/Get Autoreload  \r
31   *                   - Counter modes configuration\r
32   *                   - Set Clock division  \r
33   *                   - Select the One Pulse mode\r
34   *                   - Update Request Configuration\r
35   *                   - Update Disable Configuration\r
36   *                   - Auto-Preload Configuration \r
37   *                   - Enable/Disable the counter     \r
38   *                 \r
39   *          2. TIM Output Compare management: this group includes all needed \r
40   *             functions to configure the Capture/Compare unit used in Output \r
41   *             compare mode: \r
42   *                   - Configure each channel, independently, in Output Compare mode\r
43   *                   - Select the output compare modes\r
44   *                   - Select the Polarities of each channel\r
45   *                   - Set/Get the Capture/Compare register values\r
46   *                   - Select the Output Compare Fast mode \r
47   *                   - Select the Output Compare Forced mode  \r
48   *                   - Output Compare-Preload Configuration \r
49   *                   - Clear Output Compare Reference\r
50   *                   - Select the OCREF Clear signal\r
51   *                   - Enable/Disable the Capture/Compare Channels    \r
52   *                   \r
53   *          3. TIM Input Capture management: this group includes all needed \r
54   *             functions to configure the Capture/Compare unit used in \r
55   *             Input Capture mode:\r
56   *                   - Configure each channel in input capture mode\r
57   *                   - Configure Channel1/2 in PWM Input mode\r
58   *                   - Set the Input Capture Prescaler\r
59   *                   - Get the Capture/Compare values      \r
60   *        \r
61   *          4. TIM interrupts, DMA and flags management\r
62   *                   - Enable/Disable interrupt sources\r
63   *                   - Get flags status\r
64   *                   - Clear flags/ Pending bits\r
65   *                   - Enable/Disable DMA requests \r
66   *                   - Configure DMA burst mode\r
67   *                   - Select CaptureCompare DMA request  \r
68   *              \r
69   *          5. TIM clocks management: this group includes all needed functions \r
70   *             to configure the clock controller unit:\r
71   *                   - Select internal/External clock\r
72   *                   - Select the external clock mode: ETR(Mode1/Mode2), TIx or ITRx\r
73   *         \r
74   *          6. TIM synchronization management: this group includes all needed \r
75   *             functions to configure the Synchronization unit:\r
76   *                   - Select Input Trigger  \r
77   *                   - Select Output Trigger  \r
78   *                   - Select Master Slave Mode \r
79   *                   - ETR Configuration when used as external trigger   \r
80   *     \r
81   *          7. TIM specific interface management, this group includes all \r
82   *             needed functions to use the specific TIM interface:\r
83   *                   - Encoder Interface Configuration\r
84   *                   - Select Hall Sensor   \r
85   *         \r
86   *          8. TIM specific remapping management includes the Remapping \r
87   *             configuration of specific timers               \r
88   *   \r
89   *  @endverbatim\r
90   *    \r
91   ******************************************************************************\r
92   * @attention\r
93   *\r
94   * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS\r
95   * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE\r
96   * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY\r
97   * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING\r
98   * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE\r
99   * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.\r
100   *\r
101   * <h2><center>&copy; COPYRIGHT 2010 STMicroelectronics</center></h2>\r
102   ******************************************************************************  \r
103   */ \r
104 \r
105 /* Includes ------------------------------------------------------------------*/\r
106 #include "stm32l1xx_tim.h"\r
107 #include "stm32l1xx_rcc.h"\r
108 \r
109 /** @addtogroup STM32L1xx_StdPeriph_Driver\r
110   * @{\r
111   */\r
112 \r
113 /** @defgroup TIM \r
114   * @brief TIM driver modules\r
115   * @{\r
116   */\r
117 \r
118 /* Private typedef -----------------------------------------------------------*/\r
119 /* Private define ------------------------------------------------------------*/\r
120 \r
121 /* ---------------------- TIM registers bit mask ------------------------ */\r
122 #define SMCR_ETR_MASK               ((uint16_t)0x00FF) \r
123 #define CCMR_OFFSET                 ((uint16_t)0x0018)\r
124 #define CCER_CCE_SET                ((uint16_t)0x0001)  \r
125   \r
126 /* Private macro -------------------------------------------------------------*/\r
127 /* Private variables ---------------------------------------------------------*/\r
128 /* Private function prototypes -----------------------------------------------*/\r
129 \r
130 static void TI1_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,\r
131                        uint16_t TIM_ICFilter);\r
132 static void TI2_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,\r
133                        uint16_t TIM_ICFilter);\r
134 static void TI3_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,\r
135                        uint16_t TIM_ICFilter);\r
136 static void TI4_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,\r
137                        uint16_t TIM_ICFilter);\r
138 /* Private functions ---------------------------------------------------------*/\r
139 \r
140 /** @defgroup TIM_Private_Functions\r
141   * @{\r
142   */\r
143 \r
144 /** @defgroup TIM_Group1 TimeBase management functions\r
145  *  @brief   TimeBase management functions \r
146  *\r
147 @verbatim   \r
148  ===============================================================================\r
149                        TimeBase management functions\r
150  ===============================================================================  \r
151   \r
152        ===================================================================      \r
153               TIM Driver: how to use it in Timing(Time base) Mode\r
154        =================================================================== \r
155        To use the Timer in Timing(Time base) mode, the following steps are mandatory:\r
156        \r
157        1. Enable TIM clock using RCC_APBxPeriphClockCmd(RCC_APBxPeriph_TIMx, ENABLE) function\r
158                     \r
159        2. Fill the TIM_TimeBaseInitStruct with the desired parameters.\r
160        \r
161        3. Call TIM_TimeBaseInit(TIMx, &TIM_TimeBaseInitStruct) to configure the Time Base unit\r
162           with the corresponding configuration\r
163           \r
164        4. Enable the NVIC if you need to generate the update interrupt. \r
165           \r
166        5. Enable the corresponding interrupt using the function TIM_ITConfig(TIMx, TIM_IT_Update) \r
167        \r
168        6. Call the TIM_Cmd(ENABLE) function to enable the TIM counter.\r
169              \r
170        Note1: All other functions can be used seperatly to modify, if needed,\r
171           a specific feature of the Timer. \r
172 \r
173 @endverbatim\r
174   * @{\r
175   */\r
176 \r
177 /**\r
178   * @brief  Deinitializes the TIMx peripheral registers to their default reset values.\r
179   * @param  TIMx: where x can be 2 to 11 to select the TIM peripheral.\r
180   * @retval None\r
181   *   \r
182   */\r
183 void TIM_DeInit(TIM_TypeDef* TIMx)\r
184 {\r
185   /* Check the parameters */\r
186   assert_param(IS_TIM_ALL_PERIPH(TIMx)); \r
187    \r
188   if (TIMx == TIM2)\r
189   {\r
190     RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2, ENABLE);\r
191     RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2, DISABLE);\r
192   }\r
193   else if (TIMx == TIM3)\r
194   {\r
195     RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3, ENABLE);\r
196     RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3, DISABLE);\r
197   }\r
198   else if (TIMx == TIM4)\r
199   {\r
200     RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, ENABLE);\r
201     RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, DISABLE);\r
202   } \r
203 \r
204   else if (TIMx == TIM6)\r
205   {\r
206     RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM6, ENABLE);\r
207     RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM6, DISABLE);\r
208   } \r
209   else if (TIMx == TIM7)\r
210   {\r
211     RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM7, ENABLE);\r
212     RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM7, DISABLE);\r
213   } \r
214 \r
215   else if (TIMx == TIM9)\r
216   {\r
217     RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM9, ENABLE);\r
218     RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM9, DISABLE);\r
219   } \r
220   else if (TIMx == TIM10)\r
221   {\r
222     RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM10, ENABLE);\r
223     RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM10, DISABLE);\r
224   } \r
225   else\r
226   {\r
227     if (TIMx == TIM11)\r
228     {\r
229       RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM11, ENABLE);\r
230       RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM11, DISABLE); \r
231     }  \r
232   }\r
233      \r
234 }\r
235 \r
236 /**\r
237   * @brief  Initializes the TIMx Time Base Unit peripheral according to \r
238   *         the specified parameters in the TIM_TimeBaseInitStruct.\r
239   * @param  TIMx: where x can be 2 to 11 to select the TIM peripheral.\r
240   * @param  TIM_TimeBaseInitStruct: pointer to a TIM_TimeBaseInitTypeDef\r
241   *         structure that contains the configuration information for\r
242   *         the specified TIM peripheral.\r
243   * @retval None\r
244   */\r
245 void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)\r
246 {\r
247   uint16_t tmpcr1 = 0;\r
248 \r
249   /* Check the parameters */\r
250   assert_param(IS_TIM_ALL_PERIPH(TIMx)); \r
251   assert_param(IS_TIM_COUNTER_MODE(TIM_TimeBaseInitStruct->TIM_CounterMode));\r
252   assert_param(IS_TIM_CKD_DIV(TIM_TimeBaseInitStruct->TIM_ClockDivision));\r
253 \r
254   tmpcr1 = TIMx->CR1;  \r
255 \r
256   if(((TIMx) == TIM2) || ((TIMx) == TIM3) || ((TIMx) == TIM4))\r
257   {                                                                                     \r
258     /* Select the Counter Mode */\r
259     tmpcr1 &= (uint16_t)(~((uint16_t)(TIM_CR1_DIR | TIM_CR1_CMS)));\r
260     tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_CounterMode;\r
261   }\r
262  \r
263   if(((TIMx) != TIM6) && ((TIMx) != TIM7))\r
264   {\r
265     /* Set the clock division */\r
266     tmpcr1 &= (uint16_t)(~((uint16_t)TIM_CR1_CKD));\r
267     tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_ClockDivision;\r
268   }\r
269 \r
270   TIMx->CR1 = tmpcr1;\r
271 \r
272   /* Set the Autoreload value */\r
273   TIMx->ARR = TIM_TimeBaseInitStruct->TIM_Period ;\r
274  \r
275   /* Set the Prescaler value */\r
276   TIMx->PSC = TIM_TimeBaseInitStruct->TIM_Prescaler;\r
277     \r
278   /* Generate an update event to reload the Prescaler value immediatly */\r
279   TIMx->EGR = TIM_PSCReloadMode_Immediate;          \r
280 }\r
281 \r
282 /**\r
283   * @brief  Fills each TIM_TimeBaseInitStruct member with its default value.\r
284   * @param  TIM_TimeBaseInitStruct : pointer to a TIM_TimeBaseInitTypeDef\r
285   *         structure which will be initialized.\r
286   * @retval None\r
287   */\r
288 void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)\r
289 {\r
290   /* Set the default configuration */\r
291   TIM_TimeBaseInitStruct->TIM_Period = 0xFFFF;\r
292   TIM_TimeBaseInitStruct->TIM_Prescaler = 0x0000;\r
293   TIM_TimeBaseInitStruct->TIM_ClockDivision = TIM_CKD_DIV1;\r
294   TIM_TimeBaseInitStruct->TIM_CounterMode = TIM_CounterMode_Up;\r
295 }\r
296 \r
297 /**\r
298   * @brief  Configures the TIMx Prescaler.\r
299   * @param  TIMx: where x can be 2 to 11 to select the TIM peripheral.\r
300   * @param  Prescaler: specifies the Prescaler Register value\r
301   * @param  TIM_PSCReloadMode: specifies the TIM Prescaler Reload mode\r
302   *   This parameter can be one of the following values:\r
303   *     @arg TIM_PSCReloadMode_Update: The Prescaler is loaded at the update event.\r
304   *     @arg TIM_PSCReloadMode_Immediate: The Prescaler is loaded immediatly.\r
305   * @retval None\r
306   */\r
307 void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode)\r
308 {\r
309   /* Check the parameters */\r
310   assert_param(IS_TIM_ALL_PERIPH(TIMx));\r
311   assert_param(IS_TIM_PRESCALER_RELOAD(TIM_PSCReloadMode));\r
312   \r
313   /* Set the Prescaler value */\r
314   TIMx->PSC = Prescaler;\r
315   /* Set or reset the UG Bit */\r
316   TIMx->EGR = TIM_PSCReloadMode;\r
317 }\r
318 \r
319 /**\r
320   * @brief  Specifies the TIMx Counter Mode to be used.\r
321   * @param  TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.\r
322   * @param  TIM_CounterMode: specifies the Counter Mode to be used\r
323   *   This parameter can be one of the following values:\r
324   *     @arg TIM_CounterMode_Up: TIM Up Counting Mode\r
325   *     @arg TIM_CounterMode_Down: TIM Down Counting Mode\r
326   *     @arg TIM_CounterMode_CenterAligned1: TIM Center Aligned Mode1\r
327   *     @arg TIM_CounterMode_CenterAligned2: TIM Center Aligned Mode2\r
328   *     @arg TIM_CounterMode_CenterAligned3: TIM Center Aligned Mode3\r
329   * @retval None\r
330   */\r
331 void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode)\r
332 {\r
333   uint16_t tmpcr1 = 0;\r
334   \r
335   /* Check the parameters */\r
336   assert_param(IS_TIM_LIST3_PERIPH(TIMx));\r
337   assert_param(IS_TIM_COUNTER_MODE(TIM_CounterMode));\r
338   \r
339   tmpcr1 = TIMx->CR1;\r
340   /* Reset the CMS and DIR Bits */\r
341   tmpcr1 &= (uint16_t)(~((uint16_t)(TIM_CR1_DIR | TIM_CR1_CMS)));\r
342   /* Set the Counter Mode */\r
343   tmpcr1 |= TIM_CounterMode;\r
344   /* Write to TIMx CR1 register */\r
345   TIMx->CR1 = tmpcr1;\r
346 }\r
347 \r
348 /**\r
349   * @brief  Sets the TIMx Counter Register value\r
350   * @param  TIMx: where x can be 2 to 11 to select the TIM peripheral.\r
351   * @param  Counter: specifies the Counter register new value.\r
352   * @retval None\r
353   */\r
354 void TIM_SetCounter(TIM_TypeDef* TIMx, uint32_t Counter)\r
355 {\r
356   /* Check the parameters */\r
357    assert_param(IS_TIM_ALL_PERIPH(TIMx));\r
358    \r
359   /* Set the Counter Register value */\r
360   TIMx->CNT = Counter;\r
361 }\r
362 \r
363 /**\r
364   * @brief  Sets the TIMx Autoreload Register value\r
365   * @param  TIMx: where x can be 2 to 11 to select the TIM peripheral.\r
366   * @param  Autoreload: specifies the Autoreload register new value.\r
367   * @retval None\r
368   */\r
369 void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint32_t Autoreload)\r
370 {\r
371   /* Check the parameters */\r
372   assert_param(IS_TIM_ALL_PERIPH(TIMx));\r
373   \r
374   /* Set the Autoreload Register value */\r
375   TIMx->ARR = Autoreload;\r
376 }\r
377 \r
378 /**\r
379   * @brief  Gets the TIMx Counter value.\r
380   * @param  TIMx: where x can be 2 to 11 to select the TIM peripheral.\r
381   * @retval Counter Register value.\r
382   */\r
383 uint32_t TIM_GetCounter(TIM_TypeDef* TIMx)\r
384 {\r
385   /* Check the parameters */\r
386   assert_param(IS_TIM_ALL_PERIPH(TIMx));\r
387   \r
388   /* Get the Counter Register value */\r
389   return TIMx->CNT;\r
390 }\r
391 \r
392 /**\r
393   * @brief  Gets the TIMx Prescaler value.\r
394   * @param  TIMx: where x can be 2 to 11 to select the TIM peripheral.\r
395   * @retval Prescaler Register value.\r
396   */\r
397 uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx)\r
398 {\r
399   /* Check the parameters */\r
400   assert_param(IS_TIM_ALL_PERIPH(TIMx));\r
401   \r
402   /* Get the Prescaler Register value */\r
403   return TIMx->PSC;\r
404 }\r
405 \r
406 /**\r
407   * @brief  Enables or Disables the TIMx Update event.\r
408   * @param  TIMx: where x can be 2 to 11 to select the TIM peripheral.\r
409   * @param  NewState: new state of the TIMx UDIS bit\r
410   *   This parameter can be: ENABLE or DISABLE.\r
411   * @retval None\r
412   */\r
413 void TIM_UpdateDisableConfig(TIM_TypeDef* TIMx, FunctionalState NewState)\r
414 {\r
415   /* Check the parameters */\r
416   assert_param(IS_TIM_ALL_PERIPH(TIMx));\r
417   assert_param(IS_FUNCTIONAL_STATE(NewState));\r
418   \r
419   if (NewState != DISABLE)\r
420   {\r
421     /* Set the Update Disable Bit */\r
422     TIMx->CR1 |= TIM_CR1_UDIS;\r
423   }\r
424   else\r
425   {\r
426     /* Reset the Update Disable Bit */\r
427     TIMx->CR1 &= (uint16_t)~((uint16_t)TIM_CR1_UDIS);\r
428   }\r
429 }\r
430 \r
431 /**\r
432   * @brief  Configures the TIMx Update Request Interrupt source.\r
433   * @param  TIMx: where x can be 2 to 11 to select the TIM peripheral.\r
434   * @param  TIM_UpdateSource: specifies the Update source.\r
435   *   This parameter can be one of the following values:\r
436   *     @arg TIM_UpdateSource_Regular: Source of update is the counter overflow/underflow\r
437                                        or the setting of UG bit, or an update generation\r
438                                        through the slave mode controller.\r
439   *     @arg TIM_UpdateSource_Global: Source of update is counter overflow/underflow.\r
440   * @retval None\r
441   */\r
442 void TIM_UpdateRequestConfig(TIM_TypeDef* TIMx, uint16_t TIM_UpdateSource)\r
443 {\r
444   /* Check the parameters */\r
445   assert_param(IS_TIM_ALL_PERIPH(TIMx));\r
446   assert_param(IS_TIM_UPDATE_SOURCE(TIM_UpdateSource));\r
447   \r
448   if (TIM_UpdateSource != TIM_UpdateSource_Global)\r
449   {\r
450     /* Set the URS Bit */\r
451     TIMx->CR1 |= TIM_CR1_URS;\r
452   }\r
453   else\r
454   {\r
455     /* Reset the URS Bit */\r
456     TIMx->CR1 &= (uint16_t)~((uint16_t)TIM_CR1_URS);\r
457   }\r
458 }\r
459 \r
460 /**\r
461   * @brief  Enables or disables TIMx peripheral Preload register on ARR.\r
462   * @param  TIMx: where x can be  2 to 11 to select the TIM peripheral.\r
463   * @param  NewState: new state of the TIMx peripheral Preload register\r
464   *   This parameter can be: ENABLE or DISABLE.\r
465   * @retval None\r
466   */\r
467 void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState)\r
468 {\r
469   /* Check the parameters */\r
470   assert_param(IS_TIM_ALL_PERIPH(TIMx));\r
471   assert_param(IS_FUNCTIONAL_STATE(NewState));\r
472   \r
473   if (NewState != DISABLE)\r
474   {\r
475     /* Set the ARR Preload Bit */\r
476     TIMx->CR1 |= TIM_CR1_ARPE;\r
477   }\r
478   else\r
479   {\r
480     /* Reset the ARR Preload Bit */\r
481     TIMx->CR1 &= (uint16_t)~((uint16_t)TIM_CR1_ARPE);\r
482   }\r
483 }\r
484 \r
485 /**\r
486   * @brief  Selects the TIMx\92s One Pulse Mode.\r
487   * @param  TIMx: where x can be 2 to 11 to select the TIM peripheral.\r
488   * @param  TIM_OPMode: specifies the OPM Mode to be used.\r
489   *   This parameter can be one of the following values:\r
490   *     @arg TIM_OPMode_Single\r
491   *     @arg TIM_OPMode_Repetitive\r
492   * @retval None\r
493   */\r
494 void TIM_SelectOnePulseMode(TIM_TypeDef* TIMx, uint16_t TIM_OPMode)\r
495 {\r
496   /* Check the parameters */\r
497   assert_param(IS_TIM_ALL_PERIPH(TIMx));\r
498   assert_param(IS_TIM_OPM_MODE(TIM_OPMode));\r
499   \r
500   /* Reset the OPM Bit */\r
501   TIMx->CR1 &= (uint16_t)~((uint16_t)TIM_CR1_OPM);\r
502   /* Configure the OPM Mode */\r
503   TIMx->CR1 |= TIM_OPMode;\r
504 }\r
505 \r
506 /**\r
507   * @brief  Sets the TIMx Clock Division value.\r
508   * @param  TIMx: where x can be  2, 3, 4, 9, 10 or 11 to select the TIM peripheral.\r
509   * @param  TIM_CKD: specifies the clock division value.\r
510   *   This parameter can be one of the following value:\r
511   *     @arg TIM_CKD_DIV1: TDTS = Tck_tim\r
512   *     @arg TIM_CKD_DIV2: TDTS = 2*Tck_tim\r
513   *     @arg TIM_CKD_DIV4: TDTS = 4*Tck_tim\r
514   * @retval None\r
515   */\r
516 void TIM_SetClockDivision(TIM_TypeDef* TIMx, uint16_t TIM_CKD)\r
517 {\r
518   /* Check the parameters */\r
519   assert_param(IS_TIM_LIST1_PERIPH(TIMx));\r
520   assert_param(IS_TIM_CKD_DIV(TIM_CKD));\r
521   \r
522   /* Reset the CKD Bits */\r
523   TIMx->CR1 &= (uint16_t)~((uint16_t)TIM_CR1_CKD);\r
524   /* Set the CKD value */\r
525   TIMx->CR1 |= TIM_CKD;\r
526 }\r
527 \r
528 /**\r
529   * @brief  Enables or disables the specified TIM peripheral.\r
530   * @param  TIMx: where x can be 2 to 11 to select the TIMx peripheral.\r
531   * @param  NewState: new state of the TIMx peripheral.\r
532   *         This parameter can be: ENABLE or DISABLE.\r
533   * @retval None\r
534   */\r
535 void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)\r
536 {\r
537   /* Check the parameters */\r
538   assert_param(IS_TIM_ALL_PERIPH(TIMx)); \r
539   assert_param(IS_FUNCTIONAL_STATE(NewState));\r
540   \r
541   if (NewState != DISABLE)\r
542   {\r
543     /* Enable the TIM Counter */\r
544     TIMx->CR1 |= TIM_CR1_CEN;\r
545   }\r
546   else\r
547   {\r
548     /* Disable the TIM Counter */\r
549     TIMx->CR1 &= (uint16_t)(~((uint16_t)TIM_CR1_CEN));\r
550   }\r
551 }\r
552 \r
553 /**\r
554   * @}\r
555   */\r
556 \r
557 /** @defgroup TIM_Group2 Output Compare management functions\r
558  *  @brief    Output Compare management functions \r
559  *\r
560 @verbatim   \r
561  ===============================================================================\r
562                         Output Compare management functions\r
563  ===============================================================================  \r
564    \r
565        ===================================================================      \r
566               TIM Driver: how to use it in Output Compare Mode\r
567        =================================================================== \r
568        To use the Timer in Output Compare mode, the following steps are mandatory:\r
569        \r
570        1. Enable TIM clock using RCC_APBxPeriphClockCmd(RCC_APBxPeriph_TIMx, ENABLE) function\r
571        \r
572        2. Configure the TIM pins by configuring the corresponding GPIO pins\r
573        \r
574        2. Configure the Time base unit as described in the first part of this driver, if needed,\r
575           else the Timer will run with the default configuration:\r
576           - Autoreload value = 0xFFFF\r
577           - Prescaler value = 0x0000\r
578           - Counter mode = Up counting\r
579           - Clock Division = TIM_CKD_DIV1\r
580           \r
581        3. Fill the TIM_OCInitStruct with the desired parameters including:\r
582           - The TIM Output Compare mode: TIM_OCMode\r
583           - TIM Output State: TIM_OutputState\r
584           - TIM Pulse value: TIM_Pulse\r
585           - TIM Output Compare Polarity : TIM_OCPolarity\r
586        \r
587        4. Call TIM_OCxInit(TIMx, &TIM_OCInitStruct) to configure the desired channel with the \r
588           corresponding configuration\r
589        \r
590        5. Call the TIM_Cmd(ENABLE) function to enable the TIM counter.\r
591        \r
592        Note1: All other functions can be used separately to modify, if needed,\r
593           a specific feature of the Timer. \r
594           \r
595        Note2: In case of PWM mode, this function is mandatory:\r
596               TIM_OCxPreloadConfig(TIMx, TIM_OCPreload_ENABLE); \r
597               \r
598        Note3: If the corresponding interrupt or DMA request are needed, the user should:\r
599               1. Enable the NVIC (or the DMA) to use the TIM interrupts (or DMA requests). \r
600               2. Enable the corresponding interrupt (or DMA request) using the function \r
601               TIM_ITConfig(TIMx, TIM_IT_CCx) (or TIM_DMA_Cmd(TIMx, TIM_DMA_CCx))   \r
602 \r
603 @endverbatim\r
604   * @{\r
605   */\r
606 \r
607 /**\r
608   * @brief  Initializes the TIMx Channel1 according to the specified\r
609   *         parameters in the TIM_OCInitStruct.\r
610   * @param  TIMx: where x can be 2, 3, 4, 9, 10 or 11 to select the TIM peripheral.\r
611   * @param  TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure\r
612   *         that contains the configuration information for the specified TIM \r
613   *         peripheral.\r
614   * @retval None\r
615   */\r
616 void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)\r
617 {\r
618   uint16_t tmpccmrx = 0, tmpccer = 0;\r
619    \r
620   /* Check the parameters */\r
621   assert_param(IS_TIM_LIST1_PERIPH(TIMx));\r
622   assert_param(IS_TIM_OC_MODE(TIM_OCInitStruct->TIM_OCMode));\r
623   assert_param(IS_TIM_OUTPUT_STATE(TIM_OCInitStruct->TIM_OutputState));\r
624   assert_param(IS_TIM_OC_POLARITY(TIM_OCInitStruct->TIM_OCPolarity));   \r
625   /* Disable the Channel 1: Reset the CC1E Bit */\r
626   TIMx->CCER &= (uint16_t)(~(uint16_t)TIM_CCER_CC1E);\r
627   \r
628   /* Get the TIMx CCER register value */\r
629   tmpccer = TIMx->CCER;\r
630   \r
631   /* Get the TIMx CCMR1 register value */\r
632   tmpccmrx = TIMx->CCMR1;\r
633     \r
634   /* Reset the Output Compare Mode Bits */\r
635   tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR1_OC1M));\r
636   tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR1_CC1S));\r
637   \r
638   /* Select the Output Compare Mode */\r
639   tmpccmrx |= TIM_OCInitStruct->TIM_OCMode;\r
640   \r
641   /* Reset the Output Polarity level */\r
642   tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC1P));\r
643   /* Set the Output Compare Polarity */\r
644   tmpccer |= TIM_OCInitStruct->TIM_OCPolarity;\r
645   \r
646   /* Set the Output State */\r
647   tmpccer |= TIM_OCInitStruct->TIM_OutputState;\r
648   \r
649   /* Set the Capture Compare Register value */\r
650   TIMx->CCR1 = TIM_OCInitStruct->TIM_Pulse;\r
651   \r
652   /* Write to TIMx CCMR1 */\r
653   TIMx->CCMR1 = tmpccmrx;\r
654   \r
655   /* Write to TIMx CCER */\r
656   TIMx->CCER = tmpccer;\r
657 }\r
658 \r
659 /**\r
660   * @brief  Initializes the TIMx Channel2 according to the specified\r
661   *         parameters in the TIM_OCInitStruct.\r
662   * @param  TIMx: where x can be 2, 3, 4 or 9 to select the TIM peripheral.\r
663   * @param  TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure\r
664   *         that contains the configuration information for the specified TIM \r
665   *         peripheral.\r
666   * @retval None\r
667   */\r
668 void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)\r
669 {\r
670   uint16_t tmpccmrx = 0, tmpccer = 0;\r
671    \r
672   /* Check the parameters */\r
673   assert_param(IS_TIM_LIST2_PERIPH(TIMx)); \r
674   assert_param(IS_TIM_OC_MODE(TIM_OCInitStruct->TIM_OCMode));\r
675   assert_param(IS_TIM_OUTPUT_STATE(TIM_OCInitStruct->TIM_OutputState));\r
676   assert_param(IS_TIM_OC_POLARITY(TIM_OCInitStruct->TIM_OCPolarity));   \r
677   /* Disable the Channel 2: Reset the CC2E Bit */\r
678   TIMx->CCER &= (uint16_t)(~((uint16_t)TIM_CCER_CC2E));\r
679   \r
680   /* Get the TIMx CCER register value */  \r
681   tmpccer = TIMx->CCER;\r
682   \r
683   /* Get the TIMx CCMR1 register value */\r
684   tmpccmrx = TIMx->CCMR1;\r
685     \r
686   /* Reset the Output Compare Mode Bits */\r
687   tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR1_OC2M));\r
688   \r
689   /* Select the Output Compare Mode */\r
690   tmpccmrx |= (uint16_t)(TIM_OCInitStruct->TIM_OCMode << 8);\r
691   \r
692   /* Reset the Output Polarity level */\r
693   tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC2P));\r
694   /* Set the Output Compare Polarity */\r
695   tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCPolarity << 4);\r
696   \r
697   /* Set the Output State */\r
698   tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputState << 4);\r
699   \r
700   /* Set the Capture Compare Register value */\r
701   TIMx->CCR2 = TIM_OCInitStruct->TIM_Pulse;\r
702     \r
703   /* Write to TIMx CCMR1 */\r
704   TIMx->CCMR1 = tmpccmrx;\r
705   \r
706   /* Write to TIMx CCER */\r
707   TIMx->CCER = tmpccer;\r
708 }\r
709 \r
710 /**\r
711   * @brief  Initializes the TIMx Channel3 according to the specified\r
712   *         parameters in the TIM_OCInitStruct.\r
713   * @param  TIMx: where x can be  2, 3 or 4 to select the TIM peripheral.\r
714   * @param  TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure\r
715   *         that contains the configuration information for the specified TIM \r
716   *         peripheral.\r
717   * @retval None\r
718   */\r
719 void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)\r
720 {\r
721   uint16_t tmpccmrx = 0, tmpccer = 0;\r
722    \r
723   /* Check the parameters */\r
724   assert_param(IS_TIM_LIST3_PERIPH(TIMx));\r
725   assert_param(IS_TIM_OC_MODE(TIM_OCInitStruct->TIM_OCMode));\r
726   assert_param(IS_TIM_OUTPUT_STATE(TIM_OCInitStruct->TIM_OutputState));\r
727   assert_param(IS_TIM_OC_POLARITY(TIM_OCInitStruct->TIM_OCPolarity));   \r
728 \r
729   /* Disable the Channel 2: Reset the CC2E Bit */\r
730   TIMx->CCER &= (uint16_t)(~((uint16_t)TIM_CCER_CC3E));\r
731   \r
732   /* Get the TIMx CCER register value */\r
733   tmpccer = TIMx->CCER;\r
734   \r
735   /* Get the TIMx CCMR2 register value */\r
736   tmpccmrx = TIMx->CCMR2;\r
737     \r
738   /* Reset the Output Compare Mode Bits */\r
739   tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR2_OC3M));\r
740   \r
741   /* Select the Output Compare Mode */\r
742   tmpccmrx |= TIM_OCInitStruct->TIM_OCMode;\r
743   \r
744   /* Reset the Output Polarity level */\r
745   tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC3P));\r
746   /* Set the Output Compare Polarity */\r
747   tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCPolarity << 8);\r
748   \r
749   /* Set the Output State */\r
750   tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputState << 8);\r
751   \r
752   /* Set the Capture Compare Register value */\r
753   TIMx->CCR3 = TIM_OCInitStruct->TIM_Pulse;\r
754   \r
755   /* Write to TIMx CCMR2 */\r
756   TIMx->CCMR2 = tmpccmrx;\r
757   \r
758   /* Write to TIMx CCER */\r
759   TIMx->CCER = tmpccer;\r
760 }\r
761 \r
762 /**\r
763   * @brief  Initializes the TIMx Channel4 according to the specified\r
764   *         parameters in the TIM_OCInitStruct.\r
765   * @param  TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.\r
766   * @param  TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure\r
767   *         that contains the configuration information for the specified TIM \r
768   *         peripheral.\r
769   * @retval None\r
770   */\r
771 void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)\r
772 {\r
773   uint16_t tmpccmrx = 0, tmpccer = 0;\r
774    \r
775   /* Check the parameters */\r
776   assert_param(IS_TIM_LIST3_PERIPH(TIMx)); \r
777   assert_param(IS_TIM_OC_MODE(TIM_OCInitStruct->TIM_OCMode));\r
778   assert_param(IS_TIM_OUTPUT_STATE(TIM_OCInitStruct->TIM_OutputState));\r
779   assert_param(IS_TIM_OC_POLARITY(TIM_OCInitStruct->TIM_OCPolarity));   \r
780 \r
781   /* Disable the Channel 2: Reset the CC4E Bit */\r
782   TIMx->CCER &= (uint16_t)(~((uint16_t)TIM_CCER_CC4E));\r
783   \r
784   /* Get the TIMx CCER register value */\r
785   tmpccer = TIMx->CCER;\r
786   \r
787   /* Get the TIMx CCMR2 register value */\r
788   tmpccmrx = TIMx->CCMR2;\r
789     \r
790   /* Reset the Output Compare Mode Bits */\r
791   tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR2_OC4M));\r
792   \r
793   /* Select the Output Compare Mode */\r
794   tmpccmrx |= (uint16_t)(TIM_OCInitStruct->TIM_OCMode << 8);\r
795   \r
796   /* Reset the Output Polarity level */\r
797   tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC4P));\r
798   /* Set the Output Compare Polarity */\r
799   tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCPolarity << 12);\r
800   \r
801   /* Set the Output State */\r
802   tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputState << 12);\r
803   \r
804   /* Set the Capture Compare Register value */\r
805   TIMx->CCR4 = TIM_OCInitStruct->TIM_Pulse;\r
806   \r
807   /* Write to TIMx CCMR2 */  \r
808   TIMx->CCMR2 = tmpccmrx;\r
809   \r
810   /* Write to TIMx CCER */\r
811   TIMx->CCER = tmpccer;\r
812 }\r
813 \r
814 /**\r
815   * @brief  Fills each TIM_OCInitStruct member with its default value.\r
816   * @param  TIM_OCInitStruct : pointer to a TIM_OCInitTypeDef structure which will\r
817   *         be initialized.\r
818   * @retval None\r
819   */\r
820 void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct)\r
821 {\r
822   /* Set the default configuration */\r
823   TIM_OCInitStruct->TIM_OCMode = TIM_OCMode_Timing;\r
824   TIM_OCInitStruct->TIM_OutputState = TIM_OutputState_Disable;\r
825   TIM_OCInitStruct->TIM_Pulse = 0x0000;\r
826   TIM_OCInitStruct->TIM_OCPolarity = TIM_OCPolarity_High;\r
827 }\r
828 \r
829 /**\r
830   * @brief  Selects the TIM Output Compare Mode.\r
831   * @note   This function disables the selected channel before changing the Output\r
832   *         Compare Mode.\r
833   *         User has to enable this channel using TIM_CCxCmd and TIM_CCxNCmd functions.\r
834   * @param  TIMx: where x can be 2, 3, 4, 9, 10 or 11 to select the TIM peripheral.\r
835   * @param  TIM_Channel: specifies the TIM Channel\r
836   *   This parameter can be one of the following values:\r
837   *     @arg TIM_Channel_1: TIM Channel 1\r
838   *     @arg TIM_Channel_2: TIM Channel 2\r
839   *     @arg TIM_Channel_3: TIM Channel 3\r
840   *     @arg TIM_Channel_4: TIM Channel 4\r
841   * @param  TIM_OCMode: specifies the TIM Output Compare Mode.\r
842   *   This parameter can be one of the following values:\r
843   *     @arg TIM_OCMode_Timing\r
844   *     @arg TIM_OCMode_Active\r
845   *     @arg TIM_OCMode_Toggle\r
846   *     @arg TIM_OCMode_PWM1\r
847   *     @arg TIM_OCMode_PWM2\r
848   *     @arg TIM_ForcedAction_Active\r
849   *     @arg TIM_ForcedAction_InActive\r
850   * @retval None\r
851   */\r
852 void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode)\r
853 {\r
854   uint32_t tmp = 0;\r
855   uint16_t tmp1 = 0;\r
856 \r
857   /* Check the parameters */\r
858   assert_param(IS_TIM_LIST1_PERIPH(TIMx));  \r
859   assert_param(IS_TIM_OCM(TIM_OCMode));\r
860   \r
861   tmp = (uint32_t) TIMx;\r
862   tmp += CCMR_OFFSET;\r
863 \r
864   tmp1 = CCER_CCE_SET << (uint16_t)TIM_Channel;\r
865 \r
866   /* Disable the Channel: Reset the CCxE Bit */\r
867   TIMx->CCER &= (uint16_t) ~tmp1;\r
868 \r
869   if((TIM_Channel == TIM_Channel_1) ||(TIM_Channel == TIM_Channel_3))\r
870   {\r
871     tmp += (TIM_Channel>>1);\r
872 \r
873     /* Reset the OCxM bits in the CCMRx register */\r
874     *(__IO uint32_t *) tmp &= (uint32_t)~((uint32_t)TIM_CCMR1_OC1M);\r
875    \r
876     /* Configure the OCxM bits in the CCMRx register */\r
877     *(__IO uint32_t *) tmp |= TIM_OCMode;\r
878   }\r
879   else\r
880   {\r
881     tmp += (uint16_t)(TIM_Channel - (uint16_t)4)>> (uint16_t)1;\r
882 \r
883     /* Reset the OCxM bits in the CCMRx register */\r
884     *(__IO uint32_t *) tmp &= (uint32_t)~((uint32_t)TIM_CCMR1_OC2M);\r
885     \r
886     /* Configure the OCxM bits in the CCMRx register */\r
887     *(__IO uint32_t *) tmp |= (uint16_t)(TIM_OCMode << 8);\r
888   }\r
889 }\r
890 \r
891 /**\r
892   * @brief  Sets the TIMx Capture Compare1 Register value\r
893   * @param  TIMx: where x can be 2, 3, 4, 9, 10 or 11 to select the TIM peripheral.\r
894   * @param  Compare1: specifies the Capture Compare1 register new value.\r
895   * @retval None\r
896 \r
897   */\r
898 void TIM_SetCompare1(TIM_TypeDef* TIMx, uint32_t Compare1)\r
899 {\r
900   /* Check the parameters */\r
901   assert_param(IS_TIM_LIST1_PERIPH(TIMx));\r
902   \r
903   /* Set the Capture Compare1 Register value */\r
904   TIMx->CCR1 = Compare1;\r
905 }\r
906 \r
907 /**\r
908   * @brief  Sets the TIMx Capture Compare2 Register value\r
909   * @param  TIMx: where x can be 2, 3, 4 or 9 to select the TIM peripheral.\r
910   * @param  Compare2: specifies the Capture Compare2 register new value.\r
911   * @retval None\r
912 \r
913   */\r
914 void TIM_SetCompare2(TIM_TypeDef* TIMx, uint32_t Compare2)\r
915 {\r
916   /* Check the parameters */\r
917   assert_param(IS_TIM_LIST2_PERIPH(TIMx));\r
918   \r
919   /* Set the Capture Compare2 Register value */\r
920   TIMx->CCR2 = Compare2;\r
921 }\r
922 \r
923 /**\r
924   * @brief  Sets the TIMx Capture Compare3 Register value\r
925   * @param  TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.\r
926   * @param  Compare3: specifies the Capture Compare3 register new value.\r
927   * @retval None\r
928 \r
929   */\r
930 void TIM_SetCompare3(TIM_TypeDef* TIMx, uint32_t Compare3)\r
931 {\r
932   /* Check the parameters */\r
933   assert_param(IS_TIM_LIST3_PERIPH(TIMx));\r
934   \r
935   /* Set the Capture Compare3 Register value */\r
936   TIMx->CCR3 = Compare3;\r
937 }\r
938 \r
939 /**\r
940   * @brief  Sets the TIMx Capture Compare4 Register value\r
941   * @param  TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.\r
942   * @param  Compare4: specifies the Capture Compare4 register new value.\r
943   * @retval None\r
944 \r
945   */\r
946 void TIM_SetCompare4(TIM_TypeDef* TIMx, uint32_t Compare4)\r
947 {\r
948   /* Check the parameters */\r
949   assert_param(IS_TIM_LIST3_PERIPH(TIMx));\r
950   \r
951   /* Set the Capture Compare4 Register value */\r
952   TIMx->CCR4 = Compare4;\r
953 }\r
954 \r
955 /**\r
956   * @brief  Forces the TIMx output 1 waveform to active or inactive level.\r
957   * @param  TIMx: where x can be 2, 3, 4, 9, 10 or 11 to select the TIM peripheral.\r
958   * @param  TIM_ForcedAction: specifies the forced Action to be set to the output waveform.\r
959   *   This parameter can be one of the following values:\r
960   *     @arg TIM_ForcedAction_Active: Force active level on OC1REF\r
961   *     @arg TIM_ForcedAction_InActive: Force inactive level on OC1REF.\r
962   * @retval None\r
963   */\r
964 void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction)\r
965 {\r
966   uint16_t tmpccmr1 = 0;\r
967   /* Check the parameters */\r
968   assert_param(IS_TIM_LIST1_PERIPH(TIMx));\r
969   assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction));\r
970   tmpccmr1 = TIMx->CCMR1;\r
971   /* Reset the OC1M Bits */\r
972   tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC1M);\r
973   /* Configure The Forced output Mode */\r
974   tmpccmr1 |= TIM_ForcedAction;\r
975   /* Write to TIMx CCMR1 register */\r
976   TIMx->CCMR1 = tmpccmr1;\r
977 }\r
978  \r
979 /**\r
980   * @brief  Forces the TIMx output 2 waveform to active or inactive level.\r
981   * @param  TIMx: where x can be 2, 3, 4 or 9 to select the TIM \r
982   *   peripheral.\r
983   * @param  TIM_ForcedAction: specifies the forced Action to be set to the output waveform.\r
984   *   This parameter can be one of the following values:\r
985   *     @arg TIM_ForcedAction_Active: Force active level on OC2REF\r
986   *     @arg TIM_ForcedAction_InActive: Force inactive level on OC2REF.\r
987   * @retval None\r
988   */\r
989 void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction)\r
990 {\r
991   uint16_t tmpccmr1 = 0;\r
992   \r
993   /* Check the parameters */\r
994   assert_param(IS_TIM_LIST2_PERIPH(TIMx));\r
995   assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction));\r
996   \r
997   tmpccmr1 = TIMx->CCMR1;\r
998   /* Reset the OC2M Bits */\r
999   tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC2M);\r
1000   /* Configure The Forced output Mode */\r
1001   tmpccmr1 |= (uint16_t)(TIM_ForcedAction << 8);\r
1002   /* Write to TIMx CCMR1 register */\r
1003   TIMx->CCMR1 = tmpccmr1;\r
1004 }\r
1005 \r
1006 /**\r
1007   * @brief  Forces the TIMx output 3 waveform to active or inactive level.\r
1008   * @param  TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.\r
1009   * @param  TIM_ForcedAction: specifies the forced Action to be set to the output waveform.\r
1010   *   This parameter can be one of the following values:\r
1011   *     @arg TIM_ForcedAction_Active: Force active level on OC3REF\r
1012   *     @arg TIM_ForcedAction_InActive: Force inactive level on OC3REF.\r
1013   * @retval None\r
1014   */\r
1015 void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction)\r
1016 {\r
1017   uint16_t tmpccmr2 = 0;\r
1018   \r
1019   /* Check the parameters */\r
1020   assert_param(IS_TIM_LIST3_PERIPH(TIMx));\r
1021   assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction));\r
1022   \r
1023   tmpccmr2 = TIMx->CCMR2;\r
1024   /* Reset the OC1M Bits */\r
1025   tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC3M);\r
1026   /* Configure The Forced output Mode */\r
1027   tmpccmr2 |= TIM_ForcedAction;\r
1028   /* Write to TIMx CCMR2 register */\r
1029   TIMx->CCMR2 = tmpccmr2;\r
1030 }\r
1031 \r
1032 /**\r
1033   * @brief  Forces the TIMx output 4 waveform to active or inactive level.\r
1034   * @param  TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.\r
1035   * @param  TIM_ForcedAction: specifies the forced Action to be set to the output waveform.\r
1036   *   This parameter can be one of the following values:\r
1037   *     @arg TIM_ForcedAction_Active: Force active level on OC4REF\r
1038   *     @arg TIM_ForcedAction_InActive: Force inactive level on OC4REF.\r
1039   * @retval None\r
1040   */\r
1041 void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction)\r
1042 {\r
1043   uint16_t tmpccmr2 = 0;\r
1044   /* Check the parameters */\r
1045   assert_param(IS_TIM_LIST3_PERIPH(TIMx));\r
1046   assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction));\r
1047   \r
1048   tmpccmr2 = TIMx->CCMR2;\r
1049   /* Reset the OC2M Bits */\r
1050   tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC4M);\r
1051   /* Configure The Forced output Mode */\r
1052   tmpccmr2 |= (uint16_t)(TIM_ForcedAction << 8);\r
1053   /* Write to TIMx CCMR2 register */\r
1054   TIMx->CCMR2 = tmpccmr2;\r
1055 }\r
1056 \r
1057 /**\r
1058   * @brief  Enables or disables the TIMx peripheral Preload register on CCR1.\r
1059   * @param  TIMx: where x can be 2, 3, 4, 9, 10 or 11 to select the TIM peripheral.\r
1060   * @param  TIM_OCPreload: new state of the TIMx peripheral Preload register\r
1061   *   This parameter can be one of the following values:\r
1062   *     @arg TIM_OCPreload_Enable\r
1063   *     @arg TIM_OCPreload_Disable\r
1064   * @retval None\r
1065   */\r
1066 void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload)\r
1067 {\r
1068   uint16_t tmpccmr1 = 0;\r
1069   /* Check the parameters */\r
1070   assert_param(IS_TIM_LIST1_PERIPH(TIMx));\r
1071   assert_param(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload));\r
1072   \r
1073   tmpccmr1 = TIMx->CCMR1;\r
1074   /* Reset the OC1PE Bit */\r
1075   tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC1PE);\r
1076   /* Enable or Disable the Output Compare Preload feature */\r
1077   tmpccmr1 |= TIM_OCPreload;\r
1078   /* Write to TIMx CCMR1 register */\r
1079   TIMx->CCMR1 = tmpccmr1;\r
1080 }\r
1081 \r
1082 /**\r
1083   * @brief  Enables or disables the TIMx peripheral Preload register on CCR2.\r
1084   * @param  TIMx: where x can be 2, 3, 4 or 9 to select the TIM peripheral.\r
1085   * @param  TIM_OCPreload: new state of the TIMx peripheral Preload register\r
1086   *   This parameter can be one of the following values:\r
1087   *     @arg TIM_OCPreload_Enable\r
1088   *     @arg TIM_OCPreload_Disable\r
1089   * @retval None\r
1090   */\r
1091 void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload)\r
1092 {\r
1093   uint16_t tmpccmr1 = 0;\r
1094   /* Check the parameters */\r
1095   assert_param(IS_TIM_LIST2_PERIPH(TIMx));\r
1096   assert_param(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload));\r
1097   \r
1098   tmpccmr1 = TIMx->CCMR1;\r
1099   /* Reset the OC2PE Bit */\r
1100   tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC2PE);\r
1101   /* Enable or Disable the Output Compare Preload feature */\r
1102   tmpccmr1 |= (uint16_t)(TIM_OCPreload << 8);\r
1103   /* Write to TIMx CCMR1 register */\r
1104   TIMx->CCMR1 = tmpccmr1;\r
1105 }\r
1106 \r
1107 /**\r
1108   * @brief  Enables or disables the TIMx peripheral Preload register on CCR3.\r
1109   * @param  TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.\r
1110   * @param  TIM_OCPreload: new state of the TIMx peripheral Preload register\r
1111   *   This parameter can be one of the following values:\r
1112   *     @arg TIM_OCPreload_Enable\r
1113   *     @arg TIM_OCPreload_Disable\r
1114   * @retval None\r
1115   */\r
1116 void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload)\r
1117 {\r
1118   uint16_t tmpccmr2 = 0;\r
1119   \r
1120   /* Check the parameters */\r
1121   assert_param(IS_TIM_LIST3_PERIPH(TIMx));\r
1122   assert_param(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload));\r
1123   \r
1124   tmpccmr2 = TIMx->CCMR2;\r
1125   /* Reset the OC3PE Bit */\r
1126   tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC3PE);\r
1127   /* Enable or Disable the Output Compare Preload feature */\r
1128   tmpccmr2 |= TIM_OCPreload;\r
1129   /* Write to TIMx CCMR2 register */\r
1130   TIMx->CCMR2 = tmpccmr2;\r
1131 }\r
1132 \r
1133 /**\r
1134   * @brief  Enables or disables the TIMx peripheral Preload register on CCR4.\r
1135   * @param  TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.\r
1136   * @param  TIM_OCPreload: new state of the TIMx peripheral Preload register\r
1137   *   This parameter can be one of the following values:\r
1138   *     @arg TIM_OCPreload_Enable\r
1139   *     @arg TIM_OCPreload_Disable\r
1140   * @retval None\r
1141   */\r
1142 void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload)\r
1143 {\r
1144   uint16_t tmpccmr2 = 0;\r
1145   \r
1146   /* Check the parameters */\r
1147   assert_param(IS_TIM_LIST3_PERIPH(TIMx));\r
1148   assert_param(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload));\r
1149   \r
1150   tmpccmr2 = TIMx->CCMR2;\r
1151   /* Reset the OC4PE Bit */\r
1152   tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC4PE);\r
1153   /* Enable or Disable the Output Compare Preload feature */\r
1154   tmpccmr2 |= (uint16_t)(TIM_OCPreload << 8);\r
1155   /* Write to TIMx CCMR2 register */\r
1156   TIMx->CCMR2 = tmpccmr2;\r
1157 }\r
1158 \r
1159 /**\r
1160   * @brief  Configures the TIMx Output Compare 1 Fast feature.\r
1161   * @param  TIMx: where x can be 2, 3, 4, 9, 10 or 11 to select the TIM peripheral.\r
1162   * @param  TIM_OCFast: new state of the Output Compare Fast Enable Bit.\r
1163   *   This parameter can be one of the following values:\r
1164   *     @arg TIM_OCFast_Enable: TIM output compare fast enable\r
1165   *     @arg TIM_OCFast_Disable: TIM output compare fast disable\r
1166   * @retval None\r
1167   */\r
1168 void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast)\r
1169 {\r
1170   uint16_t tmpccmr1 = 0;\r
1171   \r
1172   /* Check the parameters */\r
1173   assert_param(IS_TIM_LIST1_PERIPH(TIMx));\r
1174   assert_param(IS_TIM_OCFAST_STATE(TIM_OCFast));\r
1175   \r
1176   /* Get the TIMx CCMR1 register value */\r
1177   tmpccmr1 = TIMx->CCMR1;\r
1178   /* Reset the OC1FE Bit */\r
1179   tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC1FE);\r
1180   /* Enable or Disable the Output Compare Fast Bit */\r
1181   tmpccmr1 |= TIM_OCFast;\r
1182   /* Write to TIMx CCMR1 */\r
1183   TIMx->CCMR1 = tmpccmr1;\r
1184 }\r
1185 \r
1186 /**\r
1187   * @brief  Configures the TIMx Output Compare 2 Fast feature.\r
1188   * @param  TIMx: where x can be 2, 3, 4 or 9 to select the TIM peripheral.\r
1189   * @param  TIM_OCFast: new state of the Output Compare Fast Enable Bit.\r
1190   *   This parameter can be one of the following values:\r
1191   *     @arg TIM_OCFast_Enable: TIM output compare fast enable\r
1192   *     @arg TIM_OCFast_Disable: TIM output compare fast disable\r
1193   * @retval None\r
1194   */\r
1195 void TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast)\r
1196 {\r
1197   uint16_t tmpccmr1 = 0;\r
1198   \r
1199   /* Check the parameters */\r
1200   assert_param(IS_TIM_LIST2_PERIPH(TIMx));\r
1201   assert_param(IS_TIM_OCFAST_STATE(TIM_OCFast));\r
1202   \r
1203   /* Get the TIMx CCMR1 register value */\r
1204   tmpccmr1 = TIMx->CCMR1;\r
1205   /* Reset the OC2FE Bit */\r
1206   tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC2FE);\r
1207   /* Enable or Disable the Output Compare Fast Bit */\r
1208   tmpccmr1 |= (uint16_t)(TIM_OCFast << 8);\r
1209   /* Write to TIMx CCMR1 */\r
1210   TIMx->CCMR1 = tmpccmr1;\r
1211 }\r
1212 \r
1213 /**\r
1214   * @brief  Configures the TIMx Output Compare 3 Fast feature.\r
1215   * @param  TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.\r
1216   * @param  TIM_OCFast: new state of the Output Compare Fast Enable Bit.\r
1217   *   This parameter can be one of the following values:\r
1218   *     @arg TIM_OCFast_Enable: TIM output compare fast enable\r
1219   *     @arg TIM_OCFast_Disable: TIM output compare fast disable\r
1220   * @retval None\r
1221   */\r
1222 void TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast)\r
1223 {\r
1224   uint16_t tmpccmr2 = 0;\r
1225   \r
1226   /* Check the parameters */\r
1227   assert_param(IS_TIM_LIST3_PERIPH(TIMx));\r
1228   assert_param(IS_TIM_OCFAST_STATE(TIM_OCFast));\r
1229   \r
1230   /* Get the TIMx CCMR2 register value */\r
1231   tmpccmr2 = TIMx->CCMR2;\r
1232   /* Reset the OC3FE Bit */\r
1233   tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC3FE);\r
1234   /* Enable or Disable the Output Compare Fast Bit */\r
1235   tmpccmr2 |= TIM_OCFast;\r
1236   /* Write to TIMx CCMR2 */\r
1237   TIMx->CCMR2 = tmpccmr2;\r
1238 }\r
1239 \r
1240 /**\r
1241   * @brief  Configures the TIMx Output Compare 4 Fast feature.\r
1242   * @param  TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.\r
1243   * @param  TIM_OCFast: new state of the Output Compare Fast Enable Bit.\r
1244   *   This parameter can be one of the following values:\r
1245   *     @arg TIM_OCFast_Enable: TIM output compare fast enable\r
1246   *     @arg TIM_OCFast_Disable: TIM output compare fast disable\r
1247   * @retval None\r
1248   */\r
1249 void TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast)\r
1250 {\r
1251   uint16_t tmpccmr2 = 0;\r
1252   \r
1253   /* Check the parameters */\r
1254   assert_param(IS_TIM_LIST3_PERIPH(TIMx));\r
1255   assert_param(IS_TIM_OCFAST_STATE(TIM_OCFast));\r
1256   \r
1257   /* Get the TIMx CCMR2 register value */\r
1258   tmpccmr2 = TIMx->CCMR2;\r
1259   /* Reset the OC4FE Bit */\r
1260   tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC4FE);\r
1261   /* Enable or Disable the Output Compare Fast Bit */\r
1262   tmpccmr2 |= (uint16_t)(TIM_OCFast << 8);\r
1263   /* Write to TIMx CCMR2 */\r
1264   TIMx->CCMR2 = tmpccmr2;\r
1265 }\r
1266 \r
1267 /**\r
1268   * @brief  Clears or safeguards the OCREF1 signal on an external event\r
1269   * @param  TIMx: where x can be 2, 3, 4, 9, 10 or 11 to select the TIM peripheral.\r
1270   * @param  TIM_OCClear: new state of the Output Compare Clear Enable Bit.\r
1271   *   This parameter can be one of the following values:\r
1272   *     @arg TIM_OCClear_Enable: TIM Output clear enable\r
1273   *     @arg TIM_OCClear_Disable: TIM Output clear disable\r
1274   * @retval None\r
1275   */\r
1276 void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear)\r
1277 {\r
1278   uint16_t tmpccmr1 = 0;\r
1279   \r
1280   /* Check the parameters */\r
1281   assert_param(IS_TIM_LIST1_PERIPH(TIMx));\r
1282   assert_param(IS_TIM_OCCLEAR_STATE(TIM_OCClear));\r
1283   \r
1284   tmpccmr1 = TIMx->CCMR1;\r
1285   /* Reset the OC1CE Bit */\r
1286   tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC1CE);\r
1287   /* Enable or Disable the Output Compare Clear Bit */\r
1288   tmpccmr1 |= TIM_OCClear;\r
1289   /* Write to TIMx CCMR1 register */\r
1290   TIMx->CCMR1 = tmpccmr1;\r
1291 }\r
1292 \r
1293 /**\r
1294   * @brief  Clears or safeguards the OCREF2 signal on an external event\r
1295   * @param  TIMx: where x can be 2, 3, 4 or 9 to select the TIM peripheral.\r
1296   * @param  TIM_OCClear: new state of the Output Compare Clear Enable Bit.\r
1297 \r
1298   *   This parameter can be one of the following values:\r
1299   *     @arg TIM_OCClear_Enable: TIM Output clear enable\r
1300   *     @arg TIM_OCClear_Disable: TIM Output clear disable\r
1301   * @retval None\r
1302   */\r
1303 void TIM_ClearOC2Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear)\r
1304 {\r
1305   uint16_t tmpccmr1 = 0;\r
1306   \r
1307   /* Check the parameters */\r
1308   assert_param(IS_TIM_LIST2_PERIPH(TIMx));\r
1309   assert_param(IS_TIM_OCCLEAR_STATE(TIM_OCClear));\r
1310   \r
1311   tmpccmr1 = TIMx->CCMR1;\r
1312   /* Reset the OC2CE Bit */\r
1313   tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC2CE);\r
1314   /* Enable or Disable the Output Compare Clear Bit */\r
1315   tmpccmr1 |= (uint16_t)(TIM_OCClear << 8);\r
1316   /* Write to TIMx CCMR1 register */\r
1317   TIMx->CCMR1 = tmpccmr1;\r
1318 }\r
1319 \r
1320 /**\r
1321   * @brief  Clears or safeguards the OCREF3 signal on an external event\r
1322   * @param  TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.\r
1323   * @param  TIM_OCClear: new state of the Output Compare Clear Enable Bit.\r
1324   *   This parameter can be one of the following values:\r
1325   *     @arg TIM_OCClear_Enable: TIM Output clear enable\r
1326   *     @arg TIM_OCClear_Disable: TIM Output clear disable\r
1327   * @retval None\r
1328   */\r
1329 void TIM_ClearOC3Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear)\r
1330 {\r
1331   uint16_t tmpccmr2 = 0;\r
1332   \r
1333   /* Check the parameters */\r
1334   assert_param(IS_TIM_LIST3_PERIPH(TIMx));\r
1335   assert_param(IS_TIM_OCCLEAR_STATE(TIM_OCClear));\r
1336   \r
1337   tmpccmr2 = TIMx->CCMR2;\r
1338   /* Reset the OC3CE Bit */\r
1339   tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC3CE);\r
1340   /* Enable or Disable the Output Compare Clear Bit */\r
1341   tmpccmr2 |= TIM_OCClear;\r
1342   /* Write to TIMx CCMR2 register */\r
1343   TIMx->CCMR2 = tmpccmr2;\r
1344 }\r
1345 \r
1346 /**\r
1347   * @brief  Clears or safeguards the OCREF4 signal on an external event\r
1348   * @param  TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.\r
1349   * @param  TIM_OCClear: new state of the Output Compare Clear Enable Bit.\r
1350   *   This parameter can be one of the following values:\r
1351   *     @arg TIM_OCClear_Enable: TIM Output clear enable\r
1352   *     @arg TIM_OCClear_Disable: TIM Output clear disable\r
1353   * @retval None\r
1354   */\r
1355 void TIM_ClearOC4Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear)\r
1356 {\r
1357   uint16_t tmpccmr2 = 0;\r
1358   \r
1359   /* Check the parameters */\r
1360   assert_param(IS_TIM_LIST3_PERIPH(TIMx));\r
1361   assert_param(IS_TIM_OCCLEAR_STATE(TIM_OCClear));\r
1362   \r
1363   tmpccmr2 = TIMx->CCMR2;\r
1364   /* Reset the OC4CE Bit */\r
1365   tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC4CE);\r
1366   /* Enable or Disable the Output Compare Clear Bit */\r
1367   tmpccmr2 |= (uint16_t)(TIM_OCClear << 8);\r
1368   /* Write to TIMx CCMR2 register */\r
1369   TIMx->CCMR2 = tmpccmr2;\r
1370 }\r
1371 \r
1372 /**\r
1373   * @brief  Configures the TIMx channel 1 polarity.\r
1374   * @param  TIMx: where x can be 2, 3, 4, 9, 10 or 11 to select the TIM peripheral.\r
1375   * @param  TIM_OCPolarity: specifies the OC1 Polarity\r
1376   *   This parmeter can be one of the following values:\r
1377   *     @arg TIM_OCPolarity_High: Output Compare active high\r
1378   *     @arg TIM_OCPolarity_Low: Output Compare active low\r
1379   * @retval None\r
1380   */\r
1381 void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity)\r
1382 {\r
1383   uint16_t tmpccer = 0;\r
1384   \r
1385   /* Check the parameters */\r
1386   assert_param(IS_TIM_LIST1_PERIPH(TIMx));\r
1387   assert_param(IS_TIM_OC_POLARITY(TIM_OCPolarity));\r
1388   \r
1389   tmpccer = TIMx->CCER;\r
1390   /* Set or Reset the CC1P Bit */\r
1391   tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC1P);\r
1392   tmpccer |= TIM_OCPolarity;\r
1393   /* Write to TIMx CCER register */\r
1394   TIMx->CCER = tmpccer;\r
1395 }\r
1396 \r
1397 /**\r
1398   * @brief  Configures the TIMx channel 2 polarity.\r
1399   * @param  TIMx: where x can be 2, 3, 4 or 9 to select the TIM peripheral.\r
1400   * @param  TIM_OCPolarity: specifies the OC2 Polarity\r
1401   *   This parmeter can be one of the following values:\r
1402   *     @arg TIM_OCPolarity_High: Output Compare active high\r
1403   *     @arg TIM_OCPolarity_Low: Output Compare active low\r
1404   * @retval None\r
1405   */\r
1406 void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity)\r
1407 {\r
1408   uint16_t tmpccer = 0;\r
1409   \r
1410   /* Check the parameters */\r
1411   assert_param(IS_TIM_LIST2_PERIPH(TIMx));\r
1412   assert_param(IS_TIM_OC_POLARITY(TIM_OCPolarity));\r
1413   \r
1414   tmpccer = TIMx->CCER;\r
1415   /* Set or Reset the CC2P Bit */\r
1416   tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC2P);\r
1417   tmpccer |= (uint16_t)(TIM_OCPolarity << 4);\r
1418   /* Write to TIMx CCER register */\r
1419   TIMx->CCER = tmpccer;\r
1420 }\r
1421 \r
1422 /**\r
1423   * @brief  Configures the TIMx channel 3 polarity.\r
1424   * @param  TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.\r
1425   * @param  TIM_OCPolarity: specifies the OC3 Polarity\r
1426   *   This parmeter can be one of the following values:\r
1427   *     @arg TIM_OCPolarity_High: Output Compare active high\r
1428   *     @arg TIM_OCPolarity_Low: Output Compare active low\r
1429   * @retval None\r
1430   */\r
1431 void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity)\r
1432 {\r
1433   uint16_t tmpccer = 0;\r
1434   \r
1435   /* Check the parameters */\r
1436   assert_param(IS_TIM_LIST3_PERIPH(TIMx));\r
1437   assert_param(IS_TIM_OC_POLARITY(TIM_OCPolarity));\r
1438   \r
1439   tmpccer = TIMx->CCER;\r
1440   /* Set or Reset the CC3P Bit */\r
1441   tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC3P);\r
1442   tmpccer |= (uint16_t)(TIM_OCPolarity << 8);\r
1443   /* Write to TIMx CCER register */\r
1444   TIMx->CCER = tmpccer;\r
1445 }\r
1446 \r
1447 /**\r
1448   * @brief  Configures the TIMx channel 4 polarity.\r
1449   * @param  TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.\r
1450   * @param  TIM_OCPolarity: specifies the OC4 Polarity\r
1451   *   This parmeter can be one of the following values:\r
1452   *     @arg TIM_OCPolarity_High: Output Compare active high\r
1453   *     @arg TIM_OCPolarity_Low: Output Compare active low\r
1454   * @retval None\r
1455   */\r
1456 void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity)\r
1457 {\r
1458   uint16_t tmpccer = 0;\r
1459   \r
1460   /* Check the parameters */\r
1461   assert_param(IS_TIM_LIST3_PERIPH(TIMx));\r
1462   assert_param(IS_TIM_OC_POLARITY(TIM_OCPolarity));\r
1463   \r
1464   tmpccer = TIMx->CCER;\r
1465   /* Set or Reset the CC4P Bit */\r
1466   tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC4P);\r
1467   tmpccer |= (uint16_t)(TIM_OCPolarity << 12);\r
1468   /* Write to TIMx CCER register */\r
1469   TIMx->CCER = tmpccer;\r
1470 }\r
1471 \r
1472 /**\r
1473   * @brief  Selects the OCReference Clear source.\r
1474   * @param  TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.\r
1475   * @param  TIM_OCReferenceClear: specifies the OCReference Clear source.\r
1476   *   This parameter can be one of the following values:\r
1477   *     @arg TIM_OCReferenceClear_ETRF: The internal OCreference clear input is connected to ETRF.\r
1478   *     @arg TIM_OCReferenceClear_OCREFCLR: The internal OCreference clear input is connected to OCREF_CLR input.  \r
1479   * @retval None\r
1480   */\r
1481 void TIM_SelectOCREFClear(TIM_TypeDef* TIMx, uint16_t TIM_OCReferenceClear)\r
1482 {\r
1483   /* Check the parameters */\r
1484   assert_param(IS_TIM_LIST3_PERIPH(TIMx));\r
1485   assert_param(TIM_OCREFERENCECECLEAR_SOURCE(TIM_OCReferenceClear));\r
1486 \r
1487   /* Set the TIM_OCReferenceClear source */\r
1488   TIMx->SMCR &=  (uint16_t)~((uint16_t)TIM_SMCR_OCCS);\r
1489   TIMx->SMCR |=  TIM_OCReferenceClear;\r
1490 }\r
1491 \r
1492 /**\r
1493   * @brief  Enables or disables the TIM Capture Compare Channel x.\r
1494   * @param  TIMx: where x can be 2, 3, 4, 9, 10 or 11 to select the TIM peripheral.\r
1495   * @param  TIM_Channel: specifies the TIM Channel\r
1496   *   This parameter can be one of the following values:\r
1497   *     @arg TIM_Channel_1: TIM Channel 1\r
1498   *     @arg TIM_Channel_2: TIM Channel 2\r
1499   *     @arg TIM_Channel_3: TIM Channel 3\r
1500   *     @arg TIM_Channel_4: TIM Channel 4\r
1501   * @param  TIM_CCx: specifies the TIM Channel CCxE bit new state.\r
1502   *   This parameter can be: TIM_CCx_Enable or TIM_CCx_Disable. \r
1503   * @retval None\r
1504   */\r
1505 void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx)\r
1506 {\r
1507   uint16_t tmp = 0;\r
1508 \r
1509   /* Check the parameters */\r
1510   assert_param(IS_TIM_LIST1_PERIPH(TIMx)); \r
1511   assert_param(IS_TIM_CCX(TIM_CCx));\r
1512 \r
1513   tmp = CCER_CCE_SET << TIM_Channel;\r
1514 \r
1515   /* Reset the CCxE Bit */\r
1516   TIMx->CCER &= (uint16_t)~ tmp;\r
1517 \r
1518   /* Set or reset the CCxE Bit */ \r
1519   TIMx->CCER |=  (uint16_t)(TIM_CCx << TIM_Channel);\r
1520 }\r
1521 \r
1522 /**\r
1523   * @}\r
1524   */\r
1525 \r
1526 /** @defgroup TIM_Group3 Input Capture management functions\r
1527  *  @brief    Input Capture management functions \r
1528  *\r
1529 @verbatim   \r
1530  ===============================================================================\r
1531                       Input Capture management functions\r
1532  ===============================================================================  \r
1533    \r
1534        ===================================================================      \r
1535               TIM Driver: how to use it in Input Capture Mode\r
1536        =================================================================== \r
1537        To use the Timer in Input Capture mode, the following steps are mandatory:\r
1538        \r
1539        1. Enable TIM clock using RCC_APBxPeriphClockCmd(RCC_APBxPeriph_TIMx, ENABLE) function\r
1540        \r
1541        2. Configure the TIM pins by configuring the corresponding GPIO pins\r
1542        \r
1543        2. Configure the Time base unit as described in the first part of this driver, if needed,\r
1544           else the Timer will run with the default configuration:\r
1545           - Autoreload value = 0xFFFF\r
1546           - Prescaler value = 0x0000\r
1547           - Counter mode = Up counting\r
1548           - Clock Division = TIM_CKD_DIV1\r
1549           \r
1550        3. Fill the TIM_ICInitStruct with the desired parameters including:\r
1551           - TIM Channel: TIM_Channel\r
1552           - TIM Input Capture polarity: TIM_ICPolarity\r
1553           - TIM Input Capture selection: TIM_ICSelection\r
1554           - TIM Input Capture Prescaler: TIM_ICPrescaler\r
1555           - TIM Input CApture filter value: TIM_ICFilter\r
1556        \r
1557        4. Call TIM_ICInit(TIMx, &TIM_ICInitStruct) to configure the desired channel with the \r
1558           corresponding configuration and to measure only frequency or duty cycle of the input signal,\r
1559           or,\r
1560           Call TIM_PWMIConfig(TIMx, &TIM_ICInitStruct) to configure the desired channels with the \r
1561           corresponding configuration and to measure the frequency and the duty cycle of the input signal\r
1562           \r
1563        5. Enable the NVIC or the DMA to read the measured frequency. \r
1564           \r
1565        6. Enable the corresponding interrupt (or DMA request) to read the Captured value,\r
1566           using the function TIM_ITConfig(TIMx, TIM_IT_CCx) (or TIM_DMA_Cmd(TIMx, TIM_DMA_CCx)) \r
1567        \r
1568        7. Call the TIM_Cmd(ENABLE) function to enable the TIM counter.\r
1569        \r
1570        8. Use TIM_GetCapturex(TIMx); to read the captured value.\r
1571        \r
1572        Note1: All other functions can be used seperatly to modify, if needed,\r
1573           a specific feature of the Timer. \r
1574 \r
1575 @endverbatim\r
1576   * @{\r
1577   */\r
1578 \r
1579 /**\r
1580   * @brief  Initializes the TIM peripheral according to the specified\r
1581   *         parameters in the TIM_ICInitStruct.\r
1582   * @param  TIMx: where x can be 2, 3, 4, 9, 10 or 11 to select the TIM peripheral.\r
1583   * @param  TIM_ICInitStruct: pointer to a TIM_ICInitTypeDef structure\r
1584   *         that contains the configuration information for the specified TIM \r
1585   *         peripheral.\r
1586   * @retval None\r
1587   */\r
1588 void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct)\r
1589 {\r
1590   /* Check the parameters */\r
1591   assert_param(IS_TIM_LIST1_PERIPH(TIMx));\r
1592   assert_param(IS_TIM_IC_POLARITY(TIM_ICInitStruct->TIM_ICPolarity));\r
1593   assert_param(IS_TIM_IC_SELECTION(TIM_ICInitStruct->TIM_ICSelection));\r
1594   assert_param(IS_TIM_IC_PRESCALER(TIM_ICInitStruct->TIM_ICPrescaler));\r
1595   assert_param(IS_TIM_IC_FILTER(TIM_ICInitStruct->TIM_ICFilter));\r
1596   \r
1597   if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_1)\r
1598   {\r
1599     /* TI1 Configuration */\r
1600     TI1_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity,\r
1601                TIM_ICInitStruct->TIM_ICSelection,\r
1602                TIM_ICInitStruct->TIM_ICFilter);\r
1603     /* Set the Input Capture Prescaler value */\r
1604     TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);\r
1605   }\r
1606   else if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_2)\r
1607   {\r
1608     /* TI2 Configuration */\r
1609     TI2_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity,\r
1610                TIM_ICInitStruct->TIM_ICSelection,\r
1611                TIM_ICInitStruct->TIM_ICFilter);\r
1612     /* Set the Input Capture Prescaler value */\r
1613     TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);\r
1614   }\r
1615   else if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_3)\r
1616   {\r
1617     /* TI3 Configuration */\r
1618     TI3_Config(TIMx,  TIM_ICInitStruct->TIM_ICPolarity,\r
1619                TIM_ICInitStruct->TIM_ICSelection,\r
1620                TIM_ICInitStruct->TIM_ICFilter);\r
1621     /* Set the Input Capture Prescaler value */\r
1622     TIM_SetIC3Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);\r
1623   }\r
1624   else\r
1625   {\r
1626     /* TI4 Configuration */\r
1627     TI4_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity,\r
1628                TIM_ICInitStruct->TIM_ICSelection,\r
1629                TIM_ICInitStruct->TIM_ICFilter);\r
1630     /* Set the Input Capture Prescaler value */\r
1631     TIM_SetIC4Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);\r
1632   }\r
1633 }\r
1634 \r
1635 /**\r
1636   * @brief  Fills each TIM_ICInitStruct member with its default value.\r
1637   * @param  TIM_ICInitStruct : pointer to a TIM_ICInitTypeDef structure which will\r
1638   *         be initialized.\r
1639   * @retval None\r
1640   */\r
1641 void TIM_ICStructInit(TIM_ICInitTypeDef* TIM_ICInitStruct)\r
1642 {\r
1643   /* Set the default configuration */\r
1644   TIM_ICInitStruct->TIM_Channel = TIM_Channel_1;\r
1645   TIM_ICInitStruct->TIM_ICPolarity = TIM_ICPolarity_Rising;\r
1646   TIM_ICInitStruct->TIM_ICSelection = TIM_ICSelection_DirectTI;\r
1647   TIM_ICInitStruct->TIM_ICPrescaler = TIM_ICPSC_DIV1;\r
1648   TIM_ICInitStruct->TIM_ICFilter = 0x00;\r
1649 }\r
1650 \r
1651 /**\r
1652   * @brief  Configures the TIM peripheral according to the specified\r
1653   *         parameters in the TIM_ICInitStruct to measure an external PWM signal.\r
1654   * @param  TIMx: where x can be 2, 3, 4 or 9 to select the TIM peripheral.\r
1655   * @param  TIM_ICInitStruct: pointer to a TIM_ICInitTypeDef structure\r
1656   *         that contains the configuration information for the specified TIM \r
1657   *         peripheral.\r
1658   * @retval None\r
1659   */\r
1660 void TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct)\r
1661 {\r
1662   uint16_t icoppositepolarity = TIM_ICPolarity_Rising;\r
1663   uint16_t icoppositeselection = TIM_ICSelection_DirectTI;\r
1664   /* Check the parameters */\r
1665   assert_param(IS_TIM_LIST2_PERIPH(TIMx));\r
1666   /* Select the Opposite Input Polarity */\r
1667   if (TIM_ICInitStruct->TIM_ICPolarity == TIM_ICPolarity_Rising)\r
1668   {\r
1669     icoppositepolarity = TIM_ICPolarity_Falling;\r
1670   }\r
1671   else\r
1672   {\r
1673     icoppositepolarity = TIM_ICPolarity_Rising;\r
1674   }\r
1675   /* Select the Opposite Input */\r
1676   if (TIM_ICInitStruct->TIM_ICSelection == TIM_ICSelection_DirectTI)\r
1677   {\r
1678     icoppositeselection = TIM_ICSelection_IndirectTI;\r
1679   }\r
1680   else\r
1681   {\r
1682     icoppositeselection = TIM_ICSelection_DirectTI;\r
1683   }\r
1684   if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_1)\r
1685   {\r
1686     /* TI1 Configuration */\r
1687     TI1_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, TIM_ICInitStruct->TIM_ICSelection,\r
1688                TIM_ICInitStruct->TIM_ICFilter);\r
1689     /* Set the Input Capture Prescaler value */\r
1690     TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);\r
1691     /* TI2 Configuration */\r
1692     TI2_Config(TIMx, icoppositepolarity, icoppositeselection, TIM_ICInitStruct->TIM_ICFilter);\r
1693     /* Set the Input Capture Prescaler value */\r
1694     TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);\r
1695   }\r
1696   else\r
1697   { \r
1698     /* TI2 Configuration */\r
1699     TI2_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, TIM_ICInitStruct->TIM_ICSelection,\r
1700                TIM_ICInitStruct->TIM_ICFilter);\r
1701     /* Set the Input Capture Prescaler value */\r
1702     TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);\r
1703     /* TI1 Configuration */\r
1704     TI1_Config(TIMx, icoppositepolarity, icoppositeselection, TIM_ICInitStruct->TIM_ICFilter);\r
1705     /* Set the Input Capture Prescaler value */\r
1706     TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);\r
1707   }\r
1708 }\r
1709 \r
1710 /**\r
1711   * @brief  Gets the TIMx Input Capture 1 value.\r
1712   * @param  TIMx: where x can be 2, 3, 4, 9, 10 or 11 to select the TIM peripheral.\r
1713   * @retval Capture Compare 1 Register value.\r
1714 \r
1715   */\r
1716 uint32_t TIM_GetCapture1(TIM_TypeDef* TIMx)\r
1717 {\r
1718   /* Check the parameters */\r
1719   assert_param(IS_TIM_LIST1_PERIPH(TIMx));\r
1720   \r
1721   /* Get the Capture 1 Register value */\r
1722   return TIMx->CCR1;\r
1723 }\r
1724 \r
1725 /**\r
1726   * @brief  Gets the TIMx Input Capture 2 value.\r
1727   * @param  TIMx: where x can be 2, 3, 4 or 9 to select the TIM peripheral.\r
1728   * @retval Capture Compare 2 Register value.\r
1729 \r
1730   */\r
1731 uint32_t TIM_GetCapture2(TIM_TypeDef* TIMx)\r
1732 {\r
1733   /* Check the parameters */\r
1734   assert_param(IS_TIM_LIST2_PERIPH(TIMx));\r
1735   \r
1736   /* Get the Capture 2 Register value */\r
1737   return TIMx->CCR2;\r
1738 }\r
1739 \r
1740 /**\r
1741   * @brief  Gets the TIMx Input Capture 3 value.\r
1742   * @param  TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.\r
1743   * @retval Capture Compare 3 Register value.\r
1744   */\r
1745 uint32_t TIM_GetCapture3(TIM_TypeDef* TIMx)\r
1746 {\r
1747   /* Check the parameters */\r
1748   assert_param(IS_TIM_LIST3_PERIPH(TIMx)); \r
1749   \r
1750   /* Get the Capture 3 Register value */\r
1751   return TIMx->CCR3;\r
1752 }\r
1753 \r
1754 /**\r
1755   * @brief  Gets the TIMx Input Capture 4 value.\r
1756   * @param  TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.\r
1757   * @retval Capture Compare 4 Register value.\r
1758   */\r
1759 uint32_t TIM_GetCapture4(TIM_TypeDef* TIMx)\r
1760 {\r
1761   /* Check the parameters */\r
1762   assert_param(IS_TIM_LIST3_PERIPH(TIMx));\r
1763   \r
1764   /* Get the Capture 4 Register value */\r
1765   return TIMx->CCR4;\r
1766 }\r
1767 \r
1768 /**\r
1769   * @brief  Sets the TIMx Input Capture 1 prescaler.\r
1770   * @param  TIMx: where x can be 2, 3, 4, 9, 10 or 11 to select the TIM peripheral.\r
1771   * @param  TIM_ICPSC: specifies the Input Capture1 prescaler new value.\r
1772   *   This parameter can be one of the following values:\r
1773   *     @arg TIM_ICPSC_DIV1: no prescaler\r
1774   *     @arg TIM_ICPSC_DIV2: capture is done once every 2 events\r
1775   *     @arg TIM_ICPSC_DIV4: capture is done once every 4 events\r
1776   *     @arg TIM_ICPSC_DIV8: capture is done once every 8 events\r
1777   * @retval None\r
1778   */\r
1779 void TIM_SetIC1Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC)\r
1780 {\r
1781   /* Check the parameters */\r
1782   assert_param(IS_TIM_LIST1_PERIPH(TIMx));\r
1783   assert_param(IS_TIM_IC_PRESCALER(TIM_ICPSC));\r
1784   \r
1785   /* Reset the IC1PSC Bits */\r
1786   TIMx->CCMR1 &= (uint16_t)~((uint16_t)TIM_CCMR1_IC1PSC);\r
1787   /* Set the IC1PSC value */\r
1788   TIMx->CCMR1 |= TIM_ICPSC;\r
1789 }\r
1790 \r
1791 /**\r
1792   * @brief  Sets the TIMx Input Capture 2 prescaler.\r
1793   * @param  TIMx: where x can be 2, 3, 4 or 9 to select the TIM peripheral.\r
1794   * @param  TIM_ICPSC: specifies the Input Capture2 prescaler new value.\r
1795   *   This parameter can be one of the following values:\r
1796   *     @arg TIM_ICPSC_DIV1: no prescaler\r
1797   *     @arg TIM_ICPSC_DIV2: capture is done once every 2 events\r
1798   *     @arg TIM_ICPSC_DIV4: capture is done once every 4 events\r
1799   *     @arg TIM_ICPSC_DIV8: capture is done once every 8 events\r
1800   * @retval None\r
1801   */\r
1802 void TIM_SetIC2Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC)\r
1803 {\r
1804   /* Check the parameters */\r
1805   assert_param(IS_TIM_LIST2_PERIPH(TIMx));\r
1806   assert_param(IS_TIM_IC_PRESCALER(TIM_ICPSC));\r
1807   \r
1808   /* Reset the IC2PSC Bits */\r
1809   TIMx->CCMR1 &= (uint16_t)~((uint16_t)TIM_CCMR1_IC2PSC);\r
1810   /* Set the IC2PSC value */\r
1811   TIMx->CCMR1 |= (uint16_t)(TIM_ICPSC << 8);\r
1812 }\r
1813 \r
1814 /**\r
1815   * @brief  Sets the TIMx Input Capture 3 prescaler.\r
1816   * @param  TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.\r
1817   * @param  TIM_ICPSC: specifies the Input Capture3 prescaler new value.\r
1818   *   This parameter can be one of the following values:\r
1819   *     @arg TIM_ICPSC_DIV1: no prescaler\r
1820   *     @arg TIM_ICPSC_DIV2: capture is done once every 2 events\r
1821   *     @arg TIM_ICPSC_DIV4: capture is done once every 4 events\r
1822   *     @arg TIM_ICPSC_DIV8: capture is done once every 8 events\r
1823   * @retval None\r
1824   */\r
1825 void TIM_SetIC3Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC)\r
1826 {\r
1827   /* Check the parameters */\r
1828   assert_param(IS_TIM_LIST3_PERIPH(TIMx));\r
1829   assert_param(IS_TIM_IC_PRESCALER(TIM_ICPSC));\r
1830   \r
1831   /* Reset the IC3PSC Bits */\r
1832   TIMx->CCMR2 &= (uint16_t)~((uint16_t)TIM_CCMR2_IC3PSC);\r
1833   /* Set the IC3PSC value */\r
1834   TIMx->CCMR2 |= TIM_ICPSC;\r
1835 }\r
1836 \r
1837 /**\r
1838   * @brief  Sets the TIMx Input Capture 4 prescaler.\r
1839   * @param  TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.\r
1840   * @param  TIM_ICPSC: specifies the Input Capture4 prescaler new value.\r
1841   *   This parameter can be one of the following values:\r
1842   *     @arg TIM_ICPSC_DIV1: no prescaler\r
1843   *     @arg TIM_ICPSC_DIV2: capture is done once every 2 events\r
1844   *     @arg TIM_ICPSC_DIV4: capture is done once every 4 events\r
1845   *     @arg TIM_ICPSC_DIV8: capture is done once every 8 events\r
1846   * @retval None\r
1847   */\r
1848 void TIM_SetIC4Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC)\r
1849 {  \r
1850   /* Check the parameters */\r
1851   assert_param(IS_TIM_LIST3_PERIPH(TIMx));\r
1852   assert_param(IS_TIM_IC_PRESCALER(TIM_ICPSC));\r
1853   \r
1854   /* Reset the IC4PSC Bits */\r
1855   TIMx->CCMR2 &= (uint16_t)~((uint16_t)TIM_CCMR2_IC4PSC);\r
1856   /* Set the IC4PSC value */\r
1857   TIMx->CCMR2 |= (uint16_t)(TIM_ICPSC << 8);\r
1858 }\r
1859 \r
1860 /**\r
1861   * @}\r
1862   */\r
1863 \r
1864 /** @defgroup TIM_Group4 Interrupts DMA and flags management functions\r
1865  *  @brief    Interrupts, DMA and flags management functions \r
1866  *\r
1867 @verbatim   \r
1868  ===============================================================================\r
1869                  Interrupts, DMA and flags management functions\r
1870  ===============================================================================  \r
1871 \r
1872 @endverbatim\r
1873   * @{\r
1874   */\r
1875 \r
1876 /**\r
1877   * @brief  Enables or disables the specified TIM interrupts.\r
1878   * @param  TIMx: where x can be 2 to 11 to select the TIMx peripheral.\r
1879   * @param  TIM_IT: specifies the TIM interrupts sources to be enabled or disabled.\r
1880   *   This parameter can be any combination of the following values:\r
1881   *     @arg TIM_IT_Update: TIM update Interrupt source\r
1882   *     @arg TIM_IT_CC1: TIM Capture Compare 1 Interrupt source\r
1883   *     @arg TIM_IT_CC2: TIM Capture Compare 2 Interrupt source\r
1884   *     @arg TIM_IT_CC3: TIM Capture Compare 3 Interrupt source\r
1885   *     @arg TIM_IT_CC4: TIM Capture Compare 4 Interrupt source\r
1886   *     @arg TIM_IT_Trigger: TIM Trigger Interrupt source\r
1887   * @note \r
1888   *   - TIM6 and TIM7 can only generate an update interrupt.  \r
1889   *   - TIM_IT_CC2, TIM_IT_CC3, TIM_IT_CC4 and TIM_IT_Trigger can not be used with TIM10 and TIM11\r
1890   *   - TIM_IT_CC3, TIM_IT_CC4 can not be used with TIM9.   \r
1891   * @param  NewState: new state of the TIM interrupts.\r
1892   *         This parameter can be: ENABLE or DISABLE.\r
1893   * @retval None\r
1894   */\r
1895 void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState)\r
1896 {  \r
1897   /* Check the parameters */\r
1898   assert_param(IS_TIM_ALL_PERIPH(TIMx));\r
1899   assert_param(IS_TIM_IT(TIM_IT));\r
1900   assert_param(IS_FUNCTIONAL_STATE(NewState));\r
1901   \r
1902   if (NewState != DISABLE)\r
1903   {\r
1904     /* Enable the Interrupt sources */\r
1905     TIMx->DIER |= TIM_IT;\r
1906   }\r
1907   else\r
1908   {\r
1909     /* Disable the Interrupt sources */\r
1910     TIMx->DIER &= (uint16_t)~TIM_IT;\r
1911   }\r
1912 }\r
1913 \r
1914 /**\r
1915   * @brief  Configures the TIMx event to be generate by software.\r
1916   * @param  TIMx: where x can be 2 to 11 to select the TIM peripheral.\r
1917   * @param  TIM_EventSource: specifies the event source.\r
1918   *   This parameter can be one or more of the following values:           \r
1919   *     @arg TIM_EventSource_Update: Timer update Event source\r
1920   *     @arg TIM_EventSource_CC1: Timer Capture Compare 1 Event source\r
1921   *     @arg TIM_EventSource_CC2: Timer Capture Compare 2 Event source\r
1922   *     @arg TIM_EventSource_CC3: Timer Capture Compare 3 Event source\r
1923   *     @arg TIM_EventSource_CC4: Timer Capture Compare 4 Event source \r
1924   *     @arg TIM_EventSource_Trigger: Timer Trigger Event source\r
1925   * @note \r
1926   *   - TIM6 and TIM7 can only generate an update event. \r
1927   *   - TIM9 can only generate an update event, Capture Compare 1 event, \r
1928   *     Capture Compare 2 event and TIM_EventSource_Trigger.  \r
1929   *   - TIM10 and TIM11 can only generate an update event and Capture Compare 1 event.            \r
1930   * @retval None\r
1931   */\r
1932 void TIM_GenerateEvent(TIM_TypeDef* TIMx, uint16_t TIM_EventSource)\r
1933\r
1934   /* Check the parameters */\r
1935   assert_param(IS_TIM_ALL_PERIPH(TIMx));\r
1936   assert_param(IS_TIM_EVENT_SOURCE(TIM_EventSource)); \r
1937   /* Set the event sources */\r
1938   TIMx->EGR = TIM_EventSource;\r
1939 }\r
1940 \r
1941 /**\r
1942   * @brief  Checks whether the specified TIM flag is set or not.\r
1943   * @param  TIMx: where x can be 2 to 11 to select the TIM peripheral.\r
1944   * @param  TIM_FLAG: specifies the flag to check.\r
1945   *   This parameter can be one of the following values:\r
1946   *     @arg TIM_FLAG_Update: TIM update Flag\r
1947   *     @arg TIM_FLAG_CC1: TIM Capture Compare 1 Flag\r
1948   *     @arg TIM_FLAG_CC2: TIM Capture Compare 2 Flag\r
1949   *     @arg TIM_FLAG_CC3: TIM Capture Compare 3 Flag\r
1950   *     @arg TIM_FLAG_CC4: TIM Capture Compare 4 Flag\r
1951   *     @arg TIM_FLAG_Trigger: TIM Trigger Flag\r
1952   *     @arg TIM_FLAG_CC1OF: TIM Capture Compare 1 overcapture Flag\r
1953   *     @arg TIM_FLAG_CC2OF: TIM Capture Compare 2 overcapture Flag\r
1954   *     @arg TIM_FLAG_CC3OF: TIM Capture Compare 3 overcapture Flag\r
1955   *     @arg TIM_FLAG_CC4OF: TIM Capture Compare 4 overcapture Flag\r
1956   * @note\r
1957   *   - TIM6 and TIM7 can have only one update flag.\r
1958   *   - TIM9 can have only update flag, TIM_FLAG_CC1, TIM_FLAG_CC2 and TIM_FLAG_Trigger,\r
1959   *     TIM_FLAG_CC1OF or TIM_FLAG_CC2OF flags  \r
1960   *   - TIM10 and TIM11 can have only update flag, TIM_FLAG_CC1 or TIM_FLAG_CC1OF flags         \r
1961   * @retval The new state of TIM_FLAG (SET or RESET).\r
1962   */\r
1963 FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG)\r
1964\r
1965   ITStatus bitstatus = RESET; \r
1966    \r
1967   /* Check the parameters */\r
1968   assert_param(IS_TIM_ALL_PERIPH(TIMx));\r
1969   assert_param(IS_TIM_GET_FLAG(TIM_FLAG));\r
1970   \r
1971   if ((TIMx->SR & TIM_FLAG) != (uint16_t)RESET)\r
1972   {\r
1973     bitstatus = SET;\r
1974   }\r
1975   else\r
1976   {\r
1977     bitstatus = RESET;\r
1978   }\r
1979   return bitstatus;\r
1980 }\r
1981 \r
1982 /**\r
1983   * @brief  Clears the TIMx's pending flags.\r
1984   * @param  TIMx: where x can be 2 to 11 to select the TIM peripheral.\r
1985   * @param  TIM_FLAG: specifies the flag bit to clear.\r
1986   *   This parameter can be any combination of the following values:\r
1987   *     @arg TIM_FLAG_Update: TIM update Flag\r
1988   *     @arg TIM_FLAG_CC1: TIM Capture Compare 1 Flag\r
1989   *     @arg TIM_FLAG_CC2: TIM Capture Compare 2 Flag\r
1990   *     @arg TIM_FLAG_CC3: TIM Capture Compare 3 Flag\r
1991   *     @arg TIM_FLAG_CC4: TIM Capture Compare 4 Flag\r
1992   *     @arg TIM_FLAG_Trigger: TIM Trigger Flag\r
1993   *     @arg TIM_FLAG_CC1OF: TIM Capture Compare 1 overcapture Flag\r
1994   *     @arg TIM_FLAG_CC2OF: TIM Capture Compare 2 overcapture Flag\r
1995   *     @arg TIM_FLAG_CC3OF: TIM Capture Compare 3 overcapture Flag\r
1996   *     @arg TIM_FLAG_CC4OF: TIM Capture Compare 4 overcapture Flag\r
1997   * @note\r
1998   *   - TIM6 and TIM7 can have only one update flag. \r
1999   *   - TIM9 can have only update flag, TIM_FLAG_CC1, TIM_FLAG_CC2 and TIM_FLAG_Trigger flags\r
2000   *     TIM_FLAG_CC1OF or TIM_FLAG_CC2OF flags  \r
2001   *   - TIM10 and TIM11 can have only update flag, TIM_FLAG_CC1\r
2002   *     or TIM_FLAG_CC1OF flags      \r
2003   * @retval None\r
2004   */\r
2005 void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG)\r
2006 {  \r
2007   /* Check the parameters */\r
2008   assert_param(IS_TIM_ALL_PERIPH(TIMx));\r
2009   assert_param(IS_TIM_CLEAR_FLAG(TIM_FLAG));\r
2010    \r
2011   /* Clear the flags */\r
2012   TIMx->SR = (uint16_t)~TIM_FLAG;\r
2013 }\r
2014 \r
2015 /**\r
2016   * @brief  Checks whether the TIM interrupt has occurred or not.\r
2017   * @param  TIMx: where x can be 2 to 11 to select the TIM peripheral.\r
2018   * @param  TIM_IT: specifies the TIM interrupt source to check.\r
2019   *   This parameter can be one of the following values:\r
2020   *     @arg TIM_IT_Update: TIM update Interrupt source\r
2021   *     @arg TIM_IT_CC1: TIM Capture Compare 1 Interrupt source\r
2022   *     @arg TIM_IT_CC2: TIM Capture Compare 2 Interrupt source\r
2023   *     @arg TIM_IT_CC3: TIM Capture Compare 3 Interrupt source\r
2024   *     @arg TIM_IT_CC4: TIM Capture Compare 4 Interrupt source\r
2025   *     @arg TIM_IT_Trigger: TIM Trigger Interrupt source\r
2026   * @note\r
2027   *   - TIM6 and TIM7 can generate only an update interrupt.\r
2028   *   - TIM9 can have only update interrupt, TIM_FLAG_CC1 or TIM_FLAG_CC2,\r
2029   *     interrupt and TIM_IT_Trigger interrupt.\r
2030   *   - TIM10 and TIM11 can have only update interrupt or TIM_FLAG_CC1\r
2031   *     interrupt      \r
2032   * @retval The new state of the TIM_IT(SET or RESET).\r
2033   */\r
2034 ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT)\r
2035 {\r
2036   ITStatus bitstatus = RESET;  \r
2037   uint16_t itstatus = 0x0, itenable = 0x0;\r
2038   \r
2039   /* Check the parameters */\r
2040   assert_param(IS_TIM_ALL_PERIPH(TIMx));\r
2041   assert_param(IS_TIM_GET_IT(TIM_IT));\r
2042    \r
2043   itstatus = TIMx->SR & TIM_IT;\r
2044   \r
2045   itenable = TIMx->DIER & TIM_IT;\r
2046   if ((itstatus != (uint16_t)RESET) && (itenable != (uint16_t)RESET))\r
2047   {\r
2048     bitstatus = SET;\r
2049   }\r
2050   else\r
2051   {\r
2052     bitstatus = RESET;\r
2053   }\r
2054   return bitstatus;\r
2055 }\r
2056 \r
2057 /**\r
2058   * @brief  Clears the TIMx's interrupt pending bits.\r
2059   * @param  TIMx: where x can be 2 to 11 to select the TIM peripheral.\r
2060   * @param  TIM_IT: specifies the pending bit to clear.\r
2061   *   This parameter can be any combination of the following values:\r
2062   *     @arg TIM_IT_Update: TIM update Interrupt source\r
2063   *     @arg TIM_IT_CC1: TIM Capture Compare 1 Interrupt source\r
2064   *     @arg TIM_IT_CC2: TIM Capture Compare 2 Interrupt source\r
2065   *     @arg TIM_IT_CC3: TIM Capture Compare 3 Interrupt source\r
2066   *     @arg TIM_IT_CC4: TIM Capture Compare 4 Interrupt source\r
2067   *     @arg TIM_IT_Trigger: TIM Trigger Interrupt source\r
2068   * @note\r
2069   *   - TIM6 and TIM7 can generate only an update interrupt.\r
2070   *   - TIM9 can have only update interrupt, TIM_IT_CC1 or TIM_IT_CC2,\r
2071   *     and TIM_IT_Trigger interrupt.  \r
2072   *   - TIM10 and TIM11 can have only update interrupt or TIM_IT_CC1\r
2073   *     interrupt        \r
2074   * @retval None\r
2075   */\r
2076 void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT)\r
2077 {\r
2078   /* Check the parameters */\r
2079   assert_param(IS_TIM_ALL_PERIPH(TIMx));\r
2080   assert_param(IS_TIM_IT(TIM_IT));\r
2081    \r
2082   /* Clear the IT pending Bit */\r
2083   TIMx->SR = (uint16_t)~TIM_IT;\r
2084 }\r
2085 \r
2086 /**\r
2087   * @brief  Configures the TIMx\92s DMA interface.\r
2088   * @param  TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.\r
2089   * @param  TIM_DMABase: DMA Base address.\r
2090   *   This parameter can be one of the following values:\r
2091   *     @arg TIM_DMABase_CR, TIM_DMABase_CR2, TIM_DMABase_SMCR,\r
2092   *          TIM_DMABase_DIER, TIM_DMABase_SR, TIM_DMABase_EGR,\r
2093   *          TIM_DMABase_CCMR1, TIM_DMABase_CCMR2, TIM_DMABase_CCER,\r
2094   *          TIM_DMABase_CNT, TIM_DMABase_PSC, TIM_DMABase_ARR,\r
2095   *          TIM_DMABase_CCR1, TIM_DMABase_CCR2, TIM_DMABase_CCR3, \r
2096   *          TIM_DMABase_CCR4, TIM_DMABase_DCR.\r
2097   * @param  TIM_DMABurstLength: DMA Burst length.\r
2098   *   This parameter can be one value between:\r
2099   *   TIM_DMABurstLength_1Byte and TIM_DMABurstLength_18Bytes.\r
2100   * @retval None\r
2101   */\r
2102 void TIM_DMAConfig(TIM_TypeDef* TIMx, uint16_t TIM_DMABase, uint16_t TIM_DMABurstLength)\r
2103 {\r
2104   /* Check the parameters */\r
2105   assert_param(IS_TIM_LIST3_PERIPH(TIMx));\r
2106   assert_param(IS_TIM_DMA_BASE(TIM_DMABase)); \r
2107   assert_param(IS_TIM_DMA_LENGTH(TIM_DMABurstLength));\r
2108   /* Set the DMA Base and the DMA Burst Length */\r
2109   TIMx->DCR = TIM_DMABase | TIM_DMABurstLength;\r
2110 }\r
2111 \r
2112 /**\r
2113   * @brief  Enables or disables the TIMx\92s DMA Requests.\r
2114   * @param  TIMx: where x can be 2, 3, 4, 6 or 7 to select the TIM peripheral. \r
2115   * @param  TIM_DMASource: specifies the DMA Request sources.\r
2116   *   This parameter can be any combination of the following values:\r
2117   *     @arg TIM_DMA_Update: TIM update Interrupt source\r
2118   *     @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source\r
2119   *     @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source\r
2120   *     @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source\r
2121   *     @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source\r
2122   *     @arg TIM_DMA_Trigger: TIM Trigger DMA source\r
2123   * @param  NewState: new state of the DMA Request sources.\r
2124   *   This parameter can be: ENABLE or DISABLE.\r
2125   * @retval None\r
2126   */\r
2127 void TIM_DMACmd(TIM_TypeDef* TIMx, uint16_t TIM_DMASource, FunctionalState NewState)\r
2128\r
2129   /* Check the parameters */\r
2130   assert_param(IS_TIM_LIST4_PERIPH(TIMx));\r
2131   assert_param(IS_TIM_DMA_SOURCE(TIM_DMASource));\r
2132   assert_param(IS_FUNCTIONAL_STATE(NewState));\r
2133   \r
2134   if (NewState != DISABLE)\r
2135   {\r
2136     /* Enable the DMA sources */\r
2137     TIMx->DIER |= TIM_DMASource; \r
2138   }\r
2139   else\r
2140   {\r
2141     /* Disable the DMA sources */\r
2142     TIMx->DIER &= (uint16_t)~TIM_DMASource;\r
2143   }\r
2144 }\r
2145 \r
2146 /**\r
2147   * @brief  Selects the TIMx peripheral Capture Compare DMA source.\r
2148   * @param  TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.\r
2149   * @param  NewState: new state of the Capture Compare DMA source\r
2150   *   This parameter can be: ENABLE or DISABLE.\r
2151   * @retval None\r
2152   */\r
2153 void TIM_SelectCCDMA(TIM_TypeDef* TIMx, FunctionalState NewState)\r
2154 {\r
2155   /* Check the parameters */\r
2156   assert_param(IS_TIM_LIST3_PERIPH(TIMx));\r
2157   assert_param(IS_FUNCTIONAL_STATE(NewState));\r
2158   \r
2159   if (NewState != DISABLE)\r
2160   {\r
2161     /* Set the CCDS Bit */\r
2162     TIMx->CR2 |= TIM_CR2_CCDS;\r
2163   }\r
2164   else\r
2165   {\r
2166     /* Reset the CCDS Bit */\r
2167     TIMx->CR2 &= (uint16_t)~((uint16_t)TIM_CR2_CCDS);\r
2168   }\r
2169 }\r
2170 \r
2171 /**\r
2172   * @}\r
2173   */\r
2174 \r
2175 /** @defgroup TIM_Group5 Clocks management functions\r
2176  *  @brief    Clocks management functions\r
2177  *\r
2178 @verbatim   \r
2179  ===============================================================================\r
2180                          Clocks management functions\r
2181  ===============================================================================  \r
2182 \r
2183 @endverbatim\r
2184   * @{\r
2185   */\r
2186 \r
2187 /**\r
2188   * @brief  Configures the TIMx internal Clock\r
2189   * @param  TIMx: where x can be 2, 3, 4 or 9 to select the TIM peripheral.\r
2190   * @retval None\r
2191   */\r
2192 void TIM_InternalClockConfig(TIM_TypeDef* TIMx)\r
2193 {\r
2194   /* Check the parameters */\r
2195   assert_param(IS_TIM_LIST2_PERIPH(TIMx));\r
2196   /* Disable slave mode to clock the prescaler directly with the internal clock */\r
2197   TIMx->SMCR &=  (uint16_t)(~((uint16_t)TIM_SMCR_SMS));\r
2198 }\r
2199 \r
2200 /**\r
2201   * @brief  Configures the TIMx Internal Trigger as External Clock\r
2202   * @param  TIMx: where x can be 2, 3, 4 or 9 to select the TIM peripheral.\r
2203   * @param  TIM_ITRSource: Trigger source.\r
2204   *   This parameter can be one of the following values:\r
2205   * @param  TIM_TS_ITR0: Internal Trigger 0\r
2206   * @param  TIM_TS_ITR1: Internal Trigger 1\r
2207   * @param  TIM_TS_ITR2: Internal Trigger 2\r
2208   * @param  TIM_TS_ITR3: Internal Trigger 3\r
2209   * @retval None\r
2210   */\r
2211 void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource)\r
2212 {\r
2213   /* Check the parameters */\r
2214   assert_param(IS_TIM_LIST2_PERIPH(TIMx));\r
2215   assert_param(IS_TIM_INTERNAL_TRIGGER_SELECTION(TIM_InputTriggerSource));\r
2216   /* Select the Internal Trigger */\r
2217   TIM_SelectInputTrigger(TIMx, TIM_InputTriggerSource);\r
2218   /* Select the External clock mode1 */\r
2219   TIMx->SMCR |= TIM_SlaveMode_External1;\r
2220 }\r
2221 \r
2222 /**\r
2223   * @brief  Configures the TIMx Trigger as External Clock\r
2224   * @param  TIMx: where x can be 2, 3, 4 or 9 to select the TIM peripheral.\r
2225   * @param  TIM_TIxExternalCLKSource: Trigger source.\r
2226   *   This parameter can be one of the following values:\r
2227   *     @arg TIM_TIxExternalCLK1Source_TI1ED: TI1 Edge Detector\r
2228   *     @arg TIM_TIxExternalCLK1Source_TI1: Filtered Timer Input 1\r
2229   *     @arg TIM_TIxExternalCLK1Source_TI2: Filtered Timer Input 2\r
2230   * @param  TIM_ICPolarity: specifies the TIx Polarity.\r
2231   *   This parameter can be one of the following values:\r
2232   *     @arg TIM_ICPolarity_Rising\r
2233   *     @arg TIM_ICPolarity_Falling\r
2234   * @param  ICFilter : specifies the filter value.\r
2235   *   This parameter must be a value between 0x0 and 0xF.\r
2236   * @retval None\r
2237   */\r
2238 void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,\r
2239                                 uint16_t TIM_ICPolarity, uint16_t ICFilter)\r
2240 {\r
2241   /* Check the parameters */\r
2242   assert_param(IS_TIM_LIST2_PERIPH(TIMx));\r
2243   assert_param(IS_TIM_IC_POLARITY(TIM_ICPolarity));\r
2244   assert_param(IS_TIM_IC_FILTER(ICFilter));\r
2245   \r
2246   /* Configure the Timer Input Clock Source */\r
2247   if (TIM_TIxExternalCLKSource == TIM_TIxExternalCLK1Source_TI2)\r
2248   {\r
2249     TI2_Config(TIMx, TIM_ICPolarity, TIM_ICSelection_DirectTI, ICFilter);\r
2250   }\r
2251   else\r
2252   {\r
2253     TI1_Config(TIMx, TIM_ICPolarity, TIM_ICSelection_DirectTI, ICFilter);\r
2254   }\r
2255   /* Select the Trigger source */\r
2256   TIM_SelectInputTrigger(TIMx, TIM_TIxExternalCLKSource);\r
2257   /* Select the External clock mode1 */\r
2258   TIMx->SMCR |= TIM_SlaveMode_External1;\r
2259 }\r
2260 \r
2261 /**\r
2262   * @brief  Configures the External clock Mode1\r
2263   * @param  TIMx: where x can be 2, 3, 4 or 9 to select the TIM peripheral.\r
2264   * @param  TIM_ExtTRGPrescaler: The external Trigger Prescaler.\r
2265   *   This parameter can be one of the following values:\r
2266   *     @arg TIM_ExtTRGPSC_OFF: ETRP Prescaler OFF.\r
2267   *     @arg TIM_ExtTRGPSC_DIV2: ETRP frequency divided by 2.\r
2268   *     @arg TIM_ExtTRGPSC_DIV4: ETRP frequency divided by 4.\r
2269   *     @arg TIM_ExtTRGPSC_DIV8: ETRP frequency divided by 8.\r
2270   * @param  TIM_ExtTRGPolarity: The external Trigger Polarity.\r
2271   *   This parameter can be one of the following values:\r
2272   *     @arg TIM_ExtTRGPolarity_Inverted: active low or falling edge active.\r
2273   *     @arg TIM_ExtTRGPolarity_NonInverted: active high or rising edge active.\r
2274   * @param  ExtTRGFilter: External Trigger Filter.\r
2275   *   This parameter must be a value between 0x00 and 0x0F\r
2276   * @retval None\r
2277   */\r
2278 void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,\r
2279                              uint16_t ExtTRGFilter)\r
2280 {\r
2281   uint16_t tmpsmcr = 0;\r
2282   \r
2283   /* Check the parameters */\r
2284   assert_param(IS_TIM_LIST2_PERIPH(TIMx));\r
2285   assert_param(IS_TIM_EXT_PRESCALER(TIM_ExtTRGPrescaler));\r
2286   assert_param(IS_TIM_EXT_POLARITY(TIM_ExtTRGPolarity));\r
2287   assert_param(IS_TIM_EXT_FILTER(ExtTRGFilter));\r
2288   \r
2289   /* Configure the ETR Clock source */\r
2290   TIM_ETRConfig(TIMx, TIM_ExtTRGPrescaler, TIM_ExtTRGPolarity, ExtTRGFilter);\r
2291   \r
2292   /* Get the TIMx SMCR register value */\r
2293   tmpsmcr = TIMx->SMCR;\r
2294   /* Reset the SMS Bits */\r
2295   tmpsmcr &= (uint16_t)(~((uint16_t)TIM_SMCR_SMS));\r
2296   /* Select the External clock mode1 */\r
2297   tmpsmcr |= TIM_SlaveMode_External1;\r
2298   /* Select the Trigger selection : ETRF */\r
2299   tmpsmcr &= (uint16_t)(~((uint16_t)TIM_SMCR_TS));\r
2300   tmpsmcr |= TIM_TS_ETRF;\r
2301   /* Write to TIMx SMCR */\r
2302   TIMx->SMCR = tmpsmcr;\r
2303 }\r
2304 \r
2305 /**\r
2306   * @brief  Configures the External clock Mode2\r
2307   * @param  TIMx: where x can be 2, 3, 4, 9, 10 or 11 to select the TIM peripheral.\r
2308   * @param  TIM_ExtTRGPrescaler: The external Trigger Prescaler.\r
2309   *   This parameter can be one of the following values:\r
2310   *     @arg TIM_ExtTRGPSC_OFF: ETRP Prescaler OFF.\r
2311   *     @arg TIM_ExtTRGPSC_DIV2: ETRP frequency divided by 2.\r
2312   *     @arg TIM_ExtTRGPSC_DIV4: ETRP frequency divided by 4.\r
2313   *     @arg TIM_ExtTRGPSC_DIV8: ETRP frequency divided by 8.\r
2314   * @param  TIM_ExtTRGPolarity: The external Trigger Polarity.\r
2315   *   This parameter can be one of the following values:\r
2316   *     @arg TIM_ExtTRGPolarity_Inverted: active low or falling edge active.\r
2317   *     @arg TIM_ExtTRGPolarity_NonInverted: active high or rising edge active.\r
2318   * @param  ExtTRGFilter: External Trigger Filter.\r
2319   *   This parameter must be a value between 0x00 and 0x0F\r
2320   * @retval None\r
2321   */\r
2322 void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, \r
2323                              uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter)\r
2324 {\r
2325   /* Check the parameters */\r
2326   assert_param(IS_TIM_LIST1_PERIPH(TIMx));\r
2327   assert_param(IS_TIM_EXT_PRESCALER(TIM_ExtTRGPrescaler));\r
2328   assert_param(IS_TIM_EXT_POLARITY(TIM_ExtTRGPolarity));\r
2329   assert_param(IS_TIM_EXT_FILTER(ExtTRGFilter));\r
2330   \r
2331   /* Configure the ETR Clock source */\r
2332   TIM_ETRConfig(TIMx, TIM_ExtTRGPrescaler, TIM_ExtTRGPolarity, ExtTRGFilter);\r
2333   /* Enable the External clock mode2 */\r
2334   TIMx->SMCR |= TIM_SMCR_ECE;\r
2335 }\r
2336 \r
2337 /**\r
2338   * @}\r
2339   */\r
2340 \r
2341 /** @defgroup TIM_Group6 Synchronization management functions\r
2342  *  @brief    Synchronization management functions \r
2343  *\r
2344 @verbatim   \r
2345  ===============================================================================\r
2346                        Synchronization management functions\r
2347  ===============================================================================  \r
2348                    \r
2349        ===================================================================      \r
2350               TIM Driver: how to use it in synchronization Mode\r
2351        =================================================================== \r
2352        Case of two/several Timers\r
2353        **************************\r
2354        1. Configure the Master Timers using the following functions:\r
2355           - void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource); \r
2356           - void TIM_SelectMasterSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_MasterSlaveMode);  \r
2357        2. Configure the Slave Timers using the following functions: \r
2358           - void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);  \r
2359           - void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode); \r
2360           \r
2361        Case of Timers and external trigger(ETR pin)\r
2362        ********************************************       \r
2363        1. Configure the Etrenal trigger using this function:\r
2364           - void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,\r
2365                    uint16_t ExtTRGFilter);\r
2366        2. Configure the Slave Timers using the following functions: \r
2367           - void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);  \r
2368           - void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode); \r
2369 \r
2370 @endverbatim\r
2371   * @{\r
2372   */\r
2373 \r
2374 /**\r
2375   * @brief  Selects the Input Trigger source\r
2376   * @param  TIMx: where x can be 2, 3, 4 or 9 to select the TIM peripheral.\r
2377   * @param  TIM_InputTriggerSource: The Input Trigger source.\r
2378   *   This parameter can be one of the following values:\r
2379   *     @arg TIM_TS_ITR0: Internal Trigger 0\r
2380   *     @arg TIM_TS_ITR1: Internal Trigger 1\r
2381   *     @arg TIM_TS_ITR2: Internal Trigger 2\r
2382   *     @arg TIM_TS_ITR3: Internal Trigger 3\r
2383   *     @arg TIM_TS_TI1F_ED: TI1 Edge Detector\r
2384   *     @arg TIM_TS_TI1FP1: Filtered Timer Input 1\r
2385   *     @arg TIM_TS_TI2FP2: Filtered Timer Input 2\r
2386   *     @arg TIM_TS_ETRF: External Trigger input\r
2387   * @retval None\r
2388   */\r
2389 void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource)\r
2390 {\r
2391   uint16_t tmpsmcr = 0;\r
2392 \r
2393   /* Check the parameters */\r
2394   assert_param(IS_TIM_LIST1_PERIPH(TIMx)); \r
2395   assert_param(IS_TIM_TRIGGER_SELECTION(TIM_InputTriggerSource));\r
2396 \r
2397   /* Get the TIMx SMCR register value */\r
2398   tmpsmcr = TIMx->SMCR;\r
2399   /* Reset the TS Bits */\r
2400   tmpsmcr &= (uint16_t)(~((uint16_t)TIM_SMCR_TS));\r
2401   /* Set the Input Trigger source */\r
2402   tmpsmcr |= TIM_InputTriggerSource;\r
2403   /* Write to TIMx SMCR */\r
2404   TIMx->SMCR = tmpsmcr;\r
2405 }\r
2406 \r
2407 /**\r
2408   * @brief  Selects the TIMx Trigger Output Mode.\r
2409   * @param  TIMx: where x can be 2, 3, 4, 6, 7 or 9 to select the TIM peripheral.\r
2410   * @param  TIM_TRGOSource: specifies the Trigger Output source.\r
2411   *   This paramter can be one of the following values:\r
2412   *\r
2413   *  - For all TIMx\r
2414   *     @arg TIM_TRGOSource_Reset:  The UG bit in the TIM_EGR register is used as the trigger output (TRGO).\r
2415   *     @arg TIM_TRGOSource_Enable: The Counter Enable CEN is used as the trigger output (TRGO).\r
2416   *     @arg TIM_TRGOSource_Update: The update event is selected as the trigger output (TRGO).\r
2417   *\r
2418   *  - For all TIMx except TIM6 and TIM7\r
2419   *     @arg TIM_TRGOSource_OC1: The trigger output sends a positive pulse when the CC1IF flag\r
2420   *                              is to be set, as soon as a capture or compare match occurs (TRGO).\r
2421   *     @arg TIM_TRGOSource_OC1Ref: OC1REF signal is used as the trigger output (TRGO).\r
2422 \r
2423   *  - For all TIMx except TIM6, TIM7, TIM10 and TIM11\r
2424   *     @arg TIM_TRGOSource_OC2Ref: OC2REF signal is used as the trigger output (TRGO).\r
2425 \r
2426   *  - For TIM2, TIM3 and TIM4\r
2427   *     @arg TIM_TRGOSource_OC3Ref: OC3REF signal is used as the trigger output (TRGO).\r
2428   *     @arg TIM_TRGOSource_OC4Ref: OC4REF signal is used as the trigger output (TRGO).\r
2429   *\r
2430   * @retval None\r
2431   */\r
2432 void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource)\r
2433 {\r
2434   /* Check the parameters */\r
2435   assert_param(IS_TIM_LIST5_PERIPH(TIMx));\r
2436   assert_param(IS_TIM_TRGO_SOURCE(TIM_TRGOSource));\r
2437 \r
2438   /* Reset the MMS Bits */\r
2439   TIMx->CR2 &= (uint16_t)~((uint16_t)TIM_CR2_MMS);\r
2440   /* Select the TRGO source */\r
2441   TIMx->CR2 |=  TIM_TRGOSource;\r
2442 }\r
2443 \r
2444 /**\r
2445   * @brief  Selects the TIMx Slave Mode.\r
2446   * @param  TIMx: where x can be 2, 3, 4 or 9 to select the TIM peripheral.\r
2447   * @param  TIM_SlaveMode: specifies the Timer Slave Mode.\r
2448   *   This paramter can be one of the following values:\r
2449   *     @arg TIM_SlaveMode_Reset: Rising edge of the selected trigger signal (TRGI) re-initializes\r
2450   *                               the counter and triggers an update of the registers.\r
2451   *     @arg TIM_SlaveMode_Gated:     The counter clock is enabled when the trigger signal (TRGI) is high.\r
2452   *     @arg TIM_SlaveMode_Trigger:   The counter starts at a rising edge of the trigger TRGI.\r
2453   *     @arg TIM_SlaveMode_External1: Rising edges of the selected trigger (TRGI) clock the counter.\r
2454   * @retval None\r
2455   */\r
2456 void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode)\r
2457 {\r
2458   /* Check the parameters */\r
2459   assert_param(IS_TIM_LIST2_PERIPH(TIMx)); \r
2460   assert_param(IS_TIM_SLAVE_MODE(TIM_SlaveMode));\r
2461   \r
2462   /* Reset the SMS Bits */\r
2463   TIMx->SMCR &= (uint16_t)~((uint16_t)TIM_SMCR_SMS);\r
2464   /* Select the Slave Mode */\r
2465   TIMx->SMCR |= TIM_SlaveMode;\r
2466 }\r
2467 \r
2468 /**\r
2469   * @brief  Sets or Resets the TIMx Master/Slave Mode.\r
2470   * @param  TIMx: where x can be 2, 3, 4 or 9 to select the TIM peripheral.\r
2471   * @param  TIM_MasterSlaveMode: specifies the Timer Master Slave Mode.\r
2472   *   This paramter can be one of the following values:\r
2473   *     @arg TIM_MasterSlaveMode_Enable: synchronization between the current timer\r
2474   *                                      and its slaves (through TRGO).\r
2475   *     @arg TIM_MasterSlaveMode_Disable: No action\r
2476   * @retval None\r
2477   */\r
2478 void TIM_SelectMasterSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_MasterSlaveMode)\r
2479 {\r
2480   /* Check the parameters */\r
2481   assert_param(IS_TIM_LIST2_PERIPH(TIMx));\r
2482   assert_param(IS_TIM_MSM_STATE(TIM_MasterSlaveMode));\r
2483   \r
2484   /* Reset the MSM Bit */\r
2485   TIMx->SMCR &= (uint16_t)~((uint16_t)TIM_SMCR_MSM);\r
2486   \r
2487   /* Set or Reset the MSM Bit */\r
2488   TIMx->SMCR |= TIM_MasterSlaveMode;\r
2489 }\r
2490 \r
2491 /**\r
2492   * @brief  Configures the TIMx External Trigger (ETR).\r
2493   * @param  TIMx: where x can be 2, 3, 4, 9, 10 or 11 to select the TIM peripheral.\r
2494   * @param  TIM_ExtTRGPrescaler: The external Trigger Prescaler.\r
2495   *   This parameter can be one of the following values:\r
2496   *     @arg TIM_ExtTRGPSC_OFF: ETRP Prescaler OFF.\r
2497   *     @arg TIM_ExtTRGPSC_DIV2: ETRP frequency divided by 2.\r
2498   *     @arg TIM_ExtTRGPSC_DIV4: ETRP frequency divided by 4.\r
2499   *     @arg TIM_ExtTRGPSC_DIV8: ETRP frequency divided by 8.\r
2500   * @param  TIM_ExtTRGPolarity: The external Trigger Polarity.\r
2501   *   This parameter can be one of the following values:\r
2502   *     @arg TIM_ExtTRGPolarity_Inverted: active low or falling edge active.\r
2503   *     @arg TIM_ExtTRGPolarity_NonInverted: active high or rising edge active.\r
2504   * @param  ExtTRGFilter: External Trigger Filter.\r
2505   *   This parameter must be a value between 0x00 and 0x0F\r
2506   * @retval None\r
2507   */\r
2508 void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,\r
2509                    uint16_t ExtTRGFilter)\r
2510 {\r
2511   uint16_t tmpsmcr = 0;\r
2512   \r
2513   /* Check the parameters */\r
2514   assert_param(IS_TIM_LIST1_PERIPH(TIMx));\r
2515   assert_param(IS_TIM_EXT_PRESCALER(TIM_ExtTRGPrescaler));\r
2516   assert_param(IS_TIM_EXT_POLARITY(TIM_ExtTRGPolarity));\r
2517   assert_param(IS_TIM_EXT_FILTER(ExtTRGFilter));\r
2518   \r
2519   tmpsmcr = TIMx->SMCR;\r
2520   /* Reset the ETR Bits */\r
2521   tmpsmcr &= SMCR_ETR_MASK;\r
2522   /* Set the Prescaler, the Filter value and the Polarity */\r
2523   tmpsmcr |= (uint16_t)(TIM_ExtTRGPrescaler | (uint16_t)(TIM_ExtTRGPolarity | (uint16_t)(ExtTRGFilter << (uint16_t)8)));\r
2524   /* Write to TIMx SMCR */\r
2525   TIMx->SMCR = tmpsmcr;\r
2526 }\r
2527 \r
2528 /**\r
2529   * @}\r
2530   */\r
2531 \r
2532 /** @defgroup TIM_Group7 Specific interface management functions\r
2533  *  @brief    Specific interface management functions \r
2534  *\r
2535 @verbatim   \r
2536  ===============================================================================\r
2537                     Specific interface management functions\r
2538  ===============================================================================  \r
2539 \r
2540 @endverbatim\r
2541   * @{\r
2542   */\r
2543 \r
2544 /**\r
2545   * @brief  Configures the TIMx Encoder Interface.\r
2546   * @param  TIMx: where x can be  2, 3 or 4 to select the TIM peripheral.\r
2547   * @param  TIM_EncoderMode: specifies the TIMx Encoder Mode.\r
2548   *   This parameter can be one of the following values:\r
2549   *     @arg TIM_EncoderMode_TI1: Counter counts on TI1FP1 edge depending on TI2FP2 level.\r
2550   *     @arg TIM_EncoderMode_TI2: Counter counts on TI2FP2 edge depending on TI1FP1 level.\r
2551   *     @arg TIM_EncoderMode_TI12: Counter counts on both TI1FP1 and TI2FP2 edges depending\r
2552   *                                on the level of the other input.\r
2553   * @param  TIM_IC1Polarity: specifies the IC1 Polarity\r
2554   *   This parmeter can be one of the following values:\r
2555   *     @arg TIM_ICPolarity_Falling: IC Falling edge.\r
2556   *     @arg TIM_ICPolarity_Rising: IC Rising edge.\r
2557   * @param  TIM_IC2Polarity: specifies the IC2 Polarity\r
2558   *   This parmeter can be one of the following values:\r
2559   *     @arg TIM_ICPolarity_Falling: IC Falling edge.\r
2560   *     @arg TIM_ICPolarity_Rising: IC Rising edge.\r
2561   * @retval None\r
2562   */\r
2563 void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode,\r
2564                                 uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity)\r
2565 {\r
2566   uint16_t tmpsmcr = 0;\r
2567   uint16_t tmpccmr1 = 0;\r
2568   uint16_t tmpccer = 0;\r
2569     \r
2570   /* Check the parameters */\r
2571   assert_param(IS_TIM_LIST3_PERIPH(TIMx));\r
2572   assert_param(IS_TIM_ENCODER_MODE(TIM_EncoderMode));\r
2573   assert_param(IS_TIM_IC_POLARITY(TIM_IC1Polarity));\r
2574   assert_param(IS_TIM_IC_POLARITY(TIM_IC2Polarity));\r
2575   \r
2576   /* Get the TIMx SMCR register value */\r
2577   tmpsmcr = TIMx->SMCR;\r
2578   /* Get the TIMx CCMR1 register value */\r
2579   tmpccmr1 = TIMx->CCMR1;\r
2580   /* Get the TIMx CCER register value */\r
2581   tmpccer = TIMx->CCER;\r
2582   /* Set the encoder Mode */\r
2583   tmpsmcr &= (uint16_t)(~((uint16_t)TIM_SMCR_SMS));\r
2584   tmpsmcr |= TIM_EncoderMode;\r
2585   /* Select the Capture Compare 1 and the Capture Compare 2 as input */\r
2586   tmpccmr1 &= (uint16_t)(((uint16_t)~((uint16_t)TIM_CCMR1_CC1S)) & (uint16_t)(~((uint16_t)TIM_CCMR1_CC2S)));\r
2587   tmpccmr1 |= TIM_CCMR1_CC1S_0 | TIM_CCMR1_CC2S_0;\r
2588   /* Set the TI1 and the TI2 Polarities */\r
2589   tmpccer &= (uint16_t)(((uint16_t)~((uint16_t)TIM_CCER_CC1P)) & ((uint16_t)~((uint16_t)TIM_CCER_CC2P)));\r
2590    tmpccer |= (uint16_t)(TIM_IC1Polarity | (uint16_t)(TIM_IC2Polarity << (uint16_t)4));\r
2591   /* Write to TIMx SMCR */\r
2592   TIMx->SMCR = tmpsmcr;\r
2593   /* Write to TIMx CCMR1 */\r
2594   TIMx->CCMR1 = tmpccmr1;\r
2595   /* Write to TIMx CCER */\r
2596   TIMx->CCER = tmpccer;\r
2597 }\r
2598 \r
2599 /**\r
2600   * @brief  Enables or disables the TIMx\92s Hall sensor interface.\r
2601   * @param  TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.\r
2602   * @param  NewState: new state of the TIMx Hall sensor interface.\r
2603   *   This parameter can be: ENABLE or DISABLE.\r
2604   * @retval None\r
2605   */\r
2606 void TIM_SelectHallSensor(TIM_TypeDef* TIMx, FunctionalState NewState)\r
2607 {\r
2608   /* Check the parameters */\r
2609   assert_param(IS_TIM_LIST3_PERIPH(TIMx));\r
2610   assert_param(IS_FUNCTIONAL_STATE(NewState));\r
2611   \r
2612   if (NewState != DISABLE)\r
2613   {\r
2614     /* Set the TI1S Bit */\r
2615     TIMx->CR2 |= TIM_CR2_TI1S;\r
2616   }\r
2617   else\r
2618   {\r
2619     /* Reset the TI1S Bit */\r
2620     TIMx->CR2 &= (uint16_t)~((uint16_t)TIM_CR2_TI1S);\r
2621   }\r
2622 }\r
2623 \r
2624 /**\r
2625   * @}\r
2626   */\r
2627 \r
2628 /** @defgroup TIM_Group8 Specific remapping management function\r
2629  *  @brief   Specific remapping management function\r
2630  *\r
2631 @verbatim   \r
2632  ===============================================================================\r
2633                      Specific remapping management function\r
2634  ===============================================================================  \r
2635 \r
2636 @endverbatim\r
2637   * @{\r
2638   */\r
2639 \r
2640 /**\r
2641   * @brief  Configures the TIM9, TIM10 and TIM11 Remapping input Capabilities.\r
2642   * @param  TIMx: where x can be 9, 10 or 11 to select the TIM peripheral.\r
2643   * @param  TIM_Remap: specifies the TIM input remapping source.\r
2644   *   This parameter can be one of the following values:\r
2645   *     @arg TIM9_GPIO: TIM9 Channel 1 is connected to dedicated Timer pin(default)\r
2646   *     @arg TIM9_LSE: TIM9 Channel 1 is connected to LSE clock.\r
2647   *     @arg TIM10_GPIO: TIM10 Channel 1 is connected to dedicated Timer pin(default) \r
2648   *     @arg TIM10_LSI: TIM10 Channel 1 is connected to LSI clock.\r
2649   *     @arg TIM10_LSE: TIM10 Channel 1 is connected to LSE clock.\r
2650   *     @arg TIM10_RTC: TIM10 Channel 1 is connected to RTC Output event. \r
2651   *     @arg TIM11_GPIO: TIM11 Channel 1 is connected to dedicated Timer pin(default) \r
2652   *     @arg TIM11_MSI: TIM11 Channel 1 is connected to MSI clock.\r
2653   *     @arg TIM11_HSE_RTC: TIM11 Channel 1 is connected to HSE_RTC clock.  \r
2654   * @retval None\r
2655   */\r
2656 void TIM_RemapConfig(TIM_TypeDef* TIMx, uint16_t TIM_Remap)\r
2657 {\r
2658  /* Check the parameters */\r
2659   assert_param(IS_TIM_LIST6_PERIPH(TIMx));\r
2660   assert_param(IS_TIM_REMAP(TIM_Remap));\r
2661 \r
2662   /* Set the Timer remapping configuration */\r
2663   TIMx->OR =  TIM_Remap;\r
2664 }\r
2665 \r
2666 /**\r
2667   * @}\r
2668   */\r
2669 \r
2670 /**\r
2671   * @brief  Configure the TI1 as Input.\r
2672   * @param  TIMx: where x can be 2, 3, 4, 9, 10 or 11 to select the TIM peripheral.\r
2673   * @param  TIM_ICPolarity : The Input Polarity.\r
2674   *   This parameter can be one of the following values:\r
2675   *     @arg TIM_ICPolarity_Rising\r
2676   *     @arg TIM_ICPolarity_Falling\r
2677   * @param  TIM_ICSelection: specifies the input to be used.\r
2678   *   This parameter can be one of the following values:\r
2679   *     @arg TIM_ICSelection_DirectTI: TIM Input 1 is selected to be connected to IC1.\r
2680   *     @arg TIM_ICSelection_IndirectTI: TIM Input 1 is selected to be connected to IC2.\r
2681   *     @arg TIM_ICSelection_TRC: TIM Input 1 is selected to be connected to TRC.\r
2682   * @param  TIM_ICFilter: Specifies the Input Capture Filter.\r
2683   *   This parameter must be a value between 0x00 and 0x0F.\r
2684   * @retval None\r
2685   */\r
2686 static void TI1_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,\r
2687                        uint16_t TIM_ICFilter)\r
2688 {\r
2689   uint16_t tmpccmr1 = 0, tmpccer = 0;\r
2690   \r
2691   /* Disable the Channel 1: Reset the CC1E Bit */\r
2692   TIMx->CCER &= (uint16_t)~((uint16_t)TIM_CCER_CC1E);\r
2693   tmpccmr1 = TIMx->CCMR1;\r
2694   tmpccer = TIMx->CCER;\r
2695   /* Select the Input and set the filter */\r
2696   tmpccmr1 &= (uint16_t)(((uint16_t)~((uint16_t)TIM_CCMR1_CC1S)) & ((uint16_t)~((uint16_t)TIM_CCMR1_IC1F)));\r
2697   tmpccmr1 |= (uint16_t)(TIM_ICSelection | (uint16_t)(TIM_ICFilter << (uint16_t)4));\r
2698   /* Select the Polarity and set the CC1E Bit */\r
2699   tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC1P | TIM_CCER_CC1NP));\r
2700   tmpccer |= (uint16_t)(TIM_ICPolarity | (uint16_t)TIM_CCER_CC1E);\r
2701   /* Write to TIMx CCMR1 and CCER registers */\r
2702   TIMx->CCMR1 = tmpccmr1;\r
2703   TIMx->CCER = tmpccer;\r
2704 }\r
2705 \r
2706 /**\r
2707   * @brief  Configure the TI2 as Input.\r
2708   * @param  TIMx: where x can be 2, 3, 4 or 9 to select the TIM peripheral.\r
2709   * @param  TIM_ICPolarity : The Input Polarity.\r
2710   *   This parameter can be one of the following values:\r
2711   *     @arg TIM_ICPolarity_Rising\r
2712   *     @arg TIM_ICPolarity_Falling\r
2713   * @param  TIM_ICSelection: specifies the input to be used.\r
2714   *   This parameter can be one of the following values:\r
2715   *     @arg TIM_ICSelection_DirectTI: TIM Input 2 is selected to be connected to IC2.\r
2716   *     @arg TIM_ICSelection_IndirectTI: TIM Input 2 is selected to be connected to IC1.\r
2717   *     @arg TIM_ICSelection_TRC: TIM Input 2 is selected to be connected to TRC.\r
2718   * @param  TIM_ICFilter: Specifies the Input Capture Filter.\r
2719   *   This parameter must be a value between 0x00 and 0x0F.\r
2720   * @retval None\r
2721   */\r
2722 static void TI2_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,\r
2723                        uint16_t TIM_ICFilter)\r
2724 {\r
2725   uint16_t tmpccmr1 = 0, tmpccer = 0, tmp = 0;\r
2726   \r
2727   /* Disable the Channel 2: Reset the CC2E Bit */\r
2728   TIMx->CCER &= (uint16_t)~((uint16_t)TIM_CCER_CC2E);\r
2729   tmpccmr1 = TIMx->CCMR1;\r
2730   tmpccer = TIMx->CCER;\r
2731   tmp = (uint16_t)(TIM_ICPolarity << 4);\r
2732   /* Select the Input and set the filter */\r
2733   tmpccmr1 &= (uint16_t)(((uint16_t)~((uint16_t)TIM_CCMR1_CC2S)) & ((uint16_t)~((uint16_t)TIM_CCMR1_IC2F)));\r
2734   tmpccmr1 |= (uint16_t)(TIM_ICFilter << 12);\r
2735   tmpccmr1 |= (uint16_t)(TIM_ICSelection << 8);\r
2736   /* Select the Polarity and set the CC2E Bit */\r
2737   tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC2P | TIM_CCER_CC2NP));\r
2738   tmpccer |=  (uint16_t)(tmp | (uint16_t)TIM_CCER_CC2E);\r
2739   /* Write to TIMx CCMR1 and CCER registers */\r
2740   TIMx->CCMR1 = tmpccmr1 ;\r
2741   TIMx->CCER = tmpccer;\r
2742 }\r
2743 \r
2744 /**\r
2745   * @brief  Configure the TI3 as Input.\r
2746   * @param  TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.\r
2747   * @param  TIM_ICPolarity : The Input Polarity.\r
2748   *   This parameter can be one of the following values:\r
2749   *     @arg TIM_ICPolarity_Rising\r
2750   *     @arg TIM_ICPolarity_Falling\r
2751   * @param  TIM_ICSelection: specifies the input to be used.\r
2752   *   This parameter can be one of the following values:\r
2753   *     @arg TIM_ICSelection_DirectTI: TIM Input 3 is selected to be connected to IC3.\r
2754   *     @arg TIM_ICSelection_IndirectTI: TIM Input 3 is selected to be connected to IC4.\r
2755   *     @arg TIM_ICSelection_TRC: TIM Input 3 is selected to be connected to TRC.\r
2756   * @param  TIM_ICFilter: Specifies the Input Capture Filter.\r
2757   *   This parameter must be a value between 0x00 and 0x0F.\r
2758   * @retval None\r
2759   */\r
2760 static void TI3_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,\r
2761                        uint16_t TIM_ICFilter)\r
2762 {\r
2763   uint16_t tmpccmr2 = 0, tmpccer = 0, tmp = 0;\r
2764   \r
2765   /* Disable the Channel 3: Reset the CC3E Bit */\r
2766   TIMx->CCER &= (uint16_t)~((uint16_t)TIM_CCER_CC3E);\r
2767   tmpccmr2 = TIMx->CCMR2;\r
2768   tmpccer = TIMx->CCER;\r
2769   tmp = (uint16_t)(TIM_ICPolarity << 8);\r
2770   /* Select the Input and set the filter */\r
2771   tmpccmr2 &= (uint16_t)(((uint16_t)~((uint16_t)TIM_CCMR2_CC3S)) & ((uint16_t)~((uint16_t)TIM_CCMR2_IC3F)));\r
2772   tmpccmr2 |= (uint16_t)(TIM_ICSelection | (uint16_t)(TIM_ICFilter << (uint16_t)4));\r
2773   /* Select the Polarity and set the CC3E Bit */\r
2774   tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC3P | TIM_CCER_CC3NP));\r
2775   tmpccer |= (uint16_t)(tmp | (uint16_t)TIM_CCER_CC3E);\r
2776   /* Write to TIMx CCMR2 and CCER registers */\r
2777   TIMx->CCMR2 = tmpccmr2;\r
2778   TIMx->CCER = tmpccer;\r
2779 }\r
2780 \r
2781 /**\r
2782   * @brief  Configure the TI4 as Input.\r
2783   * @param  TIMx: where x can be 2, 3 or 4 to select the TIM peripheral.\r
2784   * @param  TIM_ICPolarity : The Input Polarity.\r
2785   *   This parameter can be one of the following values:\r
2786   *     @arg TIM_ICPolarity_Rising\r
2787   *     @arg TIM_ICPolarity_Falling\r
2788   * @param  TIM_ICSelection: specifies the input to be used.\r
2789   *   This parameter can be one of the following values:\r
2790   *     @arg TIM_ICSelection_DirectTI: TIM Input 4 is selected to be connected to IC4.\r
2791   *     @arg TIM_ICSelection_IndirectTI: TIM Input 4 is selected to be connected to IC3.\r
2792   *     @arg TIM_ICSelection_TRC: TIM Input 4 is selected to be connected to TRC.\r
2793   * @param  TIM_ICFilter: Specifies the Input Capture Filter.\r
2794   *   This parameter must be a value between 0x00 and 0x0F.\r
2795   * @retval None\r
2796   */\r
2797 static void TI4_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,\r
2798                        uint16_t TIM_ICFilter)\r
2799 {\r
2800   uint16_t tmpccmr2 = 0, tmpccer = 0, tmp = 0;\r
2801   \r
2802   /* Disable the Channel 4: Reset the CC4E Bit */\r
2803   TIMx->CCER &= (uint16_t)~((uint16_t)TIM_CCER_CC4E);\r
2804   tmpccmr2 = TIMx->CCMR2;\r
2805   tmpccer = TIMx->CCER;\r
2806   tmp = (uint16_t)(TIM_ICPolarity << 12);\r
2807   /* Select the Input and set the filter */\r
2808   tmpccmr2 &= (uint16_t)((uint16_t)(~(uint16_t)TIM_CCMR2_CC4S) & ((uint16_t)~((uint16_t)TIM_CCMR2_IC4F)));\r
2809   tmpccmr2 |= (uint16_t)(TIM_ICSelection << 8);\r
2810   tmpccmr2 |= (uint16_t)(TIM_ICFilter << 12);\r
2811 \r
2812   /* Select the Polarity and set the CC4E Bit */\r
2813   tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC4P | TIM_CCER_CC4NP));\r
2814   tmpccer |= (uint16_t)(tmp | (uint16_t)TIM_CCER_CC4E);\r
2815   /* Write to TIMx CCMR2 and CCER registers */\r
2816   TIMx->CCMR2 = tmpccmr2;\r
2817   TIMx->CCER = tmpccer ;\r
2818 }\r
2819 \r
2820 /**\r
2821   * @}\r
2822   */\r
2823 \r
2824 /**\r
2825   * @}\r
2826   */\r
2827 \r
2828 /**\r
2829   * @}\r
2830   */\r
2831 \r
2832 /******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/\r