Subversion Repositories DashDisplay

Rev

Rev 61 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
56 mjames 1
/**
2
  ******************************************************************************
3
  * @file    stm32l1xx_ll_usart.c
4
  * @author  MCD Application Team
5
  * @brief   USART LL module driver.
6
  ******************************************************************************
7
  * @attention
8
  *
9
  * <h2><center>&copy; Copyright (c) 2016 STMicroelectronics.
10
  * All rights reserved.</center></h2>
11
  *
12
  * This software component is licensed by ST under BSD 3-Clause license,
13
  * the "License"; You may not use this file except in compliance with the
14
  * License. You may obtain a copy of the License at:
15
  *                        opensource.org/licenses/BSD-3-Clause
16
  *
17
  ******************************************************************************
18
  */
19
 
20
#if defined(USE_FULL_LL_DRIVER)
21
 
22
/* Includes ------------------------------------------------------------------*/
23
#include "stm32l1xx_ll_usart.h"
24
#include "stm32l1xx_ll_rcc.h"
25
#include "stm32l1xx_ll_bus.h"
26
#ifdef  USE_FULL_ASSERT
27
#include "stm32_assert.h"
28
#else
29
#define assert_param(expr) ((void)0U)
30
#endif
31
 
32
/** @addtogroup STM32L1xx_LL_Driver
33
  * @{
34
  */
35
 
36
#if defined (USART1) || defined (USART2) || defined (USART3) || defined (UART4) || defined (UART5)
37
 
38
/** @addtogroup USART_LL
39
  * @{
40
  */
41
 
42
/* Private types -------------------------------------------------------------*/
43
/* Private variables ---------------------------------------------------------*/
44
/* Private constants ---------------------------------------------------------*/
45
/** @addtogroup USART_LL_Private_Constants
46
  * @{
47
  */
48
 
49
/**
50
  * @}
51
  */
52
 
53
 
54
/* Private macros ------------------------------------------------------------*/
55
/** @addtogroup USART_LL_Private_Macros
56
  * @{
57
  */
58
 
59
/* __BAUDRATE__ The maximum Baud Rate is derived from the maximum clock available
60
 *              divided by the smallest oversampling used on the USART (i.e. 8)    */
61
#define IS_LL_USART_BAUDRATE(__BAUDRATE__) ((__BAUDRATE__) <= 4000000U)
62
 
63
/* __VALUE__ In case of oversampling by 16 and 8, BRR content must be greater than or equal to 16d. */
64
#define IS_LL_USART_BRR_MIN(__VALUE__) ((__VALUE__) >= 16U)
65
 
66
/* __VALUE__ BRR content must be lower than or equal to 0xFFFF. */
67
#define IS_LL_USART_BRR_MAX(__VALUE__) ((__VALUE__) <= 0x0000FFFFU)
68
 
69
#define IS_LL_USART_DIRECTION(__VALUE__) (((__VALUE__) == LL_USART_DIRECTION_NONE) \
70
                                       || ((__VALUE__) == LL_USART_DIRECTION_RX) \
71
                                       || ((__VALUE__) == LL_USART_DIRECTION_TX) \
72
                                       || ((__VALUE__) == LL_USART_DIRECTION_TX_RX))
73
 
74
#define IS_LL_USART_PARITY(__VALUE__) (((__VALUE__) == LL_USART_PARITY_NONE) \
75
                                    || ((__VALUE__) == LL_USART_PARITY_EVEN) \
76
                                    || ((__VALUE__) == LL_USART_PARITY_ODD))
77
 
78
#define IS_LL_USART_DATAWIDTH(__VALUE__) (((__VALUE__) == LL_USART_DATAWIDTH_8B) \
79
                                       || ((__VALUE__) == LL_USART_DATAWIDTH_9B))
80
 
81
#define IS_LL_USART_OVERSAMPLING(__VALUE__) (((__VALUE__) == LL_USART_OVERSAMPLING_16) \
82
                                          || ((__VALUE__) == LL_USART_OVERSAMPLING_8))
83
 
84
#define IS_LL_USART_LASTBITCLKOUTPUT(__VALUE__) (((__VALUE__) == LL_USART_LASTCLKPULSE_NO_OUTPUT) \
85
                                              || ((__VALUE__) == LL_USART_LASTCLKPULSE_OUTPUT))
