STM32L4xx_HAL_Driver  1.14.0
stm32l4xx_hal_usart_ex.c
Go to the documentation of this file.
1 
42 /* Includes ------------------------------------------------------------------*/
43 #include "stm32l4xx_hal.h"
44 
54 #ifdef HAL_USART_MODULE_ENABLED
55 
56 /* Private typedef -----------------------------------------------------------*/
57 #if defined(USART_CR1_FIFOEN)
58 /* UART RX FIFO depth */
59 #define RX_FIFO_DEPTH 8U
60 
61 /* UART TX FIFO depth */
62 #define TX_FIFO_DEPTH 8U
63 
64 #endif /* USART_CR1_FIFOEN */
65 /* Private define ------------------------------------------------------------*/
66 /* Private macros ------------------------------------------------------------*/
67 /* Private variables ---------------------------------------------------------*/
68 /* Private function prototypes -----------------------------------------------*/
69 #if defined(USART_CR1_FIFOEN)
70 
77 #endif /* USART_CR1_FIFOEN */
78 
79 /* Exported functions --------------------------------------------------------*/
80 
102 #if defined(USART_CR1_FIFOEN)
103 
109 {
110  /* Prevent unused argument(s) compilation warning */
111  UNUSED(husart);
112 
113  /* NOTE : This function should not be modified, when the callback is needed,
114  the HAL_USARTEx_RxFifoFullCallback can be implemented in the user file.
115  */
116 }
117 
124 {
125  /* Prevent unused argument(s) compilation warning */
126  UNUSED(husart);
127 
128  /* NOTE : This function should not be modified, when the callback is needed,
129  the HAL_USARTEx_TxFifoEmptyCallback can be implemented in the user file.
130  */
131 }
132 #endif /* USART_CR1_FIFOEN */
133 
159 #if defined(USART_CR2_SLVEN)
160 
176 {
177  uint32_t tmpcr1;
178 
179  /* Check parameters */
180  assert_param(IS_UART_SPI_SLAVE_INSTANCE(husart->Instance));
181 
182  /* Process Locked */
183  __HAL_LOCK(husart);
184 
185  husart->State = HAL_USART_STATE_BUSY;
186 
187  /* Save actual USART configuration */
188  tmpcr1 = READ_REG(husart->Instance->CR1);
189 
190  /* Disable USART */
191  __HAL_USART_DISABLE(husart);
192 
193  /* In SPI slave mode mode, the following bits must be kept cleared:
194  - LINEN and CLKEN bit in the USART_CR2 register
195  - HDSEL, SCEN and IREN bits in the USART_CR3 register.*/
196  CLEAR_BIT(husart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN));
197  CLEAR_BIT(husart->Instance->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN));
198 
199  /* Enable SPI slave mode */
200  SET_BIT(husart->Instance->CR2, USART_CR2_SLVEN);
201 
202  /* Restore USART configuration */
203  WRITE_REG(husart->Instance->CR1, tmpcr1);
204 
205  husart->SlaveMode = USART_SLAVEMODE_ENABLE;
206 
207  husart->State = HAL_USART_STATE_READY;
208 
209  /* Enable USART */
210  __HAL_USART_ENABLE(husart);
211 
212  /* Process Unlocked */
213  __HAL_UNLOCK(husart);
214 
215  return HAL_OK;
216 }
217 
224 {
225  uint32_t tmpcr1;
226 
227  /* Check parameters */
228  assert_param(IS_UART_SPI_SLAVE_INSTANCE(husart->Instance));
229 
230  /* Process Locked */
231  __HAL_LOCK(husart);
232 
233  husart->State = HAL_USART_STATE_BUSY;
234 
235  /* Save actual USART configuration */
236  tmpcr1 = READ_REG(husart->Instance->CR1);
237 
238  /* Disable USART */
239  __HAL_USART_DISABLE(husart);
240 
241  /* Disable SPI slave mode */
242  CLEAR_BIT(husart->Instance->CR2, USART_CR2_SLVEN);
243 
244  /* Restore USART configuration */
245  WRITE_REG(husart->Instance->CR1, tmpcr1);
246 
247  husart->SlaveMode = USART_SLAVEMODE_ENABLE;
248 
249  husart->State = HAL_USART_STATE_READY;
250 
251  /* Process Unlocked */
252  __HAL_UNLOCK(husart);
253 
254  return HAL_OK;
255 }
256 
271 HAL_StatusTypeDef HAL_USARTEx_ConfigNSS(USART_HandleTypeDef *husart, uint32_t NSSConfig)
272 {
273  uint32_t tmpcr1;
274 
275  /* Check parameters */
276  assert_param(IS_UART_SPI_SLAVE_INSTANCE(husart->Instance));
277  assert_param(IS_USART_NSS(NSSConfig));
278 
279  /* Process Locked */
280  __HAL_LOCK(husart);
281 
282  husart->State = HAL_USART_STATE_BUSY;
283 
284  /* Save actual USART configuration */
285  tmpcr1 = READ_REG(husart->Instance->CR1);
286 
287  /* Disable USART */
288  __HAL_USART_DISABLE(husart);
289 
290  /* Program DIS_NSS bit in the USART_CR2 register */
291  MODIFY_REG(husart->Instance->CR2, USART_CR2_DIS_NSS, NSSConfig);
292 
293  /* Restore USART configuration */
294  WRITE_REG(husart->Instance->CR1, tmpcr1);
295 
296  husart->State = HAL_USART_STATE_READY;
297 
298  /* Process Unlocked */
299  __HAL_UNLOCK(husart);
300 
301  return HAL_OK;
302 }
303 #endif /* USART_CR2_SLVEN */
304 
305 #if defined(USART_CR1_FIFOEN)
306 
312 {
313  uint32_t tmpcr1;
314 
315  /* Check parameters */
316  assert_param(IS_UART_FIFO_INSTANCE(husart->Instance));
317 
318  /* Process Locked */
319  __HAL_LOCK(husart);
320 
321  husart->State = HAL_USART_STATE_BUSY;
322 
323  /* Save actual USART configuration */
324  tmpcr1 = READ_REG(husart->Instance->CR1);
325 
326  /* Disable USART */
327  __HAL_USART_DISABLE(husart);
328 
329  /* Enable FIFO mode */
330  SET_BIT(tmpcr1, USART_CR1_FIFOEN);
331  husart->FifoMode = USART_FIFOMODE_ENABLE;
332 
333  /* Restore USART configuration */
334  WRITE_REG(husart->Instance->CR1, tmpcr1);
335 
336  /* Determine the number of data to process during RX/TX ISR execution */
338 
339  husart->State = HAL_USART_STATE_READY;
340 
341  /* Process Unlocked */
342  __HAL_UNLOCK(husart);
343 
344  return HAL_OK;
345 }
346 
353 {
354  uint32_t tmpcr1;
355 
356  /* Check parameters */
357  assert_param(IS_UART_FIFO_INSTANCE(husart->Instance));
358 
359  /* Process Locked */
360  __HAL_LOCK(husart);
361 
362  husart->State = HAL_USART_STATE_BUSY;
363 
364  /* Save actual USART configuration */
365  tmpcr1 = READ_REG(husart->Instance->CR1);
366 
367  /* Disable USART */
368  __HAL_USART_DISABLE(husart);
369 
370  /* Enable FIFO mode */
371  CLEAR_BIT(tmpcr1, USART_CR1_FIFOEN);
372  husart->FifoMode = USART_FIFOMODE_DISABLE;
373 
374  /* Restore USART configuration */
375  WRITE_REG(husart->Instance->CR1, tmpcr1);
376 
377  husart->State = HAL_USART_STATE_READY;
378 
379  /* Process Unlocked */
380  __HAL_UNLOCK(husart);
381 
382  return HAL_OK;
383 }
384 
398 HAL_StatusTypeDef HAL_USARTEx_SetTxFifoThreshold(USART_HandleTypeDef *husart, uint32_t Threshold)
399 {
400  uint32_t tmpcr1;
401 
402  /* Check parameters */
403  assert_param(IS_UART_FIFO_INSTANCE(husart->Instance));
404  assert_param(IS_USART_TXFIFO_THRESHOLD(Threshold));
405 
406  /* Process Locked */
407  __HAL_LOCK(husart);
408 
409  husart->State = HAL_USART_STATE_BUSY;
410 
411  /* Save actual USART configuration */
412  tmpcr1 = READ_REG(husart->Instance->CR1);
413 
414  /* Disable USART */
415  __HAL_USART_DISABLE(husart);
416 
417  /* Update TX threshold configuration */
418  MODIFY_REG(husart->Instance->CR3, USART_CR3_TXFTCFG, Threshold);
419 
420  /* Determine the number of data to process during RX/TX ISR execution */
422 
423  /* Restore USART configuration */
424  WRITE_REG(husart->Instance->CR1, tmpcr1);
425 
426  husart->State = HAL_USART_STATE_READY;
427 
428  /* Process Unlocked */
429  __HAL_UNLOCK(husart);
430 
431  return HAL_OK;
432 }
433 
447 HAL_StatusTypeDef HAL_USARTEx_SetRxFifoThreshold(USART_HandleTypeDef *husart, uint32_t Threshold)
448 {
449  uint32_t tmpcr1;
450 
451  /* Check the parameters */
452  assert_param(IS_UART_FIFO_INSTANCE(husart->Instance));
453  assert_param(IS_USART_RXFIFO_THRESHOLD(Threshold));
454 
455  /* Process Locked */
456  __HAL_LOCK(husart);
457 
458  husart->State = HAL_USART_STATE_BUSY;
459 
460  /* Save actual USART configuration */
461  tmpcr1 = READ_REG(husart->Instance->CR1);
462 
463  /* Disable USART */
464  __HAL_USART_DISABLE(husart);
465 
466  /* Update RX threshold configuration */
467  MODIFY_REG(husart->Instance->CR3, USART_CR3_RXFTCFG, Threshold);
468 
469  /* Determine the number of data to process during RX/TX ISR execution */
471 
472  /* Restore USART configuration */
473  WRITE_REG(husart->Instance->CR1, tmpcr1);
474 
475  husart->State = HAL_USART_STATE_READY;
476 
477  /* Process Unlocked */
478  __HAL_UNLOCK(husart);
479 
480  return HAL_OK;
481 }
482 #endif /* USART_CR1_FIFOEN */
483 
496 #if defined(USART_CR1_FIFOEN)
497 
505 {
506  uint8_t rx_fifo_depth;
507  uint8_t tx_fifo_depth;
508  uint8_t rx_fifo_threshold;
509  uint8_t tx_fifo_threshold;
510  /* 2 0U/1U added for MISRAC2012-Rule-18.1_b and MISRAC2012-Rule-18.1_d */
511  uint8_t numerator[] = {1U, 1U, 1U, 3U, 7U, 1U, 0U, 0U};
512  uint8_t denominator[] = {8U, 4U, 2U, 4U, 8U, 1U, 1U, 1U};
513 
514  if (husart->FifoMode == USART_FIFOMODE_DISABLE)
515  {
516  husart->NbTxDataToProcess = 1U;
517  husart->NbRxDataToProcess = 1U;
518  }
519  else
520  {
521  rx_fifo_depth = RX_FIFO_DEPTH;
522  tx_fifo_depth = TX_FIFO_DEPTH;
523  rx_fifo_threshold = (uint8_t)((READ_BIT(husart->Instance->CR3, USART_CR3_RXFTCFG) >> USART_CR3_RXFTCFG_Pos) & 0xFFU);
524  tx_fifo_threshold = (uint8_t)((READ_BIT(husart->Instance->CR3, USART_CR3_TXFTCFG) >> USART_CR3_TXFTCFG_Pos) & 0xFFU);
525  husart->NbTxDataToProcess = ((uint16_t)tx_fifo_depth * numerator[tx_fifo_threshold]) / (uint16_t)denominator[tx_fifo_threshold];
526  husart->NbRxDataToProcess = ((uint16_t)rx_fifo_depth * numerator[rx_fifo_threshold]) / (uint16_t)denominator[rx_fifo_threshold];
527  }
528 }
529 #endif /* USART_CR1_FIFOEN */
530 
534 #endif /* HAL_USART_MODULE_ENABLED */
535 
544 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
HAL_StatusTypeDef HAL_USARTEx_DisableSlaveMode(USART_HandleTypeDef *husart)
Disable the SPI slave mode.
__IO HAL_USART_StateTypeDef State
static void USARTEx_SetNbDataToProcess(USART_HandleTypeDef *husart)
Calculate the number of data to process in RX/TX ISR.
HAL_StatusTypeDef HAL_USARTEx_SetTxFifoThreshold(USART_HandleTypeDef *husart, uint32_t Threshold)
Set the TXFIFO threshold.
This file contains all the functions prototypes for the HAL module driver.
HAL_StatusTypeDef HAL_USARTEx_ConfigNSS(USART_HandleTypeDef *husart, uint32_t NSSConfig)
Configure the Slave Select input pin (NSS).
HAL_StatusTypeDef HAL_USARTEx_EnableSlaveMode(USART_HandleTypeDef *husart)
Enable the SPI slave mode.
HAL_StatusTypeDef HAL_USARTEx_DisableFifoMode(USART_HandleTypeDef *husart)
Disable the FIFO mode.
void HAL_USARTEx_TxFifoEmptyCallback(USART_HandleTypeDef *husart)
USART TX Fifo empty callback.
__HAL_UNLOCK(hrtc)
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
__HAL_LOCK(hrtc)
return HAL_OK
USART handle Structure definition.
MODIFY_REG(hrtc->Instance->CR, RTC_CR_WUCKSEL,(uint32_t) WakeUpClock)
HAL_StatusTypeDef HAL_USARTEx_EnableFifoMode(USART_HandleTypeDef *husart)
Enable the FIFO mode.
void HAL_USARTEx_RxFifoFullCallback(USART_HandleTypeDef *husart)
USART RX Fifo full callback.
HAL_StatusTypeDef HAL_USARTEx_SetRxFifoThreshold(USART_HandleTypeDef *husart, uint32_t Threshold)
Set the RXFIFO threshold.
assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock))