Statistics
| Branch: | Tag: | Revision:

amiro-blt / Target / Demo / ARMCM4_STM32F405_Power_Management_GCC / Boot / lib / stdperiphlib / STM32F4xx_StdPeriph_Driver / src / stm32f4xx_tim.c @ 69661903

History | View | Annotate | Download (122 KB)

1
/**
2
  ******************************************************************************
3
  * @file    stm32f4xx_tim.c
4
  * @author  MCD Application Team
5
  * @version V1.1.0
6
  * @date    11-January-2013
7
  * @brief   This file provides firmware functions to manage the following 
8
  *          functionalities of the TIM peripheral:
9
  *            + TimeBase management
10
  *            + Output Compare management
11
  *            + Input Capture management
12
  *            + Advanced-control timers (TIM1 and TIM8) specific features  
13
  *            + Interrupts, DMA and flags management
14
  *            + Clocks management
15
  *            + Synchronization management
16
  *            + Specific interface management
17
  *            + Specific remapping management      
18
  *              
19
  @verbatim   
20
 ===============================================================================
21
                   #####  How to use this driver #####
22
 ===============================================================================
23
    [..]
24
    This driver provides functions to configure and program the TIM 
25
    of all STM32F4xx devices.
26
    These functions are split in 9 groups: 
27
     
28
      (#) TIM TimeBase management: this group includes all needed functions 
29
          to configure the TM Timebase unit:
30
        (++) Set/Get Prescaler
31
        (++) Set/Get Autoreload  
32
        (++) Counter modes configuration
33
        (++) Set Clock division  
34
        (++) Select the One Pulse mode
35
        (++) Update Request Configuration
36
        (++) Update Disable Configuration
37
        (++) Auto-Preload Configuration 
38
        (++) Enable/Disable the counter     
39
                   
40
      (#) TIM Output Compare management: this group includes all needed 
41
          functions to configure the Capture/Compare unit used in Output 
42
          compare mode: 
43
        (++) Configure each channel, independently, in Output Compare mode
44
        (++) Select the output compare modes
45
        (++) Select the Polarities of each channel
46
        (++) Set/Get the Capture/Compare register values
47
        (++) Select the Output Compare Fast mode 
48
        (++) Select the Output Compare Forced mode  
49
        (++) Output Compare-Preload Configuration 
50
        (++) Clear Output Compare Reference
51
        (++) Select the OCREF Clear signal
52
        (++) Enable/Disable the Capture/Compare Channels    
53
                     
54
      (#) TIM Input Capture management: this group includes all needed 
55
          functions to configure the Capture/Compare unit used in 
56
          Input Capture mode:
57
        (++) Configure each channel in input capture mode
58
        (++) Configure Channel1/2 in PWM Input mode
59
        (++) Set the Input Capture Prescaler
60
        (++) Get the Capture/Compare values      
61
                     
62
      (#) Advanced-control timers (TIM1 and TIM8) specific features
63
        (++) Configures the Break input, dead time, Lock level, the OSSI,
64
             the OSSR State and the AOE(automatic output enable)
65
        (++) Enable/Disable the TIM peripheral Main Outputs
66
        (++) Select the Commutation event
67
        (++) Set/Reset the Capture Compare Preload Control bit
68
                                
69
      (#) TIM interrupts, DMA and flags management
70
        (++) Enable/Disable interrupt sources
71
        (++) Get flags status
72
        (++) Clear flags/ Pending bits
73
        (++) Enable/Disable DMA requests 
74
        (++) Configure DMA burst mode
75
        (++) Select CaptureCompare DMA request  
76
                
77
      (#) TIM clocks management: this group includes all needed functions 
78
          to configure the clock controller unit:
79
        (++) Select internal/External clock
80
        (++) Select the external clock mode: ETR(Mode1/Mode2), TIx or ITRx
81
           
82
      (#) TIM synchronization management: this group includes all needed 
83
          functions to configure the Synchronization unit:
84
        (++) Select Input Trigger  
85
        (++) Select Output Trigger  
86
        (++) Select Master Slave Mode 
87
        (++) ETR Configuration when used as external trigger   
88
       
89
      (#) TIM specific interface management, this group includes all 
90
          needed functions to use the specific TIM interface:
91
        (++) Encoder Interface Configuration
92
        (++) Select Hall Sensor   
93
           
94
      (#) TIM specific remapping management includes the Remapping 
95
          configuration of specific timers               
96
     
97
  @endverbatim    
98
  ******************************************************************************
99
  * @attention
100
  *
101
  * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>
102
  *
103
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
104
  * You may not use this file except in compliance with the License.
105
  * You may obtain a copy of the License at:
106
  *
107
  *        http://www.st.com/software_license_agreement_liberty_v2
108
  *
109
  * Unless required by applicable law or agreed to in writing, software 
110
  * distributed under the License is distributed on an "AS IS" BASIS, 
111
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
112
  * See the License for the specific language governing permissions and
113
  * limitations under the License.
114
  *
115
  ******************************************************************************
116
  */