86
 
87
#define IS_LL_USART_CLOCKPHASE(__VALUE__) (((__VALUE__) == LL_USART_PHASE_1EDGE) \
88
                                        || ((__VALUE__) == LL_USART_PHASE_2EDGE))
89
 
90
#define IS_LL_USART_CLOCKPOLARITY(__VALUE__) (((__VALUE__) == LL_USART_POLARITY_LOW) \
91
                                           || ((__VALUE__) == LL_USART_POLARITY_HIGH))
92
 
93
#define IS_LL_USART_CLOCKOUTPUT(__VALUE__) (((__VALUE__) == LL_USART_CLOCK_DISABLE) \
94
                                         || ((__VALUE__) == LL_USART_CLOCK_ENABLE))
95
 
96
#define IS_LL_USART_STOPBITS(__VALUE__) (((__VALUE__) == LL_USART_STOPBITS_0_5) \
97
                                      || ((__VALUE__) == LL_USART_STOPBITS_1) \
98
                                      || ((__VALUE__) == LL_USART_STOPBITS_1_5) \
99
                                      || ((__VALUE__) == LL_USART_STOPBITS_2))
100
 
101
#define IS_LL_USART_HWCONTROL(__VALUE__) (((__VALUE__) == LL_USART_HWCONTROL_NONE) \
102
                                       || ((__VALUE__) == LL_USART_HWCONTROL_RTS) \
103
                                       || ((__VALUE__) == LL_USART_HWCONTROL_CTS) \
104
                                       || ((__VALUE__) == LL_USART_HWCONTROL_RTS_CTS))
105
 
106
/**
107
  * @}
108
  */
109
 
110
/* Private function prototypes -----------------------------------------------*/
111
 
112
/* Exported functions --------------------------------------------------------*/
113
/** @addtogroup USART_LL_Exported_Functions
114
  * @{
115
  */
116
 
117
/** @addtogroup USART_LL_EF_Init
118
  * @{
119
  */
120
 
121
/**
122
  * @brief  De-initialize USART registers (Registers restored to their default values).
123
  * @param  USARTx USART Instance
124
  * @retval An ErrorStatus enumeration value:
125
  *          - SUCCESS: USART registers are de-initialized
126
  *          - ERROR: USART registers are not de-initialized
127
  */
128
ErrorStatus LL_USART_DeInit(USART_TypeDef *USARTx)
129
{
130
  ErrorStatus status = SUCCESS;
131
 
132
  /* Check the parameters */
133
  assert_param(IS_UART_INSTANCE(USARTx));
134
 
135
  if (USARTx == USART1)
136
  {
137
    /* Force reset of USART clock */
138
    LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_USART1);
139
 
140
    /* Release reset of USART clock */
141
    LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_USART1);
142
  }
143
  else if (USARTx == USART2)
144
  {
145
    /* Force reset of USART clock */
146
    LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_USART2);
147
 
148
    /* Release reset of USART clock */
149
    LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_USART2);
150
  }
151
  else if (USARTx == USART3)
152
  {
153
    /* Force reset of USART clock */
154
    LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_USART3);
155
 
156
    /* Release reset of USART clock */
157
    LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_USART3);
158
  }
159
#if defined(UART4)
160
  else if (USARTx == UART4)
161
  {
162
    /* Force reset of UART clock */
163
    LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_UART4);
164
 
165
    /* Release reset of UART clock */
166
    LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_UART4);
167
  }
168
#endif /* UART4 */
169
#if defined(UART5)
170
  else if (USARTx == UART5)
171
  {
172
    /* Force reset of UART clock */
173
    LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_UART5);
174
 
175
    /* Release reset of UART clock */
176
    LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_UART5);
177
  }
178
#endif /* UART5 */
179
  else
180
  {
181
    status = ERROR;
182
  }
183
 
184
  return (status);
185
}
186
 
