source: trunk/firmware/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_lpuart.c

Last change on this file was 6, checked in by f.jahn, 3 months ago
File size: 11.7 KB
Line 
1/**
2  ******************************************************************************
3  * @file    stm32g0xx_ll_lpuart.c
4  * @author  MCD Application Team
5  * @brief   LPUART LL module driver.
6  ******************************************************************************
7  * @attention
8  *
9  * <h2><center>&copy; Copyright (c) 2018 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#if defined(USE_FULL_LL_DRIVER)
20
21/* Includes ------------------------------------------------------------------*/
22#include "stm32g0xx_ll_lpuart.h"
23#include "stm32g0xx_ll_rcc.h"
24#include "stm32g0xx_ll_bus.h"
25#ifdef  USE_FULL_ASSERT
26#include "stm32_assert.h"
27#else
28#define assert_param(expr) ((void)0U)
29#endif
30
31/** @addtogroup STM32G0xx_LL_Driver
32  * @{
33  */
34
35#if defined (LPUART1)
36
37/** @addtogroup LPUART_LL
38  * @{
39  */
40
41/* Private types -------------------------------------------------------------*/
42/* Private variables ---------------------------------------------------------*/
43/* Private constants ---------------------------------------------------------*/
44/** @addtogroup LPUART_LL_Private_Constants
45  * @{
46  */
47
48/**
49  * @}
50  */
51
52
53/* Private macros ------------------------------------------------------------*/
54/** @addtogroup LPUART_LL_Private_Macros
55  * @{
56  */
57
58/* Check of parameters for configuration of LPUART registers                  */
59
60#define IS_LL_LPUART_PRESCALER(__VALUE__)  (((__VALUE__) == LL_LPUART_PRESCALER_DIV1) \
61                                        || ((__VALUE__) == LL_LPUART_PRESCALER_DIV2) \
62                                        || ((__VALUE__) == LL_LPUART_PRESCALER_DIV4) \
63                                        || ((__VALUE__) == LL_LPUART_PRESCALER_DIV6) \
64                                        || ((__VALUE__) == LL_LPUART_PRESCALER_DIV8) \
65                                        || ((__VALUE__) == LL_LPUART_PRESCALER_DIV10) \
66                                        || ((__VALUE__) == LL_LPUART_PRESCALER_DIV12) \
67                                        || ((__VALUE__) == LL_LPUART_PRESCALER_DIV16) \
68                                        || ((__VALUE__) == LL_LPUART_PRESCALER_DIV32) \
69                                        || ((__VALUE__) == LL_LPUART_PRESCALER_DIV64) \
70                                        || ((__VALUE__) == LL_LPUART_PRESCALER_DIV128) \
71                                        || ((__VALUE__) == LL_LPUART_PRESCALER_DIV256))
72
73/* __BAUDRATE__ Depending on constraints applicable for LPUART BRR register   */
74/*              value :                                                       */
75/*                - fck must be in the range [3 x baudrate, 4096 x baudrate]  */
76/*                - LPUART_BRR register value should be >= 0x300              */
77/*                - LPUART_BRR register value should be <= 0xFFFFF (20 bits)  */
78/*              Baudrate specified by the user should belong to [8, 21300000].*/
79#define IS_LL_LPUART_BAUDRATE(__BAUDRATE__) (((__BAUDRATE__) <= 21300000U) && ((__BAUDRATE__) >= 8U))
80
81/* __VALUE__ BRR content must be greater than or equal to 0x300. */
82#define IS_LL_LPUART_BRR_MIN(__VALUE__)   ((__VALUE__) >= 0x300U)
83
84/* __VALUE__ BRR content must be lower than or equal to 0xFFFFF. */
85#define IS_LL_LPUART_BRR_MAX(__VALUE__)   ((__VALUE__) <= 0x000FFFFFU)
86
87#define IS_LL_LPUART_DIRECTION(__VALUE__) (((__VALUE__) == LL_LPUART_DIRECTION_NONE) \
88                                        || ((__VALUE__) == LL_LPUART_DIRECTION_RX) \
89                                        || ((__VALUE__) == LL_LPUART_DIRECTION_TX) \
90                                        || ((__VALUE__) == LL_LPUART_DIRECTION_TX_RX))
91
92#define IS_LL_LPUART_PARITY(__VALUE__) (((__VALUE__) == LL_LPUART_PARITY_NONE) \
93                                     || ((__VALUE__) == LL_LPUART_PARITY_EVEN) \
94                                     || ((__VALUE__) == LL_LPUART_PARITY_ODD))
95
96#define IS_LL_LPUART_DATAWIDTH(__VALUE__) (((__VALUE__) == LL_LPUART_DATAWIDTH_7B) \
97                                        || ((__VALUE__) == LL_LPUART_DATAWIDTH_8B) \
98                                        || ((__VALUE__) == LL_LPUART_DATAWIDTH_9B))
99
100#define IS_LL_LPUART_STOPBITS(__VALUE__) (((__VALUE__) == LL_LPUART_STOPBITS_1) \
101                                       || ((__VALUE__) == LL_LPUART_STOPBITS_2))
102
103#define IS_LL_LPUART_HWCONTROL(__VALUE__) (((__VALUE__) == LL_LPUART_HWCONTROL_NONE) \
104                                       || ((__VALUE__) == LL_LPUART_HWCONTROL_RTS) \
105                                       || ((__VALUE__) == LL_LPUART_HWCONTROL_CTS) \
106                                       || ((__VALUE__) == LL_LPUART_HWCONTROL_RTS_CTS))
107
108/**
109  * @}
110  */
111
112/* Private function prototypes -----------------------------------------------*/
113
114/* Exported functions --------------------------------------------------------*/
115/** @addtogroup LPUART_LL_Exported_Functions
116  * @{
117  */
118
119/** @addtogroup LPUART_LL_EF_Init
120  * @{
121  */
122
123/**
124  * @brief  De-initialize LPUART registers (Registers restored to their default values).
125  * @param  LPUARTx LPUART Instance
126  * @retval An ErrorStatus enumeration value:
127  *          - SUCCESS: LPUART registers are de-initialized
128  *          - ERROR: not applicable
129  */
130ErrorStatus LL_LPUART_DeInit(USART_TypeDef *LPUARTx)
131{
132  ErrorStatus status = SUCCESS;
133
134  /* Check the parameters */
135  assert_param(IS_LPUART_INSTANCE(LPUARTx));
136
137  if (LPUARTx == LPUART1)
138  {
139    /* Force reset of LPUART peripheral */
140    LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_LPUART1);
141
142    /* Release reset of LPUART peripheral */
143    LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_LPUART1);
144  }
145  else
146  {
147    status = ERROR;
148  }
149
150  return (status);
151}
152
153/**
154  * @brief  Initialize LPUART registers according to the specified
155  *         parameters in LPUART_InitStruct.
156  * @note   As some bits in LPUART configuration registers can only be written when the LPUART is disabled (USART_CR1_UE bit =0),
157  *         LPUART Peripheral should be in disabled state prior calling this function. Otherwise, ERROR result will be returned.
158  * @note   Baud rate value stored in LPUART_InitStruct BaudRate field, should be valid (different from 0).
159  * @param  LPUARTx LPUART Instance
160  * @param  LPUART_InitStruct pointer to a @ref LL_LPUART_InitTypeDef structure
161  *         that contains the configuration information for the specified LPUART peripheral.
162  * @retval An ErrorStatus enumeration value:
163  *          - SUCCESS: LPUART registers are initialized according to LPUART_InitStruct content
164  *          - ERROR: Problem occurred during LPUART Registers initialization
165  */
166ErrorStatus LL_LPUART_Init(USART_TypeDef *LPUARTx, LL_LPUART_InitTypeDef *LPUART_InitStruct)
167{
168  ErrorStatus status = ERROR;
169  uint32_t periphclk;
170
171  /* Check the parameters */
172  assert_param(IS_LPUART_INSTANCE(LPUARTx));
173  assert_param(IS_LL_LPUART_PRESCALER(LPUART_InitStruct->PrescalerValue));
174  assert_param(IS_LL_LPUART_BAUDRATE(LPUART_InitStruct->BaudRate));
175  assert_param(IS_LL_LPUART_DATAWIDTH(LPUART_InitStruct->DataWidth));
176  assert_param(IS_LL_LPUART_STOPBITS(LPUART_InitStruct->StopBits));
177  assert_param(IS_LL_LPUART_PARITY(LPUART_InitStruct->Parity));
178  assert_param(IS_LL_LPUART_DIRECTION(LPUART_InitStruct->TransferDirection));
179  assert_param(IS_LL_LPUART_HWCONTROL(LPUART_InitStruct->HardwareFlowControl));
180
181  /* LPUART needs to be in disabled state, in order to be able to configure some bits in
182     CRx registers. Otherwise (LPUART not in Disabled state) => return ERROR */
183  if (LL_LPUART_IsEnabled(LPUARTx) == 0U)
184  {
185    /*---------------------------- LPUART CR1 Configuration -----------------------
186     * Configure LPUARTx CR1 (LPUART Word Length, Parity and Transfer Direction bits) with parameters:
187     * - DataWidth:          USART_CR1_M bits according to LPUART_InitStruct->DataWidth value
188     * - Parity:             USART_CR1_PCE, USART_CR1_PS bits according to LPUART_InitStruct->Parity value
189     * - TransferDirection:  USART_CR1_TE, USART_CR1_RE bits according to LPUART_InitStruct->TransferDirection value
190     */
191    MODIFY_REG(LPUARTx->CR1,
192               (USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | USART_CR1_TE | USART_CR1_RE),
193               (LPUART_InitStruct->DataWidth | LPUART_InitStruct->Parity | LPUART_InitStruct->TransferDirection));
194
195    /*---------------------------- LPUART CR2 Configuration -----------------------
196     * Configure LPUARTx CR2 (Stop bits) with parameters:
197     * - Stop Bits:          USART_CR2_STOP bits according to LPUART_InitStruct->StopBits value.
198     */
199    LL_LPUART_SetStopBitsLength(LPUARTx, LPUART_InitStruct->StopBits);
200
201    /*---------------------------- LPUART CR3 Configuration -----------------------
202     * Configure LPUARTx CR3 (Hardware Flow Control) with parameters:
203     * - HardwareFlowControl: USART_CR3_RTSE, USART_CR3_CTSE bits according to LPUART_InitStruct->HardwareFlowControl value.
204     */
205    LL_LPUART_SetHWFlowCtrl(LPUARTx, LPUART_InitStruct->HardwareFlowControl);
206
207    /*---------------------------- LPUART BRR Configuration -----------------------
208     * Retrieve Clock frequency used for LPUART Peripheral
209     */
210    periphclk = LL_RCC_GetLPUARTClockFreq(LL_RCC_LPUART1_CLKSOURCE);
211
212    /* Configure the LPUART Baud Rate :
213       - prescaler value is required
214       - valid baud rate value (different from 0) is required
215       - Peripheral clock as returned by RCC service, should be valid (different from 0).
216    */
217    if ((periphclk != LL_RCC_PERIPH_FREQUENCY_NO)
218        && (LPUART_InitStruct->BaudRate != 0U))
219    {
220      status = SUCCESS;
221      LL_LPUART_SetBaudRate(LPUARTx,
222                            periphclk,
223                            LPUART_InitStruct->PrescalerValue,
224                            LPUART_InitStruct->BaudRate);
225
226      /* Check BRR is greater than or equal to 0x300 */
227      assert_param(IS_LL_LPUART_BRR_MIN(LPUARTx->BRR));
228
229      /* Check BRR is lower than or equal to 0xFFFFF */
230      assert_param(IS_LL_LPUART_BRR_MAX(LPUARTx->BRR));
231    }
232
233    /*---------------------------- LPUART PRESC Configuration -----------------------
234     * Configure LPUARTx PRESC (Prescaler) with parameters:
235     * - PrescalerValue: LPUART_PRESC_PRESCALER bits according to LPUART_InitStruct->PrescalerValue value.
236     */
237    LL_LPUART_SetPrescaler(LPUARTx, LPUART_InitStruct->PrescalerValue);
238  }
239
240  return (status);
241}
242
243/**
244  * @brief Set each @ref LL_LPUART_InitTypeDef field to default value.
245  * @param LPUART_InitStruct pointer to a @ref LL_LPUART_InitTypeDef structure
246  *                          whose fields will be set to default values.
247  * @retval None
248  */
249
250void LL_LPUART_StructInit(LL_LPUART_InitTypeDef *LPUART_InitStruct)
251{
252  /* Set LPUART_InitStruct fields to default values */
253  LPUART_InitStruct->PrescalerValue      = LL_LPUART_PRESCALER_DIV1;
254  LPUART_InitStruct->BaudRate            = 9600U;
255  LPUART_InitStruct->DataWidth           = LL_LPUART_DATAWIDTH_8B;
256  LPUART_InitStruct->StopBits            = LL_LPUART_STOPBITS_1;
257  LPUART_InitStruct->Parity              = LL_LPUART_PARITY_NONE ;
258  LPUART_InitStruct->TransferDirection   = LL_LPUART_DIRECTION_TX_RX;
259  LPUART_InitStruct->HardwareFlowControl = LL_LPUART_HWCONTROL_NONE;
260}
261
262/**
263  * @}
264  */
265
266/**
267  * @}
268  */
269
270/**
271  * @}
272  */
273
274#endif /* defined (LPUART1) */
275
276/**
277  * @}
278  */
279
280#endif /* USE_FULL_LL_DRIVER */
281
282/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
283
Note: See TracBrowser for help on using the repository browser.