117

    
118
/* Includes ------------------------------------------------------------------*/
119
#include "stm32f4xx_tim.h"
120
#include "stm32f4xx_rcc.h"
121

    
122
/** @addtogroup STM32F4xx_StdPeriph_Driver
123
  * @{
124
  */
125

    
126
/** @defgroup TIM 
127
  * @brief TIM driver modules
128
  * @{
129
  */
130

    
131
/* Private typedef -----------------------------------------------------------*/
132
/* Private define ------------------------------------------------------------*/
133

    
134
/* ---------------------- TIM registers bit mask ------------------------ */
135
#define SMCR_ETR_MASK      ((uint16_t)0x00FF) 
136
#define CCMR_OFFSET        ((uint16_t)0x0018)
137
#define CCER_CCE_SET       ((uint16_t)0x0001)  
138
#define        CCER_CCNE_SET      ((uint16_t)0x0004) 
139
#define CCMR_OC13M_MASK    ((uint16_t)0xFF8F)
140
#define CCMR_OC24M_MASK    ((uint16_t)0x8FFF) 
141

    
142
/* Private macro -------------------------------------------------------------*/
143
/* Private variables ---------------------------------------------------------*/
144
/* Private function prototypes -----------------------------------------------*/
145
static void TI1_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,
146
                       uint16_t TIM_ICFilter);
147
static void TI2_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,
148
                       uint16_t TIM_ICFilter);
149
static void TI3_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,
150
                       uint16_t TIM_ICFilter);
151
static void TI4_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,
152
                       uint16_t TIM_ICFilter);
153

    
154
/* Private functions ---------------------------------------------------------*/
155

    
156
/** @defgroup TIM_Private_Functions
157
  * @{
158
  */
159

    
160
/** @defgroup TIM_Group1 TimeBase management functions
161
 *  @brief   TimeBase management functions 
162
 *
163
@verbatim   
164
 ===============================================================================
165
                     ##### TimeBase management functions #####
166
 ===============================================================================  
167
  
168
     
169
            ##### TIM Driver: how to use it in Timing(Time base) Mode #####
170
 ===============================================================================
171
    [..] 
172
    To use the Timer in Timing(Time base) mode, the following steps are mandatory:
173
       
174
      (#) Enable TIM clock using RCC_APBxPeriphClockCmd(RCC_APBxPeriph_TIMx, ENABLE) function
175
                    
176
      (#) Fill the TIM_TimeBaseInitStruct with the desired parameters.
177
       
178
      (#) Call TIM_TimeBaseInit(TIMx, &TIM_TimeBaseInitStruct) to configure the Time Base unit
179
          with the corresponding configuration
180
          
181
      (#) Enable the NVIC if you need to generate the update interrupt. 
182
          
183
      (#) Enable the corresponding interrupt using the function TIM_ITConfig(TIMx, TIM_IT_Update) 
184
       
185
      (#) Call the TIM_Cmd(ENABLE) function to enable the TIM counter.
186
             
187
       -@- All other functions can be used separately to modify, if needed,
188
           a specific feature of the Timer. 
189

190
@endverbatim
191
  * @{
192
  */
193
  
194
/**
195
  * @brief  Deinitializes the TIMx peripheral registers to their default reset values.
196
  * @param  TIMx: where x can be 1 to 14 to select the TIM peripheral.
197
  * @retval None
198

199
  */
200
void TIM_DeInit(TIM_TypeDef* TIMx)
201
{
202
  /* Check the parameters */
203
  assert_param(IS_TIM_ALL_PERIPH(TIMx)); 
204
 
205
  if (TIMx == TIM1)
206
  {
207
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1, ENABLE);
208
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1, DISABLE);  
209
  } 
210
  else if (TIMx == TIM2) 
211
  {     
212
    RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2, ENABLE);
213
    RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2, DISABLE);
214
  }  
215
  else if (TIMx == TIM3)
216
  { 
217
    RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3, ENABLE);
218
    RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3, DISABLE);
219
  }  
220
  else if (TIMx == TIM4)
221
  { 
222
    RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, ENABLE);
223
    RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, DISABLE);
224
  }  
225
  else if (TIMx == TIM5)
226
  {      
227
    RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM5, ENABLE);
228
    RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM5, DISABLE);
229
  }  
230
  else if (TIMx == TIM6)  
231
  {    
232
    RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM6, ENABLE);
233
    RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM6, DISABLE);
234
  }  
235
  else if (TIMx == TIM7)
236
  {      
237
    RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM7, ENABLE);
238
    RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM7, DISABLE);
239
  }  
240
  else if (TIMx == TIM8)
241
  {      
242
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM8, ENABLE);
243
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM8, DISABLE);  
244
  }  