187
/**
188
  * @brief  Initialize USART registers according to the specified
189
  *         parameters in USART_InitStruct.
190
  * @note   As some bits in USART configuration registers can only be written when the USART is disabled (USART_CR1_UE bit =0),
191
  *         USART IP should be in disabled state prior calling this function. Otherwise, ERROR result will be returned.
192
  * @note   Baud rate value stored in USART_InitStruct BaudRate field, should be valid (different from 0).
193
  * @param  USARTx USART Instance
194
  * @param  USART_InitStruct pointer to a LL_USART_InitTypeDef structure
195
  *         that contains the configuration information for the specified USART peripheral.
196
  * @retval An ErrorStatus enumeration value:
197
  *          - SUCCESS: USART registers are initialized according to USART_InitStruct content
198
  *          - ERROR: Problem occurred during USART Registers initialization
199
  */
200
ErrorStatus LL_USART_Init(USART_TypeDef *USARTx, LL_USART_InitTypeDef *USART_InitStruct)
201
{
202
  ErrorStatus status = ERROR;
203
  uint32_t periphclk = LL_RCC_PERIPH_FREQUENCY_NO;
204
  LL_RCC_ClocksTypeDef rcc_clocks;
205
 
206
  /* Check the parameters */
207
  assert_param(IS_UART_INSTANCE(USARTx));
208
  assert_param(IS_LL_USART_BAUDRATE(USART_InitStruct->BaudRate));
209
  assert_param(IS_LL_USART_DATAWIDTH(USART_InitStruct->DataWidth));
210
  assert_param(IS_LL_USART_STOPBITS(USART_InitStruct->StopBits));
211
  assert_param(IS_LL_USART_PARITY(USART_InitStruct->Parity));
212
  assert_param(IS_LL_USART_DIRECTION(USART_InitStruct->TransferDirection));
213
  assert_param(IS_LL_USART_HWCONTROL(USART_InitStruct->HardwareFlowControl));
214
  assert_param(IS_LL_USART_OVERSAMPLING(USART_InitStruct->OverSampling));
215
 
216
  /* USART needs to be in disabled state, in order to be able to configure some bits in
217
     CRx registers */
218
  if (LL_USART_IsEnabled(USARTx) == 0U)
219
  {
220
    /*---------------------------- USART CR1 Configuration -----------------------
221
     * Configure USARTx CR1 (USART Word Length, Parity, Mode and Oversampling bits) with parameters:
222
     * - DataWidth:          USART_CR1_M bits according to USART_InitStruct->DataWidth value
223
     * - Parity:             USART_CR1_PCE, USART_CR1_PS bits according to USART_InitStruct->Parity value
224
     * - TransferDirection:  USART_CR1_TE, USART_CR1_RE bits according to USART_InitStruct->TransferDirection value
225
     * - Oversampling:       USART_CR1_OVER8 bit according to USART_InitStruct->OverSampling value.
226
     */
227
    MODIFY_REG(USARTx->CR1,
228
               (USART_CR1_M | USART_CR1_PCE | USART_CR1_PS |
229
                USART_CR1_TE | USART_CR1_RE | USART_CR1_OVER8),
230
               (USART_InitStruct->DataWidth | USART_InitStruct->Parity |
231
                USART_InitStruct->TransferDirection | USART_InitStruct->OverSampling));
232
 
233
    /*---------------------------- USART CR2 Configuration -----------------------
234
     * Configure USARTx CR2 (Stop bits) with parameters:
235
     * - Stop Bits:          USART_CR2_STOP bits according to USART_InitStruct->StopBits value.
236
     * - CLKEN, CPOL, CPHA and LBCL bits are to be configured using LL_USART_ClockInit().
237
     */
238
    LL_USART_SetStopBitsLength(USARTx, USART_InitStruct->StopBits);
239
 
240
    /*---------------------------- USART CR3 Configuration -----------------------
241
     * Configure USARTx CR3 (Hardware Flow Control) with parameters:
242
     * - HardwareFlowControl: USART_CR3_RTSE, USART_CR3_CTSE bits according to USART_InitStruct->HardwareFlowControl value.
243
     */
244
    LL_USART_SetHWFlowCtrl(USARTx, USART_InitStruct->HardwareFlowControl);
245
 
246
    /*---------------------------- USART BRR Configuration -----------------------
247
     * Retrieve Clock frequency used for USART Peripheral
248
     */
249
    LL_RCC_GetSystemClocksFreq(&rcc_clocks);
250
    if (USARTx == USART1)
251
    {
252
      periphclk = rcc_clocks.PCLK2_Frequency;
253
    }
254
    else if (USARTx == USART2)
255
    {
256
      periphclk = rcc_clocks.PCLK1_Frequency;
257
    }
258
    else if (USARTx == USART3)
259
    {
260
      periphclk = rcc_clocks.PCLK1_Frequency;
261
    }
262
#if defined(UART4)
263
    else if (USARTx == UART4)
264
    {
265
      periphclk = rcc_clocks.PCLK1_Frequency;
266
    }
267
#endif /* UART4 */
268
#if defined(UART5)
269
    else if (USARTx == UART5)
270
    {
271
      periphclk = rcc_clocks.PCLK1_Frequency;
272
    }
273
#endif /* UART5 */
274
    else
275
    {
276
      /* Nothing to do, as error code is already assigned to ERROR value */
277
    }
278
 
279
    /* Configure the USART Baud Rate :
280
       - valid baud rate value (different from 0) is required
281
       - Peripheral clock as returned by RCC service, should be valid (different from 0).
282
    */
283
    if ((periphclk != LL_RCC_PERIPH_FREQUENCY_NO)
284
        && (USART_InitStruct->BaudRate != 0U))
285
    {
286
      status = SUCCESS;
287
      LL_USART_SetBaudRate(USARTx,
288
                           periphclk,
289
                           USART_InitStruct->OverSampling,
290
                           USART_InitStruct->BaudRate);
291
 
292
      /* Check BRR is greater than or equal to 16d */
293
      assert_param(IS_LL_USART_BRR_MIN(USARTx->BRR));
294
 
295
      /* Check BRR is greater than or equal to 16d */
296
      assert_param(IS_LL_USART_BRR_MAX(USARTx->BRR));
297
    }
298
  }
299
  /* Endif (=> USART not in Disabled state => return ERROR) */
300
 
301
  return (status);
302
}
303
 
304
/**
305
  * @brief Set each @ref LL_USART_InitTypeDef field to default value.
306
  * @param USART_InitStruct Pointer to a @ref LL_USART_InitTypeDef structure
307
  *                         whose fields will be set to default values.
308
  * @retval None
309
  */
310
 
311
void LL_USART_StructInit(LL_USART_InitTypeDef *USART_InitStruct)
312
{
313
  /* Set USART_InitStruct fields to default values */
314
  USART_InitStruct->BaudRate            = 9600U;
315
  USART_InitStruct->DataWidth           = LL_USART_DATAWIDTH_8B;
316
  USART_InitStruct->StopBits            = LL_USART_STOPBITS_1;
317
  USART_InitStruct->Parity              = LL_USART_PARITY_NONE ;
318
  USART_InitStruct->TransferDirection   = LL_USART_DIRECTION_TX_RX;
319
  USART_InitStruct->HardwareFlowControl = LL_USART_HWCONTROL_NONE;
320
  USART_InitStruct->OverSampling        = LL_USART_OVERSAMPLING_16;
321
}
322
 
323
/**
324
  * @brief  Initialize USART Clock related settings according to the
325
  *         specified parameters in the USART_ClockInitStruct.
326
  * @note   As some bits in USART configuration registers can only be written when the USART is disabled (USART_CR1_UE bit =0),
327
  *         USART IP should be in disabled state prior calling this function. Otherwise, ERROR result will be returned.
328
  * @param  USARTx USART Instance
329
  * @param  USART_ClockInitStruct Pointer to a @ref LL_USART_ClockInitTypeDef structure
330
  *         that contains the Clock configuration information for the specified USART peripheral.
331
  * @retval An ErrorStatus enumeration value:
332
  *          - SUCCESS: USART registers related to Clock settings are initialized according to USART_ClockInitStruct content
333
  *          - ERROR: Problem occurred during USART Registers initialization
334
  */