245
  else if (TIMx == TIM9)
246
  {      
247
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM9, ENABLE);
248
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM9, DISABLE);  
249
   }  
250
  else if (TIMx == TIM10)
251
  {      
252
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM10, ENABLE);
253
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM10, DISABLE);  
254
  }  
255
  else if (TIMx == TIM11) 
256
  {     
257
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM11, ENABLE);
258
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM11, DISABLE);  
259
  }  
260
  else if (TIMx == TIM12)
261
  {      
262
    RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM12, ENABLE);
263
    RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM12, DISABLE);  
264
  }  
265
  else if (TIMx == TIM13) 
266
  {       
267
    RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM13, ENABLE);
268
    RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM13, DISABLE);  
269
  }  
270
  else
271
  { 
272
    if (TIMx == TIM14) 
273
    {     
274
      RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM14, ENABLE);
275
      RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM14, DISABLE); 
276
    }   
277
  }
278
}
279

    
280
/**
281
  * @brief  Initializes the TIMx Time Base Unit peripheral according to 
282
  *         the specified parameters in the TIM_TimeBaseInitStruct.
283
  * @param  TIMx: where x can be  1 to 14 to select the TIM peripheral.
284
  * @param  TIM_TimeBaseInitStruct: pointer to a TIM_TimeBaseInitTypeDef structure
285
  *         that contains the configuration information for the specified TIM peripheral.
286
  * @retval None
287
  */
288
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)
289
{
290
  uint16_t tmpcr1 = 0;
291

    
292
  /* Check the parameters */
293
  assert_param(IS_TIM_ALL_PERIPH(TIMx)); 
294
  assert_param(IS_TIM_COUNTER_MODE(TIM_TimeBaseInitStruct->TIM_CounterMode));
295
  assert_param(IS_TIM_CKD_DIV(TIM_TimeBaseInitStruct->TIM_ClockDivision));
296

    
297
  tmpcr1 = TIMx->CR1;  
298

    
299
  if((TIMx == TIM1) || (TIMx == TIM8)||
300
     (TIMx == TIM2) || (TIMx == TIM3)||
301
     (TIMx == TIM4) || (TIMx == TIM5)) 
302
  {
303
    /* Select the Counter Mode */
304
    tmpcr1 &= (uint16_t)(~(TIM_CR1_DIR | TIM_CR1_CMS));
305
    tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_CounterMode;
306
  }
307
 
308
  if((TIMx != TIM6) && (TIMx != TIM7))
309
  {
310
    /* Set the clock division */
311
    tmpcr1 &=  (uint16_t)(~TIM_CR1_CKD);
312
    tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_ClockDivision;
313
  }
314

    
315
  TIMx->CR1 = tmpcr1;
316

    
317
  /* Set the Autoreload value */
318
  TIMx->ARR = TIM_TimeBaseInitStruct->TIM_Period ;
319
 
320
  /* Set the Prescaler value */
321
  TIMx->PSC = TIM_TimeBaseInitStruct->TIM_Prescaler;
322
    
323
  if ((TIMx == TIM1) || (TIMx == TIM8))  
324
  {
325
    /* Set the Repetition Counter value */
326
    TIMx->RCR = TIM_TimeBaseInitStruct->TIM_RepetitionCounter;
327
  }
328

    
329
  /* Generate an update event to reload the Prescaler 
330
     and the repetition counter(only for TIM1 and TIM8) value immediatly */
331
  TIMx->EGR = TIM_PSCReloadMode_Immediate;          
332
}
333

    
334
/**
335
  * @brief  Fills each TIM_TimeBaseInitStruct member with its default value.
336
  * @param  TIM_TimeBaseInitStruct : pointer to a TIM_TimeBaseInitTypeDef
337
  *         structure which will be initialized.
338
  * @retval None
339
  */
340
void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)
341
{
342
  /* Set the default configuration */
343
  TIM_TimeBaseInitStruct->TIM_Period = 0xFFFFFFFF;
344
  TIM_TimeBaseInitStruct->TIM_Prescaler = 0x0000;
345
  TIM_TimeBaseInitStruct->TIM_ClockDivision = TIM_CKD_DIV1;
346
  TIM_TimeBaseInitStruct->TIM_CounterMode = TIM_CounterMode_Up;
347
  TIM_TimeBaseInitStruct->TIM_RepetitionCounter = 0x0000;
348
}
349

    
350
/**
351
  * @brief  Configures the TIMx Prescaler.
352
  * @param  TIMx: where x can be  1 to 14 to select the TIM peripheral.
353
  * @param  Prescaler: specifies the Prescaler Register value
354
  * @param  TIM_PSCReloadMode: specifies the TIM Prescaler Reload mode
355
  *          This parameter can be one of the following values:
356
  *            @arg TIM_PSCReloadMode_Update: Th