335
ErrorStatus LL_USART_ClockInit(USART_TypeDef *USARTx, LL_USART_ClockInitTypeDef *USART_ClockInitStruct)
336
{
337
  ErrorStatus status = SUCCESS;
338
 
339
  /* Check USART Instance and Clock signal output parameters */
340
  assert_param(IS_UART_INSTANCE(USARTx));
341
  assert_param(IS_LL_USART_CLOCKOUTPUT(USART_ClockInitStruct->ClockOutput));
342
 
343
  /* USART needs to be in disabled state, in order to be able to configure some bits in
344
     CRx registers */
345
  if (LL_USART_IsEnabled(USARTx) == 0U)
346
  {
347
    /*---------------------------- USART CR2 Configuration -----------------------*/
348
    /* If Clock signal has to be output */
349
    if (USART_ClockInitStruct->ClockOutput == LL_USART_CLOCK_DISABLE)
350
    {
351
      /* Deactivate Clock signal delivery :
352
       * - Disable Clock Output:        USART_CR2_CLKEN cleared
353
       */
354
      LL_USART_DisableSCLKOutput(USARTx);
355
    }
356
    else
357
    {
358
      /* Ensure USART instance is USART capable */
359
      assert_param(IS_USART_INSTANCE(USARTx));
360
 
361
      /* Check clock related parameters */
362
      assert_param(IS_LL_USART_CLOCKPOLARITY(USART_ClockInitStruct->ClockPolarity));
363
      assert_param(IS_LL_USART_CLOCKPHASE(USART_ClockInitStruct->ClockPhase));
364
      assert_param(IS_LL_USART_LASTBITCLKOUTPUT(USART_ClockInitStruct->LastBitClockPulse));
365
 
366
      /*---------------------------- USART CR2 Configuration -----------------------
367
       * Configure USARTx CR2 (Clock signal related bits) with parameters:
368
       * - Enable Clock Output:         USART_CR2_CLKEN set
369
       * - Clock Polarity:              USART_CR2_CPOL bit according to USART_ClockInitStruct->ClockPolarity value
370
       * - Clock Phase:                 USART_CR2_CPHA bit according to USART_ClockInitStruct->ClockPhase value
371
       * - Last Bit Clock Pulse Output: USART_CR2_LBCL bit according to USART_ClockInitStruct->LastBitClockPulse value.
372
       */
373
      MODIFY_REG(USARTx->CR2,
374
                 USART_CR2_CLKEN | USART_CR2_CPHA | USART_CR2_CPOL | USART_CR2_LBCL,
375
                 USART_CR2_CLKEN | USART_ClockInitStruct->ClockPolarity |
376
                 USART_ClockInitStruct->ClockPhase | USART_ClockInitStruct->LastBitClockPulse);
377
    }
378
  }
379
  /* Else (USART not in Disabled state => return ERROR */
380
  else
381
  {
382
    status = ERROR;
383
  }
384
 
385
  return (status);
386
}
387
 
388
/**
389
  * @brief Set each field of a @ref LL_USART_ClockInitTypeDef type structure to default value.
390
  * @param USART_ClockInitStruct Pointer to a @ref LL_USART_ClockInitTypeDef structure
391
  *                              whose fields will be set to default values.
392
  * @retval None
393
  */
394
void LL_USART_ClockStructInit(LL_USART_ClockInitTypeDef *USART_ClockInitStruct)
395
{
396
  /* Set LL_USART_ClockInitStruct fields with default values */
397
  USART_ClockInitStruct->ClockOutput       = LL_USART_CLOCK_DISABLE;
398
  USART_ClockInitStruct->ClockPolarity     = LL_USART_POLARITY_LOW;            /* Not relevant when ClockOutput = LL_USART_CLOCK_DISABLE */
399
  USART_ClockInitStruct->ClockPhase        = LL_USART_PHASE_1EDGE;             /* Not relevant when ClockOutput = LL_USART_CLOCK_DISABLE */
400
  USART_ClockInitStruct->LastBitClockPulse = LL_USART_LASTCLKPULSE_NO_OUTPUT;  /* Not relevant when ClockOutput = LL_USART_CLOCK_DISABLE */
401
}
402
 
403
/**
404
  * @}
405
  */
406
 
407
/**
408
  * @}
409
  */
410
 
411
/**
412
  * @}
413
  */
414
 
415
#endif /* USART1 || USART2|| USART3 || UART4 || UART5 */
416
 
417
/**
418
  * @}
419
  */
420
 
421
#endif /* USE_FULL_LL_DRIVER */
422
 
423
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
424