STM32L4xx_HAL_Driver  1.14.0
stm32l4xx_hal_uart.c
Go to the documentation of this file.
1 
156 /* Includes ------------------------------------------------------------------*/
157 #include "stm32l4xx_hal.h"
158 
168 #ifdef HAL_UART_MODULE_ENABLED
169 
170 /* Private typedef -----------------------------------------------------------*/
171 /* Private define ------------------------------------------------------------*/
175 #if defined(USART_CR1_FIFOEN)
176 #define USART_CR1_FIELDS ((uint32_t)(USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | \
177  USART_CR1_TE | USART_CR1_RE | USART_CR1_OVER8| \
178  USART_CR1_FIFOEN ))
179 #else
180 #define USART_CR1_FIELDS ((uint32_t)(USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | \
181  USART_CR1_TE | USART_CR1_RE | USART_CR1_OVER8 ))
182 #endif /* USART_CR1_FIFOEN */
183 
184 #if defined(USART_CR1_FIFOEN)
185 #define USART_CR3_FIELDS ((uint32_t)(USART_CR3_RTSE | USART_CR3_CTSE | USART_CR3_ONEBIT| \
186  USART_CR3_TXFTCFG | USART_CR3_RXFTCFG ))
187 #else
188 #define USART_CR3_FIELDS ((uint32_t)(USART_CR3_RTSE | USART_CR3_CTSE | USART_CR3_ONEBIT))
189 #endif /* USART_CR1_FIFOEN */
190 
191 #define LPUART_BRR_MIN 0x00000300U /* LPUART BRR minimum authorized value */
192 #define LPUART_BRR_MAX 0x000FFFFFU /* LPUART BRR maximum authorized value */
193 
194 #define UART_BRR_MIN 0x10U /* UART BRR minimum authorized value */
195 #define UART_BRR_MAX 0x0000FFFFU /* UART BRR maximum authorized value */
196 
201 /* Private macros ------------------------------------------------------------*/
202 /* Private variables ---------------------------------------------------------*/
203 /* Private function prototypes -----------------------------------------------*/
207 static void UART_EndTxTransfer(UART_HandleTypeDef *huart);
208 static void UART_EndRxTransfer(UART_HandleTypeDef *huart);
209 static void UART_DMATransmitCplt(DMA_HandleTypeDef *hdma);
210 static void UART_DMAReceiveCplt(DMA_HandleTypeDef *hdma);
211 static void UART_DMARxHalfCplt(DMA_HandleTypeDef *hdma);
212 static void UART_DMATxHalfCplt(DMA_HandleTypeDef *hdma);
213 static void UART_DMAError(DMA_HandleTypeDef *hdma);
214 static void UART_DMAAbortOnError(DMA_HandleTypeDef *hdma);
215 static void UART_DMATxAbortCallback(DMA_HandleTypeDef *hdma);
216 static void UART_DMARxAbortCallback(DMA_HandleTypeDef *hdma);
219 static void UART_TxISR_8BIT(UART_HandleTypeDef *huart);
220 static void UART_TxISR_16BIT(UART_HandleTypeDef *huart);
221 #if defined(USART_CR1_FIFOEN)
222 static void UART_TxISR_8BIT_FIFOEN(UART_HandleTypeDef *huart);
223 static void UART_TxISR_16BIT_FIFOEN(UART_HandleTypeDef *huart);
224 #endif /* USART_CR1_FIFOEN */
225 static void UART_EndTransmit_IT(UART_HandleTypeDef *huart);
226 static void UART_RxISR_8BIT(UART_HandleTypeDef *huart);
227 static void UART_RxISR_16BIT(UART_HandleTypeDef *huart);
228 #if defined(USART_CR1_FIFOEN)
229 static void UART_RxISR_8BIT_FIFOEN(UART_HandleTypeDef *huart);
230 static void UART_RxISR_16BIT_FIFOEN(UART_HandleTypeDef *huart);
231 #endif /* USART_CR1_FIFOEN */
232 
236 /* Exported functions --------------------------------------------------------*/
237 
308 HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart)
309 {
310  /* Check the UART handle allocation */
311  if (huart == NULL)
312  {
313  return HAL_ERROR;
314  }
315 
316  if (huart->Init.HwFlowCtl != UART_HWCONTROL_NONE)
317  {
318  /* Check the parameters */
319  assert_param(IS_UART_HWFLOW_INSTANCE(huart->Instance));
320  }
321  else
322  {
323  /* Check the parameters */
324  assert_param((IS_UART_INSTANCE(huart->Instance)) || (IS_LPUART_INSTANCE(huart->Instance)));
325  }
326 
327  if (huart->gState == HAL_UART_STATE_RESET)
328  {
329  /* Allocate lock resource and initialize it */
330  huart->Lock = HAL_UNLOCKED;
331 
332 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
334 
335  if (huart->MspInitCallback == NULL)
336  {
338  }
339 
340  /* Init the low level hardware */
341  huart->MspInitCallback(huart);
342 #else
343  /* Init the low level hardware : GPIO, CLOCK */
344  HAL_UART_MspInit(huart);
345 #endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */
346  }
347 
348  huart->gState = HAL_UART_STATE_BUSY;
349 
350  __HAL_UART_DISABLE(huart);
351 
352  /* Set the UART Communication parameters */
353  if (UART_SetConfig(huart) == HAL_ERROR)
354  {
355  return HAL_ERROR;
356  }
357 
358  if (huart->AdvancedInit.AdvFeatureInit != UART_ADVFEATURE_NO_INIT)
359  {
360  UART_AdvFeatureConfig(huart);
361  }
362 
363  /* In asynchronous mode, the following bits must be kept cleared:
364  - LINEN and CLKEN bits in the USART_CR2 register,
365  - SCEN, HDSEL and IREN bits in the USART_CR3 register.*/
366  CLEAR_BIT(huart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN));
367  CLEAR_BIT(huart->Instance->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN));
368 
369  __HAL_UART_ENABLE(huart);
370 
371  /* TEACK and/or REACK to check before moving huart->gState and huart->RxState to Ready */
372  return (UART_CheckIdleState(huart));
373 }
374 
381 HAL_StatusTypeDef HAL_HalfDuplex_Init(UART_HandleTypeDef *huart)
382 {
383  /* Check the UART handle allocation */
384  if (huart == NULL)
385  {
386  return HAL_ERROR;
387  }
388 
389  /* Check UART instance */
390  assert_param(IS_UART_HALFDUPLEX_INSTANCE(huart->Instance));
391 
392  if (huart->gState == HAL_UART_STATE_RESET)
393  {
394  /* Allocate lock resource and initialize it */
395  huart->Lock = HAL_UNLOCKED;
396 
397 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
399 
400  if (huart->MspInitCallback == NULL)
401  {
403  }
404 
405  /* Init the low level hardware */
406  huart->MspInitCallback(huart);
407 #else
408  /* Init the low level hardware : GPIO, CLOCK */
409  HAL_UART_MspInit(huart);
410 #endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */
411  }
412 
413  huart->gState = HAL_UART_STATE_BUSY;
414 
415  __HAL_UART_DISABLE(huart);
416 
417  /* Set the UART Communication parameters */
418  if (UART_SetConfig(huart) == HAL_ERROR)
419  {
420  return HAL_ERROR;
421  }
422 
423  if (huart->AdvancedInit.AdvFeatureInit != UART_ADVFEATURE_NO_INIT)
424  {
425  UART_AdvFeatureConfig(huart);
426  }
427 
428  /* In half-duplex mode, the following bits must be kept cleared:
429  - LINEN and CLKEN bits in the USART_CR2 register,
430  - SCEN and IREN bits in the USART_CR3 register.*/
431  CLEAR_BIT(huart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN));
432  CLEAR_BIT(huart->Instance->CR3, (USART_CR3_IREN | USART_CR3_SCEN));
433 
434  /* Enable the Half-Duplex mode by setting the HDSEL bit in the CR3 register */
435  SET_BIT(huart->Instance->CR3, USART_CR3_HDSEL);
436 
437  __HAL_UART_ENABLE(huart);
438 
439  /* TEACK and/or REACK to check before moving huart->gState and huart->RxState to Ready */
440  return (UART_CheckIdleState(huart));
441 }
442 
443 
454 HAL_StatusTypeDef HAL_LIN_Init(UART_HandleTypeDef *huart, uint32_t BreakDetectLength)
455 {
456  /* Check the UART handle allocation */
457  if (huart == NULL)
458  {
459  return HAL_ERROR;
460  }
461 
462  /* Check the LIN UART instance */
463  assert_param(IS_UART_LIN_INSTANCE(huart->Instance));
464  /* Check the Break detection length parameter */
465  assert_param(IS_UART_LIN_BREAK_DETECT_LENGTH(BreakDetectLength));
466 
467  /* LIN mode limited to 16-bit oversampling only */
468  if (huart->Init.OverSampling == UART_OVERSAMPLING_8)
469  {
470  return HAL_ERROR;
471  }
472  /* LIN mode limited to 8-bit data length */
473  if (huart->Init.WordLength != UART_WORDLENGTH_8B)
474  {
475  return HAL_ERROR;
476  }
477 
478  if (huart->gState == HAL_UART_STATE_RESET)
479  {
480  /* Allocate lock resource and initialize it */
481  huart->Lock = HAL_UNLOCKED;
482 
483 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
485 
486  if (huart->MspInitCallback == NULL)
487  {
489  }
490 
491  /* Init the low level hardware */
492  huart->MspInitCallback(huart);
493 #else
494  /* Init the low level hardware : GPIO, CLOCK */
495  HAL_UART_MspInit(huart);
496 #endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */
497  }
498 
499  huart->gState = HAL_UART_STATE_BUSY;
500 
501  __HAL_UART_DISABLE(huart);
502 
503  /* Set the UART Communication parameters */
504  if (UART_SetConfig(huart) == HAL_ERROR)
505  {
506  return HAL_ERROR;
507  }
508 
509  if (huart->AdvancedInit.AdvFeatureInit != UART_ADVFEATURE_NO_INIT)
510  {
511  UART_AdvFeatureConfig(huart);
512  }
513 
514  /* In LIN mode, the following bits must be kept cleared:
515  - LINEN and CLKEN bits in the USART_CR2 register,
516  - SCEN and IREN bits in the USART_CR3 register.*/
517  CLEAR_BIT(huart->Instance->CR2, USART_CR2_CLKEN);
518  CLEAR_BIT(huart->Instance->CR3, (USART_CR3_HDSEL | USART_CR3_IREN | USART_CR3_SCEN));
519 
520  /* Enable the LIN mode by setting the LINEN bit in the CR2 register */
521  SET_BIT(huart->Instance->CR2, USART_CR2_LINEN);
522 
523  /* Set the USART LIN Break detection length. */
524  MODIFY_REG(huart->Instance->CR2, USART_CR2_LBDL, BreakDetectLength);
525 
526  __HAL_UART_ENABLE(huart);
527 
528  /* TEACK and/or REACK to check before moving huart->gState and huart->RxState to Ready */
529  return (UART_CheckIdleState(huart));
530 }
531 
532 
551 HAL_StatusTypeDef HAL_MultiProcessor_Init(UART_HandleTypeDef *huart, uint8_t Address, uint32_t WakeUpMethod)
552 {
553  /* Check the UART handle allocation */
554  if (huart == NULL)
555  {
556  return HAL_ERROR;
557  }
558 
559  /* Check the wake up method parameter */
560  assert_param(IS_UART_WAKEUPMETHOD(WakeUpMethod));
561 
562  if (huart->gState == HAL_UART_STATE_RESET)
563  {
564  /* Allocate lock resource and initialize it */
565  huart->Lock = HAL_UNLOCKED;
566 
567 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
569 
570  if (huart->MspInitCallback == NULL)
571  {
573  }
574 
575  /* Init the low level hardware */
576  huart->MspInitCallback(huart);
577 #else
578  /* Init the low level hardware : GPIO, CLOCK */
579  HAL_UART_MspInit(huart);
580 #endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */
581  }
582 
583  huart->gState = HAL_UART_STATE_BUSY;
584 
585  __HAL_UART_DISABLE(huart);
586 
587  /* Set the UART Communication parameters */
588  if (UART_SetConfig(huart) == HAL_ERROR)
589  {
590  return HAL_ERROR;
591  }
592 
593  if (huart->AdvancedInit.AdvFeatureInit != UART_ADVFEATURE_NO_INIT)
594  {
595  UART_AdvFeatureConfig(huart);
596  }
597 
598  /* In multiprocessor mode, the following bits must be kept cleared:
599  - LINEN and CLKEN bits in the USART_CR2 register,
600  - SCEN, HDSEL and IREN bits in the USART_CR3 register. */
601  CLEAR_BIT(huart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN));
602  CLEAR_BIT(huart->Instance->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN));
603 
604  if (WakeUpMethod == UART_WAKEUPMETHOD_ADDRESSMARK)
605  {
606  /* If address mark wake up method is chosen, set the USART address node */
607  MODIFY_REG(huart->Instance->CR2, USART_CR2_ADD, ((uint32_t)Address << UART_CR2_ADDRESS_LSB_POS));
608  }
609 
610  /* Set the wake up method by setting the WAKE bit in the CR1 register */
611  MODIFY_REG(huart->Instance->CR1, USART_CR1_WAKE, WakeUpMethod);
612 
613  __HAL_UART_ENABLE(huart);
614 
615  /* TEACK and/or REACK to check before moving huart->gState and huart->RxState to Ready */
616  return (UART_CheckIdleState(huart));
617 }
618 
619 
625 HAL_StatusTypeDef HAL_UART_DeInit(UART_HandleTypeDef *huart)
626 {
627  /* Check the UART handle allocation */
628  if (huart == NULL)
629  {
630  return HAL_ERROR;
631  }
632 
633  /* Check the parameters */
634  assert_param((IS_UART_INSTANCE(huart->Instance)) || (IS_LPUART_INSTANCE(huart->Instance)));
635 
636  huart->gState = HAL_UART_STATE_BUSY;
637 
638  __HAL_UART_DISABLE(huart);
639 
640  huart->Instance->CR1 = 0x0U;
641  huart->Instance->CR2 = 0x0U;
642  huart->Instance->CR3 = 0x0U;
643 
644 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
645  if (huart->MspDeInitCallback == NULL)
646  {
648  }
649  /* DeInit the low level hardware */
650  huart->MspDeInitCallback(huart);
651 #else
652  /* DeInit the low level hardware */
653  HAL_UART_MspDeInit(huart);
654 #endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */
655 
656  huart->ErrorCode = HAL_UART_ERROR_NONE;
657  huart->gState = HAL_UART_STATE_RESET;
658  huart->RxState = HAL_UART_STATE_RESET;
659 
660  __HAL_UNLOCK(huart);
661 
662  return HAL_OK;
663 }
664 
671 {
672  /* Prevent unused argument(s) compilation warning */
673  UNUSED(huart);
674 
675  /* NOTE : This function should not be modified, when the callback is needed,
676  the HAL_UART_MspInit can be implemented in the user file
677  */
678 }
679 
686 {
687  /* Prevent unused argument(s) compilation warning */
688  UNUSED(huart);
689 
690  /* NOTE : This function should not be modified, when the callback is needed,
691  the HAL_UART_MspDeInit can be implemented in the user file
692  */
693 }
694 
695 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
696 
719  pUART_CallbackTypeDef pCallback)
720 {
721  HAL_StatusTypeDef status = HAL_OK;
722 
723  if (pCallback == NULL)
724  {
725  huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK;
726 
727  return HAL_ERROR;
728  }
729 
730  __HAL_LOCK(huart);
731 
732  if (huart->gState == HAL_UART_STATE_READY)
733  {
734  switch (CallbackID)
735  {
737  huart->TxHalfCpltCallback = pCallback;
738  break;
739 
741  huart->TxCpltCallback = pCallback;
742  break;
743 
745  huart->RxHalfCpltCallback = pCallback;
746  break;
747 
749  huart->RxCpltCallback = pCallback;
750  break;
751 
752  case HAL_UART_ERROR_CB_ID :
753  huart->ErrorCallback = pCallback;
754  break;
755 
757  huart->AbortCpltCallback = pCallback;
758  break;
759 
761  huart->AbortTransmitCpltCallback = pCallback;
762  break;
763 
765  huart->AbortReceiveCpltCallback = pCallback;
766  break;
767 
768  case HAL_UART_WAKEUP_CB_ID :
769  huart->WakeupCallback = pCallback;
770  break;
771 
772 #if defined(USART_CR1_FIFOEN)
774  huart->RxFifoFullCallback = pCallback;
775  break;
776 
778  huart->TxFifoEmptyCallback = pCallback;
779  break;
780 #endif /* USART_CR1_FIFOEN */
781 
783  huart->MspInitCallback = pCallback;
784  break;
785 
787  huart->MspDeInitCallback = pCallback;
788  break;
789 
790  default :
791  huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK;
792 
793  status = HAL_ERROR;
794  break;
795  }
796  }
797  else if (huart->gState == HAL_UART_STATE_RESET)
798  {
799  switch (CallbackID)
800  {
802  huart->MspInitCallback = pCallback;
803  break;
804 
806  huart->MspDeInitCallback = pCallback;
807  break;
808 
809  default :
810  huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK;
811 
812  status = HAL_ERROR;
813  break;
814  }
815  }
816  else
817  {
818  huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK;
819 
820  status = HAL_ERROR;
821  }
822 
823  __HAL_UNLOCK(huart);
824 
825  return status;
826 }
827 
850 {
851  HAL_StatusTypeDef status = HAL_OK;
852 
853  __HAL_LOCK(huart);
854 
855  if (HAL_UART_STATE_READY == huart->gState)
856  {
857  switch (CallbackID)
858  {
860  huart->TxHalfCpltCallback = HAL_UART_TxHalfCpltCallback; /* Legacy weak TxHalfCpltCallback */
861  break;
862 
864  huart->TxCpltCallback = HAL_UART_TxCpltCallback; /* Legacy weak TxCpltCallback */
865  break;
866 
868  huart->RxHalfCpltCallback = HAL_UART_RxHalfCpltCallback; /* Legacy weak RxHalfCpltCallback */
869  break;
870 
872  huart->RxCpltCallback = HAL_UART_RxCpltCallback; /* Legacy weak RxCpltCallback */
873  break;
874 
875  case HAL_UART_ERROR_CB_ID :
876  huart->ErrorCallback = HAL_UART_ErrorCallback; /* Legacy weak ErrorCallback */
877  break;
878 
880  huart->AbortCpltCallback = HAL_UART_AbortCpltCallback; /* Legacy weak AbortCpltCallback */
881  break;
882 
884  huart->AbortTransmitCpltCallback = HAL_UART_AbortTransmitCpltCallback; /* Legacy weak AbortTransmitCpltCallback */
885  break;
886 
888  huart->AbortReceiveCpltCallback = HAL_UART_AbortReceiveCpltCallback; /* Legacy weak AbortReceiveCpltCallback */
889  break;
890 
891  case HAL_UART_WAKEUP_CB_ID :
892  huart->WakeupCallback = HAL_UARTEx_WakeupCallback; /* Legacy weak WakeupCallback */
893  break;
894 
895 #if defined(USART_CR1_FIFOEN)
897  huart->RxFifoFullCallback = HAL_UARTEx_RxFifoFullCallback; /* Legacy weak RxFifoFullCallback */
898  break;
899 
901  huart->TxFifoEmptyCallback = HAL_UARTEx_TxFifoEmptyCallback; /* Legacy weak TxFifoEmptyCallback */
902  break;
903 
904 #endif /* USART_CR1_FIFOEN */
906  huart->MspInitCallback = HAL_UART_MspInit; /* Legacy weak MspInitCallback */
907  break;
908 
910  huart->MspDeInitCallback = HAL_UART_MspDeInit; /* Legacy weak MspDeInitCallback */
911  break;
912 
913  default :
914  huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK;
915 
916  status = HAL_ERROR;
917  break;
918  }
919  }
920  else if (HAL_UART_STATE_RESET == huart->gState)
921  {
922  switch (CallbackID)
923  {
926  break;
927 
930  break;
931 
932  default :
933  huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK;
934 
935  status = HAL_ERROR;
936  break;
937  }
938  }
939  else
940  {
941  huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK;
942 
943  status = HAL_ERROR;
944  }
945 
946  __HAL_UNLOCK(huart);
947 
948  return status;
949 }
950 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
951 
1045 HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
1046 {
1047  uint8_t *pdata8bits;
1048  uint16_t *pdata16bits;
1049  uint32_t tickstart;
1050 
1051  /* Check that a Tx process is not already ongoing */
1052  if (huart->gState == HAL_UART_STATE_READY)
1053  {
1054  if ((pData == NULL) || (Size == 0U))
1055  {
1056  return HAL_ERROR;
1057  }
1058 
1059  __HAL_LOCK(huart);
1060 
1061  huart->ErrorCode = HAL_UART_ERROR_NONE;
1062  huart->gState = HAL_UART_STATE_BUSY_TX;
1063 
1064  /* Init tickstart for timeout managment*/
1065  tickstart = HAL_GetTick();
1066 
1067  huart->TxXferSize = Size;
1068  huart->TxXferCount = Size;
1069 
1070  /* In case of 9bits/No Parity transfer, pData needs to be handled as a uint16_t pointer */
1071  if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
1072  {
1073  pdata8bits = NULL;
1074  pdata16bits = (uint16_t *) pData;
1075  }
1076  else
1077  {
1078  pdata8bits = pData;
1079  pdata16bits = NULL;
1080  }
1081 
1082  while (huart->TxXferCount > 0U)
1083  {
1084  if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
1085  {
1086  return HAL_TIMEOUT;
1087  }
1088  if (pdata8bits == NULL)
1089  {
1090  huart->Instance->TDR = (uint16_t)(*pdata16bits & 0x01FFU);
1091  pdata16bits++;
1092  }
1093  else
1094  {
1095  huart->Instance->TDR = (uint8_t)(*pdata8bits & 0xFFU);
1096  pdata8bits++;
1097  }
1098  huart->TxXferCount--;
1099  }
1100 
1101  if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TC, RESET, tickstart, Timeout) != HAL_OK)
1102  {
1103  return HAL_TIMEOUT;
1104  }
1105 
1106  /* At end of Tx process, restore huart->gState to Ready */
1107  huart->gState = HAL_UART_STATE_READY;
1108 
1109  __HAL_UNLOCK(huart);
1110 
1111  return HAL_OK;
1112  }
1113  else
1114  {
1115  return HAL_BUSY;
1116  }
1117 }
1118 
1131 HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
1132 {
1133  uint8_t *pdata8bits;
1134  uint16_t *pdata16bits;
1135  uint16_t uhMask;
1136  uint32_t tickstart;
1137 
1138  /* Check that a Rx process is not already ongoing */
1139  if (huart->RxState == HAL_UART_STATE_READY)
1140  {
1141  if ((pData == NULL) || (Size == 0U))
1142  {
1143  return HAL_ERROR;
1144  }
1145 
1146  __HAL_LOCK(huart);
1147 
1148  huart->ErrorCode = HAL_UART_ERROR_NONE;
1149  huart->RxState = HAL_UART_STATE_BUSY_RX;
1150 
1151  /* Init tickstart for timeout managment*/
1152  tickstart = HAL_GetTick();
1153 
1154  huart->RxXferSize = Size;
1155  huart->RxXferCount = Size;
1156 
1157  /* Computation of UART mask to apply to RDR register */
1158  UART_MASK_COMPUTATION(huart);
1159  uhMask = huart->Mask;
1160 
1161  /* In case of 9bits/No Parity transfer, pRxData needs to be handled as a uint16_t pointer */
1162  if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
1163  {
1164  pdata8bits = NULL;
1165  pdata16bits = (uint16_t *) pData;
1166  }
1167  else
1168  {
1169  pdata8bits = pData;
1170  pdata16bits = NULL;
1171  }
1172 
1173  /* as long as data have to be received */
1174  while (huart->RxXferCount > 0U)
1175  {
1176  if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK)
1177  {
1178  return HAL_TIMEOUT;
1179  }
1180  if (pdata8bits == NULL)
1181  {
1182  *pdata16bits = (uint16_t)(huart->Instance->RDR & uhMask);
1183  pdata16bits++;
1184  }
1185  else
1186  {
1187  *pdata8bits = (uint8_t)(huart->Instance->RDR & (uint8_t)uhMask);
1188  pdata8bits++;
1189  }
1190  huart->RxXferCount--;
1191  }
1192 
1193  /* At end of Rx process, restore huart->RxState to Ready */
1194  huart->RxState = HAL_UART_STATE_READY;
1195 
1196  __HAL_UNLOCK(huart);
1197 
1198  return HAL_OK;
1199  }
1200  else
1201  {
1202  return HAL_BUSY;
1203  }
1204 }
1205 
1213 HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
1214 {
1215  /* Check that a Tx process is not already ongoing */
1216  if (huart->gState == HAL_UART_STATE_READY)
1217  {
1218  if ((pData == NULL) || (Size == 0U))
1219  {
1220  return HAL_ERROR;
1221  }
1222 
1223  __HAL_LOCK(huart);
1224 
1225  huart->pTxBuffPtr = pData;
1226  huart->TxXferSize = Size;
1227  huart->TxXferCount = Size;
1228  huart->TxISR = NULL;
1229 
1230  huart->ErrorCode = HAL_UART_ERROR_NONE;
1231  huart->gState = HAL_UART_STATE_BUSY_TX;
1232 
1233 #if defined(USART_CR1_FIFOEN)
1234  /* Configure Tx interrupt processing */
1235  if (huart->FifoMode == UART_FIFOMODE_ENABLE)
1236  {
1237  /* Set the Tx ISR function pointer according to the data word length */
1238  if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
1239  {
1240  huart->TxISR = UART_TxISR_16BIT_FIFOEN;
1241  }
1242  else
1243  {
1244  huart->TxISR = UART_TxISR_8BIT_FIFOEN;
1245  }
1246 
1247  __HAL_UNLOCK(huart);
1248 
1249  /* Enable the TX FIFO threshold interrupt */
1250  SET_BIT(huart->Instance->CR3, USART_CR3_TXFTIE);
1251  }
1252  else
1253  {
1254  /* Set the Tx ISR function pointer according to the data word length */
1255  if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
1256  {
1257  huart->TxISR = UART_TxISR_16BIT;
1258  }
1259  else
1260  {
1261  huart->TxISR = UART_TxISR_8BIT;
1262  }
1263 
1264  __HAL_UNLOCK(huart);
1265 
1266  /* Enable the Transmit Data Register Empty interrupt */
1267  SET_BIT(huart->Instance->CR1, USART_CR1_TXEIE_TXFNFIE);
1268  }
1269 #else
1270  /* Set the Tx ISR function pointer according to the data word length */
1271  if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
1272  {
1273  huart->TxISR = UART_TxISR_16BIT;
1274  }
1275  else
1276  {
1277  huart->TxISR = UART_TxISR_8BIT;
1278  }
1279 
1280  __HAL_UNLOCK(huart);
1281 
1282  /* Enable the Transmit Data Register Empty interrupt */
1283  SET_BIT(huart->Instance->CR1, USART_CR1_TXEIE);
1284 #endif /* USART_CR1_FIFOEN */
1285 
1286  return HAL_OK;
1287  }
1288  else
1289  {
1290  return HAL_BUSY;
1291  }
1292 }
1293 
1301 HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
1302 {
1303  /* Check that a Rx process is not already ongoing */
1304  if (huart->RxState == HAL_UART_STATE_READY)
1305  {
1306  if ((pData == NULL) || (Size == 0U))
1307  {
1308  return HAL_ERROR;
1309  }
1310 
1311  __HAL_LOCK(huart);
1312 
1313  huart->pRxBuffPtr = pData;
1314  huart->RxXferSize = Size;
1315  huart->RxXferCount = Size;
1316  huart->RxISR = NULL;
1317 
1318  /* Computation of UART mask to apply to RDR register */
1319  UART_MASK_COMPUTATION(huart);
1320 
1321  huart->ErrorCode = HAL_UART_ERROR_NONE;
1322  huart->RxState = HAL_UART_STATE_BUSY_RX;
1323 
1324  /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */
1325  SET_BIT(huart->Instance->CR3, USART_CR3_EIE);
1326 
1327 #if defined(USART_CR1_FIFOEN)
1328  /* Configure Rx interrupt processing*/
1329  if ((huart->FifoMode == UART_FIFOMODE_ENABLE) && (Size >= huart->NbRxDataToProcess))
1330  {
1331  /* Set the Rx ISR function pointer according to the data word length */
1332  if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
1333  {
1334  huart->RxISR = UART_RxISR_16BIT_FIFOEN;
1335  }
1336  else
1337  {
1338  huart->RxISR = UART_RxISR_8BIT_FIFOEN;
1339  }
1340 
1341  __HAL_UNLOCK(huart);
1342 
1343  /* Enable the UART Parity Error interrupt and RX FIFO Threshold interrupt */
1344  SET_BIT(huart->Instance->CR1, USART_CR1_PEIE);
1345  SET_BIT(huart->Instance->CR3, USART_CR3_RXFTIE);
1346  }
1347  else
1348  {
1349  /* Set the Rx ISR function pointer according to the data word length */
1350  if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
1351  {
1352  huart->RxISR = UART_RxISR_16BIT;
1353  }
1354  else
1355  {
1356  huart->RxISR = UART_RxISR_8BIT;
1357  }
1358 
1359  __HAL_UNLOCK(huart);
1360 
1361  /* Enable the UART Parity Error interrupt and Data Register Not Empty interrupt */
1362  SET_BIT(huart->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE_RXFNEIE);
1363  }
1364 #else
1365  /* Set the Rx ISR function pointer according to the data word length */
1366  if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
1367  {
1368  huart->RxISR = UART_RxISR_16BIT;
1369  }
1370  else
1371  {
1372  huart->RxISR = UART_RxISR_8BIT;
1373  }
1374 
1375  __HAL_UNLOCK(huart);
1376 
1377  /* Enable the UART Parity Error interrupt and Data Register Not Empty interrupt */
1378  SET_BIT(huart->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE);
1379 #endif /* USART_CR1_FIFOEN */
1380 
1381  return HAL_OK;
1382  }
1383  else
1384  {
1385  return HAL_BUSY;
1386  }
1387 }
1388 
1396 HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
1397 {
1398  /* Check that a Tx process is not already ongoing */
1399  if (huart->gState == HAL_UART_STATE_READY)
1400  {
1401  if ((pData == NULL) || (Size == 0U))
1402  {
1403  return HAL_ERROR;
1404  }
1405 
1406  __HAL_LOCK(huart);
1407 
1408  huart->pTxBuffPtr = pData;
1409  huart->TxXferSize = Size;
1410  huart->TxXferCount = Size;
1411 
1412  huart->ErrorCode = HAL_UART_ERROR_NONE;
1413  huart->gState = HAL_UART_STATE_BUSY_TX;
1414 
1415  if (huart->hdmatx != NULL)
1416  {
1417  /* Set the UART DMA transfer complete callback */
1419 
1420  /* Set the UART DMA Half transfer complete callback */
1422 
1423  /* Set the DMA error callback */
1425 
1426  /* Set the DMA abort callback */
1427  huart->hdmatx->XferAbortCallback = NULL;
1428 
1429  /* Enable the UART transmit DMA channel */
1430  if (HAL_DMA_Start_IT(huart->hdmatx, (uint32_t)huart->pTxBuffPtr, (uint32_t)&huart->Instance->TDR, Size) != HAL_OK)
1431  {
1432  /* Set error code to DMA */
1433  huart->ErrorCode = HAL_UART_ERROR_DMA;
1434 
1435  __HAL_UNLOCK(huart);
1436 
1437  /* Restore huart->gState to ready */
1438  huart->gState = HAL_UART_STATE_READY;
1439 
1440  return HAL_ERROR;
1441  }
1442  }
1443  /* Clear the TC flag in the ICR register */
1444  __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_TCF);
1445 
1446  __HAL_UNLOCK(huart);
1447 
1448  /* Enable the DMA transfer for transmit request by setting the DMAT bit
1449  in the UART CR3 register */
1450  SET_BIT(huart->Instance->CR3, USART_CR3_DMAT);
1451 
1452  return HAL_OK;
1453  }
1454  else
1455  {
1456  return HAL_BUSY;
1457  }
1458 }
1459 
1469 HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
1470 {
1471  /* Check that a Rx process is not already ongoing */
1472  if (huart->RxState == HAL_UART_STATE_READY)
1473  {
1474  if ((pData == NULL) || (Size == 0U))
1475  {
1476  return HAL_ERROR;
1477  }
1478 
1479  __HAL_LOCK(huart);
1480 
1481  huart->pRxBuffPtr = pData;
1482  huart->RxXferSize = Size;
1483 
1484  huart->ErrorCode = HAL_UART_ERROR_NONE;
1485  huart->RxState = HAL_UART_STATE_BUSY_RX;
1486 
1487  if (huart->hdmarx != NULL)
1488  {
1489  /* Set the UART DMA transfer complete callback */
1491 
1492  /* Set the UART DMA Half transfer complete callback */
1494 
1495  /* Set the DMA error callback */
1497 
1498  /* Set the DMA abort callback */
1499  huart->hdmarx->XferAbortCallback = NULL;
1500 
1501  /* Enable the DMA channel */
1502  if (HAL_DMA_Start_IT(huart->hdmarx, (uint32_t)&huart->Instance->RDR, (uint32_t)huart->pRxBuffPtr, Size) != HAL_OK)
1503  {
1504  /* Set error code to DMA */
1505  huart->ErrorCode = HAL_UART_ERROR_DMA;
1506 
1507  __HAL_UNLOCK(huart);
1508 
1509  /* Restore huart->gState to ready */
1510  huart->gState = HAL_UART_STATE_READY;
1511 
1512  return HAL_ERROR;
1513  }
1514  }
1515  __HAL_UNLOCK(huart);
1516 
1517  /* Enable the UART Parity Error Interrupt */
1518  SET_BIT(huart->Instance->CR1, USART_CR1_PEIE);
1519 
1520  /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */
1521  SET_BIT(huart->Instance->CR3, USART_CR3_EIE);
1522 
1523  /* Enable the DMA transfer for the receiver request by setting the DMAR bit
1524  in the UART CR3 register */
1525  SET_BIT(huart->Instance->CR3, USART_CR3_DMAR);
1526 
1527  return HAL_OK;
1528  }
1529  else
1530  {
1531  return HAL_BUSY;
1532  }
1533 }
1534 
1540 HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart)
1541 {
1542  const HAL_UART_StateTypeDef gstate = huart->gState;
1543  const HAL_UART_StateTypeDef rxstate = huart->RxState;
1544 
1545  __HAL_LOCK(huart);
1546 
1547  if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT)) &&
1548  (gstate == HAL_UART_STATE_BUSY_TX))
1549  {
1550  /* Disable the UART DMA Tx request */
1551  CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT);
1552  }
1553  if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) &&
1554  (rxstate == HAL_UART_STATE_BUSY_RX))
1555  {
1556  /* Disable PE and ERR (Frame error, noise error, overrun error) interrupts */
1557  CLEAR_BIT(huart->Instance->CR1, USART_CR1_PEIE);
1558  CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
1559 
1560  /* Disable the UART DMA Rx request */
1561  CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);
1562  }
1563 
1564  __HAL_UNLOCK(huart);
1565 
1566  return HAL_OK;
1567 }
1568 
1574 HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart)
1575 {
1576  __HAL_LOCK(huart);
1577 
1578  if (huart->gState == HAL_UART_STATE_BUSY_TX)
1579  {
1580  /* Enable the UART DMA Tx request */
1581  SET_BIT(huart->Instance->CR3, USART_CR3_DMAT);
1582  }
1583  if (huart->RxState == HAL_UART_STATE_BUSY_RX)
1584  {
1585  /* Clear the Overrun flag before resuming the Rx transfer */
1586  __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF);
1587 
1588  /* Reenable PE and ERR (Frame error, noise error, overrun error) interrupts */
1589  SET_BIT(huart->Instance->CR1, USART_CR1_PEIE);
1590  SET_BIT(huart->Instance->CR3, USART_CR3_EIE);
1591 
1592  /* Enable the UART DMA Rx request */
1593  SET_BIT(huart->Instance->CR3, USART_CR3_DMAR);
1594  }
1595 
1596  __HAL_UNLOCK(huart);
1597 
1598  return HAL_OK;
1599 }
1600 
1606 HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart)
1607 {
1608  /* The Lock is not implemented on this API to allow the user application
1609  to call the HAL UART API under callbacks HAL_UART_TxCpltCallback() / HAL_UART_RxCpltCallback() /
1610  HAL_UART_TxHalfCpltCallback / HAL_UART_RxHalfCpltCallback:
1611  indeed, when HAL_DMA_Abort() API is called, the DMA TX/RX Transfer or Half Transfer complete
1612  interrupt is generated if the DMA transfer interruption occurs at the middle or at the end of
1613  the stream and the corresponding call back is executed. */
1614 
1615  const HAL_UART_StateTypeDef gstate = huart->gState;
1616  const HAL_UART_StateTypeDef rxstate = huart->RxState;
1617 
1618  /* Stop UART DMA Tx request if ongoing */
1619  if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT)) &&
1620  (gstate == HAL_UART_STATE_BUSY_TX))
1621  {
1622  CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT);
1623 
1624  /* Abort the UART DMA Tx channel */
1625  if (huart->hdmatx != NULL)
1626  {
1627  if (HAL_DMA_Abort(huart->hdmatx) != HAL_OK)
1628  {
1629  if (HAL_DMA_GetError(huart->hdmatx) == HAL_DMA_ERROR_TIMEOUT)
1630  {
1631  /* Set error code to DMA */
1632  huart->ErrorCode = HAL_UART_ERROR_DMA;
1633 
1634  return HAL_TIMEOUT;
1635  }
1636  }
1637  }
1638 
1639  UART_EndTxTransfer(huart);
1640  }
1641 
1642  /* Stop UART DMA Rx request if ongoing */
1643  if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) &&
1644  (rxstate == HAL_UART_STATE_BUSY_RX))
1645  {
1646  CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);
1647 
1648  /* Abort the UART DMA Rx channel */
1649  if (huart->hdmarx != NULL)
1650  {
1651  if (HAL_DMA_Abort(huart->hdmarx) != HAL_OK)
1652  {
1653  if (HAL_DMA_GetError(huart->hdmarx) == HAL_DMA_ERROR_TIMEOUT)
1654  {
1655  /* Set error code to DMA */
1656  huart->ErrorCode = HAL_UART_ERROR_DMA;
1657 
1658  return HAL_TIMEOUT;
1659  }
1660  }
1661  }
1662 
1663  UART_EndRxTransfer(huart);
1664  }
1665 
1666  return HAL_OK;
1667 }
1668 
1681 HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef *huart)
1682 {
1683 #if defined(USART_CR1_FIFOEN)
1684  /* Disable TXE, TC, RXNE, PE, RXFT, TXFT and ERR (Frame error, noise error, overrun error) interrupts */
1685  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_TXEIE_TXFNFIE | USART_CR1_TCIE));
1686  CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE | USART_CR3_RXFTIE | USART_CR3_TXFTIE);
1687 #else
1688  /* Disable TXEIE, TCIE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
1689  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE | USART_CR1_TCIE));
1690  CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
1691 #endif /* USART_CR1_FIFOEN */
1692 
1693  /* Disable the UART DMA Tx request if enabled */
1694  if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT))
1695  {
1696  CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT);
1697 
1698  /* Abort the UART DMA Tx channel : use blocking DMA Abort API (no callback) */
1699  if (huart->hdmatx != NULL)
1700  {
1701  /* Set the UART DMA Abort callback to Null.
1702  No call back execution at end of DMA abort procedure */
1703  huart->hdmatx->XferAbortCallback = NULL;
1704 
1705  if (HAL_DMA_Abort(huart->hdmatx) != HAL_OK)
1706  {
1707  if (HAL_DMA_GetError(huart->hdmatx) == HAL_DMA_ERROR_TIMEOUT)
1708  {
1709  /* Set error code to DMA */
1710  huart->ErrorCode = HAL_UART_ERROR_DMA;
1711 
1712  return HAL_TIMEOUT;
1713  }
1714  }
1715  }
1716  }
1717 
1718  /* Disable the UART DMA Rx request if enabled */
1719  if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))
1720  {
1721  CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);
1722 
1723  /* Abort the UART DMA Rx channel : use blocking DMA Abort API (no callback) */
1724  if (huart->hdmarx != NULL)
1725  {
1726  /* Set the UART DMA Abort callback to Null.
1727  No call back execution at end of DMA abort procedure */
1728  huart->hdmarx->XferAbortCallback = NULL;
1729 
1730  if (HAL_DMA_Abort(huart->hdmarx) != HAL_OK)
1731  {
1732  if (HAL_DMA_GetError(huart->hdmarx) == HAL_DMA_ERROR_TIMEOUT)
1733  {
1734  /* Set error code to DMA */
1735  huart->ErrorCode = HAL_UART_ERROR_DMA;
1736 
1737  return HAL_TIMEOUT;
1738  }
1739  }
1740  }
1741  }
1742 
1743  /* Reset Tx and Rx transfer counters */
1744  huart->TxXferCount = 0U;
1745  huart->RxXferCount = 0U;
1746 
1747  /* Clear the Error flags in the ICR register */
1748  __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF | UART_CLEAR_NEF | UART_CLEAR_PEF | UART_CLEAR_FEF);
1749 
1750 #if defined(USART_CR1_FIFOEN)
1751  /* Flush the whole TX FIFO (if needed) */
1752  if (huart->FifoMode == UART_FIFOMODE_ENABLE)
1753  {
1754  __HAL_UART_SEND_REQ(huart, UART_TXDATA_FLUSH_REQUEST);
1755  }
1756 #endif /* USART_CR1_FIFOEN */
1757 
1758  /* Discard the received data */
1759  __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
1760 
1761  /* Restore huart->gState and huart->RxState to Ready */
1762  huart->gState = HAL_UART_STATE_READY;
1763  huart->RxState = HAL_UART_STATE_READY;
1764 
1765  huart->ErrorCode = HAL_UART_ERROR_NONE;
1766 
1767  return HAL_OK;
1768 }
1769 
1783 {
1784 #if defined(USART_CR1_FIFOEN)
1785  /* Disable TCIE, TXEIE and TXFTIE interrupts */
1786  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TCIE | USART_CR1_TXEIE_TXFNFIE));
1787  CLEAR_BIT(huart->Instance->CR3, USART_CR3_TXFTIE);
1788 #else
1789  /* Disable TXEIE and TCIE interrupts */
1790  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE));
1791 #endif /* USART_CR1_FIFOEN */
1792 
1793  /* Disable the UART DMA Tx request if enabled */
1794  if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT))
1795  {
1796  CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT);
1797 
1798  /* Abort the UART DMA Tx channel : use blocking DMA Abort API (no callback) */
1799  if (huart->hdmatx != NULL)
1800  {
1801  /* Set the UART DMA Abort callback to Null.
1802  No call back execution at end of DMA abort procedure */
1803  huart->hdmatx->XferAbortCallback = NULL;
1804 
1805  if (HAL_DMA_Abort(huart->hdmatx) != HAL_OK)
1806  {
1807  if (HAL_DMA_GetError(huart->hdmatx) == HAL_DMA_ERROR_TIMEOUT)
1808  {
1809  /* Set error code to DMA */
1810  huart->ErrorCode = HAL_UART_ERROR_DMA;
1811 
1812  return HAL_TIMEOUT;
1813  }
1814  }
1815  }
1816  }
1817 
1818  /* Reset Tx transfer counter */
1819  huart->TxXferCount = 0U;
1820 
1821 #if defined(USART_CR1_FIFOEN)
1822  /* Flush the whole TX FIFO (if needed) */
1823  if (huart->FifoMode == UART_FIFOMODE_ENABLE)
1824  {
1825  __HAL_UART_SEND_REQ(huart, UART_TXDATA_FLUSH_REQUEST);
1826  }
1827 #endif /* USART_CR1_FIFOEN */
1828 
1829  /* Restore huart->gState to Ready */
1830  huart->gState = HAL_UART_STATE_READY;
1831 
1832  return HAL_OK;
1833 }
1834 
1848 {
1849 #if defined(USART_CR1_FIFOEN)
1850  /* Disable PEIE, EIE, RXNEIE and RXFTIE interrupts */
1851  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_PEIE | USART_CR1_RXNEIE_RXFNEIE));
1852  CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE | USART_CR3_RXFTIE);
1853 #else
1854  /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
1855  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
1856  CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
1857 #endif /* USART_CR1_FIFOEN */
1858 
1859  /* Disable the UART DMA Rx request if enabled */
1860  if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))
1861  {
1862  CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);
1863 
1864  /* Abort the UART DMA Rx channel : use blocking DMA Abort API (no callback) */
1865  if (huart->hdmarx != NULL)
1866  {
1867  /* Set the UART DMA Abort callback to Null.
1868  No call back execution at end of DMA abort procedure */
1869  huart->hdmarx->XferAbortCallback = NULL;
1870 
1871  if (HAL_DMA_Abort(huart->hdmarx) != HAL_OK)
1872  {
1873  if (HAL_DMA_GetError(huart->hdmarx) == HAL_DMA_ERROR_TIMEOUT)
1874  {
1875  /* Set error code to DMA */
1876  huart->ErrorCode = HAL_UART_ERROR_DMA;
1877 
1878  return HAL_TIMEOUT;
1879  }
1880  }
1881  }
1882  }
1883 
1884  /* Reset Rx transfer counter */
1885  huart->RxXferCount = 0U;
1886 
1887  /* Clear the Error flags in the ICR register */
1888  __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF | UART_CLEAR_NEF | UART_CLEAR_PEF | UART_CLEAR_FEF);
1889 
1890  /* Discard the received data */
1891  __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
1892 
1893  /* Restore huart->RxState to Ready */
1894  huart->RxState = HAL_UART_STATE_READY;
1895 
1896  return HAL_OK;
1897 }
1898 
1913 HAL_StatusTypeDef HAL_UART_Abort_IT(UART_HandleTypeDef *huart)
1914 {
1915  uint32_t abortcplt = 1U;
1916 
1917  /* Disable interrupts */
1918 #if defined(USART_CR1_FIFOEN)
1919  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_PEIE | USART_CR1_TCIE | USART_CR1_RXNEIE_RXFNEIE | USART_CR1_TXEIE_TXFNFIE));
1920  CLEAR_BIT(huart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE | USART_CR3_TXFTIE));
1921 #else
1922  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE | USART_CR1_TCIE));
1923  CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
1924 #endif /* USART_CR1_FIFOEN */
1925 
1926  /* If DMA Tx and/or DMA Rx Handles are associated to UART Handle, DMA Abort complete callbacks should be initialised
1927  before any call to DMA Abort functions */
1928  /* DMA Tx Handle is valid */
1929  if (huart->hdmatx != NULL)
1930  {
1931  /* Set DMA Abort Complete callback if UART DMA Tx request if enabled.
1932  Otherwise, set it to NULL */
1933  if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT))
1934  {
1936  }
1937  else
1938  {
1939  huart->hdmatx->XferAbortCallback = NULL;
1940  }
1941  }
1942  /* DMA Rx Handle is valid */
1943  if (huart->hdmarx != NULL)
1944  {
1945  /* Set DMA Abort Complete callback if UART DMA Rx request if enabled.
1946  Otherwise, set it to NULL */
1947  if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))
1948  {
1950  }
1951  else
1952  {
1953  huart->hdmarx->XferAbortCallback = NULL;
1954  }
1955  }
1956 
1957  /* Disable the UART DMA Tx request if enabled */
1958  if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT))
1959  {
1960  /* Disable DMA Tx at UART level */
1961  CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT);
1962 
1963  /* Abort the UART DMA Tx channel : use non blocking DMA Abort API (callback) */
1964  if (huart->hdmatx != NULL)
1965  {
1966  /* UART Tx DMA Abort callback has already been initialised :
1967  will lead to call HAL_UART_AbortCpltCallback() at end of DMA abort procedure */
1968 
1969  /* Abort DMA TX */
1970  if (HAL_DMA_Abort_IT(huart->hdmatx) != HAL_OK)
1971  {
1972  huart->hdmatx->XferAbortCallback = NULL;
1973  }
1974  else
1975  {
1976  abortcplt = 0U;
1977  }
1978  }
1979  }
1980 
1981  /* Disable the UART DMA Rx request if enabled */
1982  if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))
1983  {
1984  CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);
1985 
1986  /* Abort the UART DMA Rx channel : use non blocking DMA Abort API (callback) */
1987  if (huart->hdmarx != NULL)
1988  {
1989  /* UART Rx DMA Abort callback has already been initialised :
1990  will lead to call HAL_UART_AbortCpltCallback() at end of DMA abort procedure */
1991 
1992  /* Abort DMA RX */
1993  if (HAL_DMA_Abort_IT(huart->hdmarx) != HAL_OK)
1994  {
1995  huart->hdmarx->XferAbortCallback = NULL;
1996  abortcplt = 1U;
1997  }
1998  else
1999  {
2000  abortcplt = 0U;
2001  }
2002  }
2003  }
2004 
2005  /* if no DMA abort complete callback execution is required => call user Abort Complete callback */
2006  if (abortcplt == 1U)
2007  {
2008  /* Reset Tx and Rx transfer counters */
2009  huart->TxXferCount = 0U;
2010  huart->RxXferCount = 0U;
2011 
2012  /* Clear ISR function pointers */
2013  huart->RxISR = NULL;
2014  huart->TxISR = NULL;
2015 
2016  /* Reset errorCode */
2017  huart->ErrorCode = HAL_UART_ERROR_NONE;
2018 
2019  /* Clear the Error flags in the ICR register */
2020  __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF | UART_CLEAR_NEF | UART_CLEAR_PEF | UART_CLEAR_FEF);
2021 
2022 #if defined(USART_CR1_FIFOEN)
2023  /* Flush the whole TX FIFO (if needed) */
2024  if (huart->FifoMode == UART_FIFOMODE_ENABLE)
2025  {
2026  __HAL_UART_SEND_REQ(huart, UART_TXDATA_FLUSH_REQUEST);
2027  }
2028 #endif /* USART_CR1_FIFOEN */
2029 
2030  /* Discard the received data */
2031  __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
2032 
2033  /* Restore huart->gState and huart->RxState to Ready */
2034  huart->gState = HAL_UART_STATE_READY;
2035  huart->RxState = HAL_UART_STATE_READY;
2036 
2037  /* As no DMA to be aborted, call directly user Abort complete callback */
2038 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
2039  /* Call registered Abort complete callback */
2040  huart->AbortCpltCallback(huart);
2041 #else
2042  /* Call legacy weak Abort complete callback */
2044 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
2045  }
2046 
2047  return HAL_OK;
2048 }
2049 
2065 {
2066  /* Disable interrupts */
2067 #if defined(USART_CR1_FIFOEN)
2068  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TCIE | USART_CR1_TXEIE_TXFNFIE));
2069  CLEAR_BIT(huart->Instance->CR3, USART_CR3_TXFTIE);
2070 #else
2071  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE));
2072 #endif /* USART_CR1_FIFOEN */
2073 
2074  /* Disable the UART DMA Tx request if enabled */
2075  if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT))
2076  {
2077  CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT);
2078 
2079  /* Abort the UART DMA Tx channel : use non blocking DMA Abort API (callback) */
2080  if (huart->hdmatx != NULL)
2081  {
2082  /* Set the UART DMA Abort callback :
2083  will lead to call HAL_UART_AbortCpltCallback() at end of DMA abort procedure */
2085 
2086  /* Abort DMA TX */
2087  if (HAL_DMA_Abort_IT(huart->hdmatx) != HAL_OK)
2088  {
2089  /* Call Directly huart->hdmatx->XferAbortCallback function in case of error */
2090  huart->hdmatx->XferAbortCallback(huart->hdmatx);
2091  }
2092  }
2093  else
2094  {
2095  /* Reset Tx transfer counter */
2096  huart->TxXferCount = 0U;
2097 
2098  /* Clear TxISR function pointers */
2099  huart->TxISR = NULL;
2100 
2101  /* Restore huart->gState to Ready */
2102  huart->gState = HAL_UART_STATE_READY;
2103 
2104  /* As no DMA to be aborted, call directly user Abort complete callback */
2105 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
2106  /* Call registered Abort Transmit Complete Callback */
2107  huart->AbortTransmitCpltCallback(huart);
2108 #else
2109  /* Call legacy weak Abort Transmit Complete Callback */
2111 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
2112  }
2113  }
2114  else
2115  {
2116  /* Reset Tx transfer counter */
2117  huart->TxXferCount = 0U;
2118 
2119  /* Clear TxISR function pointers */
2120  huart->TxISR = NULL;
2121 
2122 #if defined(USART_CR1_FIFOEN)
2123  /* Flush the whole TX FIFO (if needed) */
2124  if (huart->FifoMode == UART_FIFOMODE_ENABLE)
2125  {
2126  __HAL_UART_SEND_REQ(huart, UART_TXDATA_FLUSH_REQUEST);
2127  }
2128 #endif /* USART_CR1_FIFOEN */
2129 
2130  /* Restore huart->gState to Ready */
2131  huart->gState = HAL_UART_STATE_READY;
2132 
2133  /* As no DMA to be aborted, call directly user Abort complete callback */
2134 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
2135  /* Call registered Abort Transmit Complete Callback */
2136  huart->AbortTransmitCpltCallback(huart);
2137 #else
2138  /* Call legacy weak Abort Transmit Complete Callback */
2140 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
2141  }
2142 
2143  return HAL_OK;
2144 }
2145 
2161 {
2162  /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
2163 #if defined(USART_CR1_FIFOEN)
2164  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_PEIE | USART_CR1_RXNEIE_RXFNEIE));
2165  CLEAR_BIT(huart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE));
2166 #else
2167  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
2168  CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
2169 #endif /* USART_CR1_FIFOEN */
2170 
2171  /* Disable the UART DMA Rx request if enabled */
2172  if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))
2173  {
2174  CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);
2175 
2176  /* Abort the UART DMA Rx channel : use non blocking DMA Abort API (callback) */
2177  if (huart->hdmarx != NULL)
2178  {
2179  /* Set the UART DMA Abort callback :
2180  will lead to call HAL_UART_AbortCpltCallback() at end of DMA abort procedure */
2182 
2183  /* Abort DMA RX */
2184  if (HAL_DMA_Abort_IT(huart->hdmarx) != HAL_OK)
2185  {
2186  /* Call Directly huart->hdmarx->XferAbortCallback function in case of error */
2187  huart->hdmarx->XferAbortCallback(huart->hdmarx);
2188  }
2189  }
2190  else
2191  {
2192  /* Reset Rx transfer counter */
2193  huart->RxXferCount = 0U;
2194 
2195  /* Clear RxISR function pointer */
2196  huart->pRxBuffPtr = NULL;
2197 
2198  /* Clear the Error flags in the ICR register */
2199  __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF | UART_CLEAR_NEF | UART_CLEAR_PEF | UART_CLEAR_FEF);
2200 
2201  /* Discard the received data */
2202  __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
2203 
2204  /* Restore huart->RxState to Ready */
2205  huart->RxState = HAL_UART_STATE_READY;
2206 
2207  /* As no DMA to be aborted, call directly user Abort complete callback */
2208 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
2209  /* Call registered Abort Receive Complete Callback */
2210  huart->AbortReceiveCpltCallback(huart);
2211 #else
2212  /* Call legacy weak Abort Receive Complete Callback */
2214 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
2215  }
2216  }
2217  else
2218  {
2219  /* Reset Rx transfer counter */
2220  huart->RxXferCount = 0U;
2221 
2222  /* Clear RxISR function pointer */
2223  huart->pRxBuffPtr = NULL;
2224 
2225  /* Clear the Error flags in the ICR register */
2226  __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF | UART_CLEAR_NEF | UART_CLEAR_PEF | UART_CLEAR_FEF);
2227 
2228  /* Restore huart->RxState to Ready */
2229  huart->RxState = HAL_UART_STATE_READY;
2230 
2231  /* As no DMA to be aborted, call directly user Abort complete callback */
2232 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
2233  /* Call registered Abort Receive Complete Callback */
2234  huart->AbortReceiveCpltCallback(huart);
2235 #else
2236  /* Call legacy weak Abort Receive Complete Callback */
2238 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
2239  }
2240 
2241  return HAL_OK;
2242 }
2243 
2250 {
2251  uint32_t isrflags = READ_REG(huart->Instance->ISR);
2252  uint32_t cr1its = READ_REG(huart->Instance->CR1);
2253  uint32_t cr3its = READ_REG(huart->Instance->CR3);
2254 
2255  uint32_t errorflags;
2256  uint32_t errorcode;
2257 
2258  /* If no error occurs */
2259  errorflags = (isrflags & (uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_ORE | USART_ISR_NE));
2260  if (errorflags == 0U)
2261  {
2262  /* UART in mode Receiver ---------------------------------------------------*/
2263 #if defined(USART_CR1_FIFOEN)
2264  if (((isrflags & USART_ISR_RXNE_RXFNE) != 0U)
2265  && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U)
2266  || ((cr3its & USART_CR3_RXFTIE) != 0U)))
2267 #else
2268  if (((isrflags & USART_ISR_RXNE) != 0U)
2269  && ((cr1its & USART_CR1_RXNEIE) != 0U))
2270 #endif /* USART_CR1_FIFOEN */
2271  {
2272  if (huart->RxISR != NULL)
2273  {
2274  huart->RxISR(huart);
2275  }
2276  return;
2277  }
2278  }
2279 
2280  /* If some errors occur */
2281 #if defined(USART_CR1_FIFOEN)
2282  if ((errorflags != 0U)
2283  && ((((cr3its & (USART_CR3_RXFTIE | USART_CR3_EIE)) != 0U)
2284  || ((cr1its & (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE)) != 0U))))
2285 #else
2286  if ((errorflags != 0U)
2287  && (((cr3its & USART_CR3_EIE) != 0U)
2288  || ((cr1its & (USART_CR1_RXNEIE | USART_CR1_PEIE)) != 0U)))
2289 #endif /* USART_CR1_FIFOEN */
2290  {
2291  /* UART parity error interrupt occurred -------------------------------------*/
2292  if (((isrflags & USART_ISR_PE) != 0U) && ((cr1its & USART_CR1_PEIE) != 0U))
2293  {
2294  __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_PEF);
2295 
2296  huart->ErrorCode |= HAL_UART_ERROR_PE;
2297  }
2298 
2299  /* UART frame error interrupt occurred --------------------------------------*/
2300  if (((isrflags & USART_ISR_FE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U))
2301  {
2302  __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_FEF);
2303 
2304  huart->ErrorCode |= HAL_UART_ERROR_FE;
2305  }
2306 
2307  /* UART noise error interrupt occurred --------------------------------------*/
2308  if (((isrflags & USART_ISR_NE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U))
2309  {
2310  __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_NEF);
2311 
2312  huart->ErrorCode |= HAL_UART_ERROR_NE;
2313  }
2314 
2315  /* UART Over-Run interrupt occurred -----------------------------------------*/
2316 #if defined(USART_CR1_FIFOEN)
2317  if (((isrflags & USART_ISR_ORE) != 0U)
2318  && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U) ||
2319  ((cr3its & (USART_CR3_RXFTIE | USART_CR3_EIE)) != 0U)))
2320 #else
2321  if (((isrflags & USART_ISR_ORE) != 0U)
2322  && (((cr1its & USART_CR1_RXNEIE) != 0U) ||
2323  ((cr3its & USART_CR3_EIE) != 0U)))
2324 #endif /* USART_CR1_FIFOEN */
2325  {
2326  __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF);
2327 
2328  huart->ErrorCode |= HAL_UART_ERROR_ORE;
2329  }
2330 
2331  /* Call UART Error Call back function if need be --------------------------*/
2332  if (huart->ErrorCode != HAL_UART_ERROR_NONE)
2333  {
2334  /* UART in mode Receiver ---------------------------------------------------*/
2335 #if defined(USART_CR1_FIFOEN)
2336  if (((isrflags & USART_ISR_RXNE_RXFNE) != 0U)
2337  && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U)
2338  || ((cr3its & USART_CR3_RXFTIE) != 0U)))
2339 #else
2340  if (((isrflags & USART_ISR_RXNE) != 0U)
2341  && ((cr1its & USART_CR1_RXNEIE) != 0U))
2342 #endif /* USART_CR1_FIFOEN */
2343  {
2344  if (huart->RxISR != NULL)
2345  {
2346  huart->RxISR(huart);
2347  }
2348  }
2349 
2350  /* If Overrun error occurs, or if any error occurs in DMA mode reception,
2351  consider error as blocking */
2352  errorcode = huart->ErrorCode;
2353  if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) ||
2354  ((errorcode & HAL_UART_ERROR_ORE) != 0U))
2355  {
2356  /* Blocking error : transfer is aborted
2357  Set the UART state ready to be able to start again the process,
2358  Disable Rx Interrupts, and disable Rx DMA request, if ongoing */
2359  UART_EndRxTransfer(huart);
2360 
2361  /* Disable the UART DMA Rx request if enabled */
2362  if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))
2363  {
2364  CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);
2365 
2366  /* Abort the UART DMA Rx channel */
2367  if (huart->hdmarx != NULL)
2368  {
2369  /* Set the UART DMA Abort callback :
2370  will lead to call HAL_UART_ErrorCallback() at end of DMA abort procedure */
2372 
2373  /* Abort DMA RX */
2374  if (HAL_DMA_Abort_IT(huart->hdmarx) != HAL_OK)
2375  {
2376  /* Call Directly huart->hdmarx->XferAbortCallback function in case of error */
2377  huart->hdmarx->XferAbortCallback(huart->hdmarx);
2378  }
2379  }
2380  else
2381  {
2382  /* Call user error callback */
2383 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
2384  /*Call registered error callback*/
2385  huart->ErrorCallback(huart);
2386 #else
2387  /*Call legacy weak error callback*/
2388  HAL_UART_ErrorCallback(huart);
2389 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
2390 
2391  }
2392  }
2393  else
2394  {
2395  /* Call user error callback */
2396 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
2397  /*Call registered error callback*/
2398  huart->ErrorCallback(huart);
2399 #else
2400  /*Call legacy weak error callback*/
2401  HAL_UART_ErrorCallback(huart);
2402 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
2403  }
2404  }
2405  else
2406  {
2407  /* Non Blocking error : transfer could go on.
2408  Error is notified to user through user error callback */
2409 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
2410  /*Call registered error callback*/
2411  huart->ErrorCallback(huart);
2412 #else
2413  /*Call legacy weak error callback*/
2414  HAL_UART_ErrorCallback(huart);
2415 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
2416  huart->ErrorCode = HAL_UART_ERROR_NONE;
2417  }
2418  }
2419  return;
2420 
2421  } /* End if some error occurs */
2422 
2423  /* UART wakeup from Stop mode interrupt occurred ---------------------------*/
2424  if (((isrflags & USART_ISR_WUF) != 0U) && ((cr3its & USART_CR3_WUFIE) != 0U))
2425  {
2426  __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_WUF);
2427 
2428  /* UART Rx state is not reset as a reception process might be ongoing.
2429  If UART handle state fields need to be reset to READY, this could be done in Wakeup callback */
2430 
2431 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
2432  /* Call registered Wakeup Callback */
2433  huart->WakeupCallback(huart);
2434 #else
2435  /* Call legacy weak Wakeup Callback */
2437 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
2438  return;
2439  }
2440 
2441  /* UART in mode Transmitter ------------------------------------------------*/
2442 #if defined(USART_CR1_FIFOEN)
2443  if (((isrflags & USART_ISR_TXE_TXFNF) != 0U)
2444  && (((cr1its & USART_CR1_TXEIE_TXFNFIE) != 0U)
2445  || ((cr3its & USART_CR3_TXFTIE) != 0U)))
2446 #else
2447  if (((isrflags & USART_ISR_TXE) != 0U)
2448  && ((cr1its & USART_CR1_TXEIE) != 0U))
2449 #endif /* USART_CR1_FIFOEN */
2450  {
2451  if (huart->TxISR != NULL)
2452  {
2453  huart->TxISR(huart);
2454  }
2455  return;
2456  }
2457 
2458  /* UART in mode Transmitter (transmission end) -----------------------------*/
2459  if (((isrflags & USART_ISR_TC) != 0U) && ((cr1its & USART_CR1_TCIE) != 0U))
2460  {
2461  UART_EndTransmit_IT(huart);
2462  return;
2463  }
2464 
2465 #if defined(USART_CR1_FIFOEN)
2466  /* UART TX Fifo Empty occurred ----------------------------------------------*/
2467  if (((isrflags & USART_ISR_TXFE) != 0U) && ((cr1its & USART_CR1_TXFEIE) != 0U))
2468  {
2469 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
2470  /* Call registered Tx Fifo Empty Callback */
2471  huart->TxFifoEmptyCallback(huart);
2472 #else
2473  /* Call legacy weak Tx Fifo Empty Callback */
2475 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
2476  return;
2477  }
2478 
2479  /* UART RX Fifo Full occurred ----------------------------------------------*/
2480  if (((isrflags & USART_ISR_RXFF) != 0U) && ((cr1its & USART_CR1_RXFFIE) != 0U))
2481  {
2482 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
2483  /* Call registered Rx Fifo Full Callback */
2484  huart->RxFifoFullCallback(huart);
2485 #else
2486  /* Call legacy weak Rx Fifo Full Callback */
2488 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
2489  return;
2490  }
2491 #endif /* USART_CR1_FIFOEN */
2492 }
2493 
2500 {
2501  /* Prevent unused argument(s) compilation warning */
2502  UNUSED(huart);
2503 
2504  /* NOTE : This function should not be modified, when the callback is needed,
2505  the HAL_UART_TxCpltCallback can be implemented in the user file.
2506  */
2507 }
2508 
2515 {
2516  /* Prevent unused argument(s) compilation warning */
2517  UNUSED(huart);
2518 
2519  /* NOTE: This function should not be modified, when the callback is needed,
2520  the HAL_UART_TxHalfCpltCallback can be implemented in the user file.
2521  */
2522 }
2523 
2530 {
2531  /* Prevent unused argument(s) compilation warning */
2532  UNUSED(huart);
2533 
2534  /* NOTE : This function should not be modified, when the callback is needed,
2535  the HAL_UART_RxCpltCallback can be implemented in the user file.
2536  */
2537 }
2538 
2545 {
2546  /* Prevent unused argument(s) compilation warning */
2547  UNUSED(huart);
2548 
2549  /* NOTE: This function should not be modified, when the callback is needed,
2550  the HAL_UART_RxHalfCpltCallback can be implemented in the user file.
2551  */
2552 }
2553 
2560 {
2561  /* Prevent unused argument(s) compilation warning */
2562  UNUSED(huart);
2563 
2564  /* NOTE : This function should not be modified, when the callback is needed,
2565  the HAL_UART_ErrorCallback can be implemented in the user file.
2566  */
2567 }
2568 
2575 {
2576  /* Prevent unused argument(s) compilation warning */
2577  UNUSED(huart);
2578 
2579  /* NOTE : This function should not be modified, when the callback is needed,
2580  the HAL_UART_AbortCpltCallback can be implemented in the user file.
2581  */
2582 }
2583 
2590 {
2591  /* Prevent unused argument(s) compilation warning */
2592  UNUSED(huart);
2593 
2594  /* NOTE : This function should not be modified, when the callback is needed,
2595  the HAL_UART_AbortTransmitCpltCallback can be implemented in the user file.
2596  */
2597 }
2598 
2605 {
2606  /* Prevent unused argument(s) compilation warning */
2607  UNUSED(huart);
2608 
2609  /* NOTE : This function should not be modified, when the callback is needed,
2610  the HAL_UART_AbortReceiveCpltCallback can be implemented in the user file.
2611  */
2612 }
2613 
2647 {
2648  __HAL_LOCK(huart);
2649 
2650  huart->gState = HAL_UART_STATE_BUSY;
2651 
2652  /* Enable USART mute mode by setting the MME bit in the CR1 register */
2653  SET_BIT(huart->Instance->CR1, USART_CR1_MME);
2654 
2655  huart->gState = HAL_UART_STATE_READY;
2656 
2657  return (UART_CheckIdleState(huart));
2658 }
2659 
2667 {
2668  __HAL_LOCK(huart);
2669 
2670  huart->gState = HAL_UART_STATE_BUSY;
2671 
2672  /* Disable USART mute mode by clearing the MME bit in the CR1 register */
2673  CLEAR_BIT(huart->Instance->CR1, USART_CR1_MME);
2674 
2675  huart->gState = HAL_UART_STATE_READY;
2676 
2677  return (UART_CheckIdleState(huart));
2678 }
2679 
2687 {
2688  __HAL_UART_SEND_REQ(huart, UART_MUTE_MODE_REQUEST);
2689 }
2690 
2697 {
2698  __HAL_LOCK(huart);
2699  huart->gState = HAL_UART_STATE_BUSY;
2700 
2701  /* Clear TE and RE bits */
2702  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TE | USART_CR1_RE));
2703 
2704  /* Enable the USART's transmit interface by setting the TE bit in the USART CR1 register */
2705  SET_BIT(huart->Instance->CR1, USART_CR1_TE);
2706 
2707  huart->gState = HAL_UART_STATE_READY;
2708 
2709  __HAL_UNLOCK(huart);
2710 
2711  return HAL_OK;
2712 }
2713 
2720 {
2721  __HAL_LOCK(huart);
2722  huart->gState = HAL_UART_STATE_BUSY;
2723 
2724  /* Clear TE and RE bits */
2725  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TE | USART_CR1_RE));
2726 
2727  /* Enable the USART's receive interface by setting the RE bit in the USART CR1 register */
2728  SET_BIT(huart->Instance->CR1, USART_CR1_RE);
2729 
2730  huart->gState = HAL_UART_STATE_READY;
2731 
2732  __HAL_UNLOCK(huart);
2733 
2734  return HAL_OK;
2735 }
2736 
2737 
2743 HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart)
2744 {
2745  /* Check the parameters */
2746  assert_param(IS_UART_LIN_INSTANCE(huart->Instance));
2747 
2748  __HAL_LOCK(huart);
2749 
2750  huart->gState = HAL_UART_STATE_BUSY;
2751 
2752  /* Send break characters */
2753  __HAL_UART_SEND_REQ(huart, UART_SENDBREAK_REQUEST);
2754 
2755  huart->gState = HAL_UART_STATE_READY;
2756 
2757  __HAL_UNLOCK(huart);
2758 
2759  return HAL_OK;
2760 }
2761 
2789 {
2790  uint32_t temp1;
2791  uint32_t temp2;
2792  temp1 = huart->gState;
2793  temp2 = huart->RxState;
2794 
2795  return (HAL_UART_StateTypeDef)(temp1 | temp2);
2796 }
2797 
2805 {
2806  return huart->ErrorCode;
2807 }
2825 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
2827 {
2828  /* Init the UART Callback settings */
2829  huart->TxHalfCpltCallback = HAL_UART_TxHalfCpltCallback; /* Legacy weak TxHalfCpltCallback */
2830  huart->TxCpltCallback = HAL_UART_TxCpltCallback; /* Legacy weak TxCpltCallback */
2831  huart->RxHalfCpltCallback = HAL_UART_RxHalfCpltCallback; /* Legacy weak RxHalfCpltCallback */
2832  huart->RxCpltCallback = HAL_UART_RxCpltCallback; /* Legacy weak RxCpltCallback */
2833  huart->ErrorCallback = HAL_UART_ErrorCallback; /* Legacy weak ErrorCallback */
2834  huart->AbortCpltCallback = HAL_UART_AbortCpltCallback; /* Legacy weak AbortCpltCallback */
2835  huart->AbortTransmitCpltCallback = HAL_UART_AbortTransmitCpltCallback; /* Legacy weak AbortTransmitCpltCallback */
2836  huart->AbortReceiveCpltCallback = HAL_UART_AbortReceiveCpltCallback; /* Legacy weak AbortReceiveCpltCallback */
2837  huart->WakeupCallback = HAL_UARTEx_WakeupCallback; /* Legacy weak WakeupCallback */
2838 #if defined(USART_CR1_FIFOEN)
2839  huart->RxFifoFullCallback = HAL_UARTEx_RxFifoFullCallback; /* Legacy weak RxFifoFullCallback */
2840  huart->TxFifoEmptyCallback = HAL_UARTEx_TxFifoEmptyCallback; /* Legacy weak TxFifoEmptyCallback */
2841 #endif /* USART_CR1_FIFOEN */
2842 
2843 }
2844 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
2845 
2851 HAL_StatusTypeDef UART_SetConfig(UART_HandleTypeDef *huart)
2852 {
2853  uint32_t tmpreg;
2854  uint16_t brrtemp;
2855  UART_ClockSourceTypeDef clocksource;
2856  uint32_t usartdiv = 0x00000000U;
2857  HAL_StatusTypeDef ret = HAL_OK;
2858  uint32_t lpuart_ker_ck_pres = 0x00000000U;
2859 
2860  /* Check the parameters */
2861  assert_param(IS_UART_BAUDRATE(huart->Init.BaudRate));
2862  assert_param(IS_UART_WORD_LENGTH(huart->Init.WordLength));
2863  if (UART_INSTANCE_LOWPOWER(huart))
2864  {
2865  assert_param(IS_LPUART_STOPBITS(huart->Init.StopBits));
2866  }
2867  else
2868  {
2869  assert_param(IS_UART_STOPBITS(huart->Init.StopBits));
2870  assert_param(IS_UART_ONE_BIT_SAMPLE(huart->Init.OneBitSampling));
2871  }
2872 
2873  assert_param(IS_UART_PARITY(huart->Init.Parity));
2874  assert_param(IS_UART_MODE(huart->Init.Mode));
2875  assert_param(IS_UART_HARDWARE_FLOW_CONTROL(huart->Init.HwFlowCtl));
2876  assert_param(IS_UART_OVERSAMPLING(huart->Init.OverSampling));
2877 #if defined(USART_PRESC_PRESCALER)
2878  assert_param(IS_UART_PRESCALER(huart->Init.ClockPrescaler));
2879 #endif /* USART_PRESC_PRESCALER */
2880 
2881  /*-------------------------- USART CR1 Configuration -----------------------*/
2882  /* Clear M, PCE, PS, TE, RE and OVER8 bits and configure
2883  * the UART Word Length, Parity, Mode and oversampling:
2884  * set the M bits according to huart->Init.WordLength value
2885  * set PCE and PS bits according to huart->Init.Parity value
2886  * set TE and RE bits according to huart->Init.Mode value
2887  * set OVER8 bit according to huart->Init.OverSampling value */
2888  tmpreg = (uint32_t)huart->Init.WordLength | huart->Init.Parity | huart->Init.Mode | huart->Init.OverSampling ;
2889 #if defined(USART_CR1_FIFOEN)
2890  tmpreg |= (uint32_t)huart->FifoMode;
2891 #endif /* USART_CR1_FIFOEN */
2892  MODIFY_REG(huart->Instance->CR1, USART_CR1_FIELDS, tmpreg);
2893 
2894  /*-------------------------- USART CR2 Configuration -----------------------*/
2895  /* Configure the UART Stop Bits: Set STOP[13:12] bits according
2896  * to huart->Init.StopBits value */
2897  MODIFY_REG(huart->Instance->CR2, USART_CR2_STOP, huart->Init.StopBits);
2898 
2899  /*-------------------------- USART CR3 Configuration -----------------------*/
2900  /* Configure
2901  * - UART HardWare Flow Control: set CTSE and RTSE bits according
2902  * to huart->Init.HwFlowCtl value
2903  * - one-bit sampling method versus three samples' majority rule according
2904  * to huart->Init.OneBitSampling (not applicable to LPUART) */
2905  tmpreg = (uint32_t)huart->Init.HwFlowCtl;
2906 
2907  if (!(UART_INSTANCE_LOWPOWER(huart)))
2908  {
2909  tmpreg |= huart->Init.OneBitSampling;
2910  }
2911  MODIFY_REG(huart->Instance->CR3, USART_CR3_FIELDS, tmpreg);
2912 
2913 #if defined(USART_PRESC_PRESCALER)
2914  /*-------------------------- USART PRESC Configuration -----------------------*/
2915  /* Configure
2916  * - UART Clock Prescaler : set PRESCALER according to huart->Init.ClockPrescaler value */
2917  MODIFY_REG(huart->Instance->PRESC, USART_PRESC_PRESCALER, huart->Init.ClockPrescaler);
2918 #endif /* USART_PRESC_PRESCALER */
2919 
2920  /*-------------------------- USART BRR Configuration -----------------------*/
2921  UART_GETCLOCKSOURCE(huart, clocksource);
2922 
2923  /* Check LPUART instance */
2924  if (UART_INSTANCE_LOWPOWER(huart))
2925  {
2926  /* Retrieve frequency clock */
2927  switch (clocksource)
2928  {
2930 #if defined(USART_PRESC_PRESCALER)
2931  lpuart_ker_ck_pres = (HAL_RCC_GetPCLK1Freq() / UART_GET_DIV_FACTOR(huart->Init.ClockPrescaler));
2932 #else
2933  lpuart_ker_ck_pres = HAL_RCC_GetPCLK1Freq();
2934 #endif /* USART_PRESC_PRESCALER */
2935  break;
2936  case UART_CLOCKSOURCE_HSI:
2937 #if defined(USART_PRESC_PRESCALER)
2938  lpuart_ker_ck_pres = ((uint32_t)HSI_VALUE / UART_GET_DIV_FACTOR(huart->Init.ClockPrescaler));
2939 #else
2940  lpuart_ker_ck_pres = (uint32_t)HSI_VALUE;
2941 #endif /* USART_PRESC_PRESCALER */
2942  break;
2944 #if defined(USART_PRESC_PRESCALER)
2945  lpuart_ker_ck_pres = (HAL_RCC_GetSysClockFreq() / UART_GET_DIV_FACTOR(huart->Init.ClockPrescaler));
2946 #else
2947  lpuart_ker_ck_pres = HAL_RCC_GetSysClockFreq();
2948 #endif /* USART_PRESC_PRESCALER */
2949  break;
2950  case UART_CLOCKSOURCE_LSE:
2951 #if defined(USART_PRESC_PRESCALER)
2952  lpuart_ker_ck_pres = ((uint32_t)LSE_VALUE / UART_GET_DIV_FACTOR(huart->Init.ClockPrescaler));
2953 #else
2954  lpuart_ker_ck_pres = (uint32_t)LSE_VALUE;
2955 #endif /* USART_PRESC_PRESCALER */
2956  break;
2958  default:
2959  ret = HAL_ERROR;
2960  break;
2961  }
2962 
2963  /* if proper clock source reported */
2964  if (lpuart_ker_ck_pres != 0U)
2965  {
2966  /* ensure that Frequency clock is in the range [3 * baudrate, 4096 * baudrate] */
2967  if ((lpuart_ker_ck_pres < (3U * huart->Init.BaudRate)) ||
2968  (lpuart_ker_ck_pres > (4096U * huart->Init.BaudRate)))
2969  {
2970  ret = HAL_ERROR;
2971  }
2972  else
2973  {
2974  switch (clocksource)
2975  {
2977 #if defined(USART_PRESC_PRESCALER)
2978  usartdiv = (uint32_t)(UART_DIV_LPUART(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate, huart->Init.ClockPrescaler));
2979 #else
2980  usartdiv = (uint32_t)(UART_DIV_LPUART(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate));
2981 #endif /* USART_PRESC_PRESCALER */
2982  break;
2983  case UART_CLOCKSOURCE_HSI:
2984 #if defined(USART_PRESC_PRESCALER)
2985  usartdiv = (uint32_t)(UART_DIV_LPUART(HSI_VALUE, huart->Init.BaudRate, huart->Init.ClockPrescaler));
2986 #else
2987  usartdiv = (uint32_t)(UART_DIV_LPUART(HSI_VALUE, huart->Init.BaudRate));
2988 #endif /* USART_PRESC_PRESCALER */
2989  break;
2991 #if defined(USART_PRESC_PRESCALER)
2992  usartdiv = (uint32_t)(UART_DIV_LPUART(HAL_RCC_GetSysClockFreq(), huart->Init.BaudRate, huart->Init.ClockPrescaler));
2993 #else
2994  usartdiv = (uint32_t)(UART_DIV_LPUART(HAL_RCC_GetSysClockFreq(), huart->Init.BaudRate));
2995 #endif /* USART_PRESC_PRESCALER */
2996  break;
2997  case UART_CLOCKSOURCE_LSE:
2998 #if defined(USART_PRESC_PRESCALER)
2999  usartdiv = (uint32_t)(UART_DIV_LPUART(LSE_VALUE, huart->Init.BaudRate, huart->Init.ClockPrescaler));
3000 #else
3001  usartdiv = (uint32_t)(UART_DIV_LPUART(LSE_VALUE, huart->Init.BaudRate));
3002 #endif /* USART_PRESC_PRESCALER */
3003  break;
3005  default:
3006  ret = HAL_ERROR;
3007  break;
3008  }
3009 
3010  /* It is forbidden to write values lower than 0x300 in the LPUART_BRR register */
3011  if ((usartdiv >= LPUART_BRR_MIN) && (usartdiv <= LPUART_BRR_MAX))
3012  {
3013  huart->Instance->BRR = usartdiv;
3014  }
3015  else
3016  {
3017  ret = HAL_ERROR;
3018  }
3019  } /* if ( (lpuart_ker_ck_pres < (3 * huart->Init.BaudRate) ) || (lpuart_ker_ck_pres > (4096 * huart->Init.BaudRate) )) */
3020  } /* if (lpuart_ker_ck_pres != 0) */
3021  }
3022  /* Check UART Over Sampling to set Baud Rate Register */
3023  else if (huart->Init.OverSampling == UART_OVERSAMPLING_8)
3024  {
3025  switch (clocksource)
3026  {
3028 #if defined(USART_PRESC_PRESCALER)
3029  usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate, huart->Init.ClockPrescaler));
3030 #else
3031  usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate));
3032 #endif /* USART_PRESC_PRESCALER */
3033  break;
3035 #if defined(USART_PRESC_PRESCALER)
3036  usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate, huart->Init.ClockPrescaler));
3037 #else
3038  usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate));
3039 #endif /* USART_PRESC_PRESCALER */
3040  break;
3041  case UART_CLOCKSOURCE_HSI:
3042 #if defined(USART_PRESC_PRESCALER)
3043  usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HSI_VALUE, huart->Init.BaudRate, huart->Init.ClockPrescaler));
3044 #else
3045  usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HSI_VALUE, huart->Init.BaudRate));
3046 #endif /* USART_PRESC_PRESCALER */
3047  break;
3049 #if defined(USART_PRESC_PRESCALER)
3050  usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetSysClockFreq(), huart->Init.BaudRate, huart->Init.ClockPrescaler));
3051 #else
3052  usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetSysClockFreq(), huart->Init.BaudRate));
3053 #endif /* USART_PRESC_PRESCALER */
3054  break;
3055  case UART_CLOCKSOURCE_LSE:
3056 #if defined(USART_PRESC_PRESCALER)
3057  usartdiv = (uint16_t)(UART_DIV_SAMPLING8((uint32_t)LSE_VALUE, huart->Init.BaudRate, huart->Init.ClockPrescaler));
3058 #else
3059  usartdiv = (uint16_t)(UART_DIV_SAMPLING8(LSE_VALUE, huart->Init.BaudRate));
3060 #endif /* USART_PRESC_PRESCALER */
3061  break;
3063  default:
3064  ret = HAL_ERROR;
3065  break;
3066  }
3067 
3068  /* USARTDIV must be greater than or equal to 0d16 */
3069  if ((usartdiv >= UART_BRR_MIN) && (usartdiv <= UART_BRR_MAX))
3070  {
3071  brrtemp = (uint16_t)(usartdiv & 0xFFF0U);
3072  brrtemp |= (uint16_t)((usartdiv & (uint16_t)0x000FU) >> 1U);
3073  huart->Instance->BRR = brrtemp;
3074  }
3075  else
3076  {
3077  ret = HAL_ERROR;
3078  }
3079  }
3080  else
3081  {
3082  switch (clocksource)
3083  {
3085 #if defined(USART_PRESC_PRESCALER)
3086  usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate, huart->Init.ClockPrescaler));
3087 #else
3088  usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate));
3089 #endif /* USART_PRESC_PRESCALER */
3090  break;
3092 #if defined(USART_PRESC_PRESCALER)
3093  usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate, huart->Init.ClockPrescaler));
3094 #else
3095  usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate));
3096 #endif /* USART_PRESC_PRESCALER */
3097  break;
3098  case UART_CLOCKSOURCE_HSI:
3099 #if defined(USART_PRESC_PRESCALER)
3100  usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HSI_VALUE, huart->Init.BaudRate, huart->Init.ClockPrescaler));
3101 #else
3102  usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HSI_VALUE, huart->Init.BaudRate));
3103 #endif /* USART_PRESC_PRESCALER */
3104  break;
3106 #if defined(USART_PRESC_PRESCALER)
3107  usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetSysClockFreq(), huart->Init.BaudRate, huart->Init.ClockPrescaler));
3108 #else
3109  usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetSysClockFreq(), huart->Init.BaudRate));
3110 #endif /* USART_PRESC_PRESCALER */
3111  break;
3112  case UART_CLOCKSOURCE_LSE:
3113 #if defined(USART_PRESC_PRESCALER)
3114  usartdiv = (uint16_t)(UART_DIV_SAMPLING16((uint32_t)LSE_VALUE, huart->Init.BaudRate, huart->Init.ClockPrescaler));
3115 #else
3116  usartdiv = (uint16_t)(UART_DIV_SAMPLING16(LSE_VALUE, huart->Init.BaudRate));
3117 #endif /* USART_PRESC_PRESCALER */
3118  break;
3120  default:
3121  ret = HAL_ERROR;
3122  break;
3123  }
3124 
3125  /* USARTDIV must be greater than or equal to 0d16 */
3126  if ((usartdiv >= UART_BRR_MIN) && (usartdiv <= UART_BRR_MAX))
3127  {
3128  huart->Instance->BRR = usartdiv;
3129  }
3130  else
3131  {
3132  ret = HAL_ERROR;
3133  }
3134  }
3135 
3136 #if defined(USART_CR1_FIFOEN)
3137  /* Initialize the number of data to process during RX/TX ISR execution */
3138  huart->NbTxDataToProcess = 1;
3139  huart->NbRxDataToProcess = 1;
3140 #endif /* USART_CR1_FIFOEN */
3141 
3142  /* Clear ISR function pointers */
3143  huart->RxISR = NULL;
3144  huart->TxISR = NULL;
3145 
3146  return ret;
3147 }
3148 
3155 {
3156  /* Check whether the set of advanced features to configure is properly set */
3157  assert_param(IS_UART_ADVFEATURE_INIT(huart->AdvancedInit.AdvFeatureInit));
3158 
3159  /* if required, configure TX pin active level inversion */
3160  if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_TXINVERT_INIT))
3161  {
3162  assert_param(IS_UART_ADVFEATURE_TXINV(huart->AdvancedInit.TxPinLevelInvert));
3163  MODIFY_REG(huart->Instance->CR2, USART_CR2_TXINV, huart->AdvancedInit.TxPinLevelInvert);
3164  }
3165 
3166  /* if required, configure RX pin active level inversion */
3167  if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_RXINVERT_INIT))
3168  {
3169  assert_param(IS_UART_ADVFEATURE_RXINV(huart->AdvancedInit.RxPinLevelInvert));
3170  MODIFY_REG(huart->Instance->CR2, USART_CR2_RXINV, huart->AdvancedInit.RxPinLevelInvert);
3171  }
3172 
3173  /* if required, configure data inversion */
3174  if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_DATAINVERT_INIT))
3175  {
3176  assert_param(IS_UART_ADVFEATURE_DATAINV(huart->AdvancedInit.DataInvert));
3177  MODIFY_REG(huart->Instance->CR2, USART_CR2_DATAINV, huart->AdvancedInit.DataInvert);
3178  }
3179 
3180  /* if required, configure RX/TX pins swap */
3181  if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_SWAP_INIT))
3182  {
3183  assert_param(IS_UART_ADVFEATURE_SWAP(huart->AdvancedInit.Swap));
3184  MODIFY_REG(huart->Instance->CR2, USART_CR2_SWAP, huart->AdvancedInit.Swap);
3185  }
3186 
3187  /* if required, configure RX overrun detection disabling */
3188  if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_RXOVERRUNDISABLE_INIT))
3189  {
3190  assert_param(IS_UART_OVERRUN(huart->AdvancedInit.OverrunDisable));
3191  MODIFY_REG(huart->Instance->CR3, USART_CR3_OVRDIS, huart->AdvancedInit.OverrunDisable);
3192  }
3193 
3194  /* if required, configure DMA disabling on reception error */
3195  if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_DMADISABLEONERROR_INIT))
3196  {
3197  assert_param(IS_UART_ADVFEATURE_DMAONRXERROR(huart->AdvancedInit.DMADisableonRxError));
3198  MODIFY_REG(huart->Instance->CR3, USART_CR3_DDRE, huart->AdvancedInit.DMADisableonRxError);
3199  }
3200 
3201  /* if required, configure auto Baud rate detection scheme */
3202  if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_AUTOBAUDRATE_INIT))
3203  {
3204  assert_param(IS_USART_AUTOBAUDRATE_DETECTION_INSTANCE(huart->Instance));
3205  assert_param(IS_UART_ADVFEATURE_AUTOBAUDRATE(huart->AdvancedInit.AutoBaudRateEnable));
3206  MODIFY_REG(huart->Instance->CR2, USART_CR2_ABREN, huart->AdvancedInit.AutoBaudRateEnable);
3207  /* set auto Baudrate detection parameters if detection is enabled */
3208  if (huart->AdvancedInit.AutoBaudRateEnable == UART_ADVFEATURE_AUTOBAUDRATE_ENABLE)
3209  {
3210  assert_param(IS_UART_ADVFEATURE_AUTOBAUDRATEMODE(huart->AdvancedInit.AutoBaudRateMode));
3211  MODIFY_REG(huart->Instance->CR2, USART_CR2_ABRMODE, huart->AdvancedInit.AutoBaudRateMode);
3212  }
3213  }
3214 
3215  /* if required, configure MSB first on communication line */
3216  if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_MSBFIRST_INIT))
3217  {
3218  assert_param(IS_UART_ADVFEATURE_MSBFIRST(huart->AdvancedInit.MSBFirst));
3219  MODIFY_REG(huart->Instance->CR2, USART_CR2_MSBFIRST, huart->AdvancedInit.MSBFirst);
3220  }
3221 }
3222 
3228 HAL_StatusTypeDef UART_CheckIdleState(UART_HandleTypeDef *huart)
3229 {
3230  uint32_t tickstart;
3231 
3232  /* Initialize the UART ErrorCode */
3233  huart->ErrorCode = HAL_UART_ERROR_NONE;
3234 
3235  /* Init tickstart for timeout managment*/
3236  tickstart = HAL_GetTick();
3237 
3238  /* Check if the Transmitter is enabled */
3239  if ((huart->Instance->CR1 & USART_CR1_TE) == USART_CR1_TE)
3240  {
3241  /* Wait until TEACK flag is set */
3242  if (UART_WaitOnFlagUntilTimeout(huart, USART_ISR_TEACK, RESET, tickstart, HAL_UART_TIMEOUT_VALUE) != HAL_OK)
3243  {
3244  /* Timeout occurred */
3245  return HAL_TIMEOUT;
3246  }
3247  }
3248 
3249  /* Check if the Receiver is enabled */
3250  if ((huart->Instance->CR1 & USART_CR1_RE) == USART_CR1_RE)
3251  {
3252  /* Wait until REACK flag is set */
3253  if (UART_WaitOnFlagUntilTimeout(huart, USART_ISR_REACK, RESET, tickstart, HAL_UART_TIMEOUT_VALUE) != HAL_OK)
3254  {
3255  /* Timeout occurred */
3256  return HAL_TIMEOUT;
3257  }
3258  }
3259 
3260  /* Initialize the UART State */
3261  huart->gState = HAL_UART_STATE_READY;
3262  huart->RxState = HAL_UART_STATE_READY;
3263 
3264  __HAL_UNLOCK(huart);
3265 
3266  return HAL_OK;
3267 }
3268 
3278 HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status,
3279  uint32_t Tickstart, uint32_t Timeout)
3280 {
3281  /* Wait until flag is set */
3282  while ((__HAL_UART_GET_FLAG(huart, Flag) ? SET : RESET) == Status)
3283  {
3284  /* Check for the Timeout */
3285  if (Timeout != HAL_MAX_DELAY)
3286  {
3287  if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
3288  {
3289  /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */
3290 #if defined(USART_CR1_FIFOEN)
3291  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_TXEIE_TXFNFIE));
3292 #else
3293  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE));
3294 #endif /* USART_CR1_FIFOEN */
3295  CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
3296 
3297  huart->gState = HAL_UART_STATE_READY;
3298  huart->RxState = HAL_UART_STATE_READY;
3299 
3300  __HAL_UNLOCK(huart);
3301 
3302  return HAL_TIMEOUT;
3303  }
3304  }
3305  }
3306  return HAL_OK;
3307 }
3308 
3309 
3316 {
3317 #if defined(USART_CR1_FIFOEN)
3318  /* Disable TXEIE, TCIE, TXFT interrupts */
3319  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TXEIE_TXFNFIE | USART_CR1_TCIE));
3320  CLEAR_BIT(huart->Instance->CR3, (USART_CR3_TXFTIE));
3321 #else
3322  /* Disable TXEIE and TCIE interrupts */
3323  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE));
3324 #endif /* USART_CR1_FIFOEN */
3325 
3326  /* At end of Tx process, restore huart->gState to Ready */
3327  huart->gState = HAL_UART_STATE_READY;
3328 }
3329 
3330 
3337 {
3338  /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
3339 #if defined(USART_CR1_FIFOEN)
3340  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE));
3341  CLEAR_BIT(huart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE));
3342 #else
3343  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
3344  CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
3345 #endif /* USART_CR1_FIFOEN */
3346 
3347  /* At end of Rx process, restore huart->RxState to Ready */
3348  huart->RxState = HAL_UART_STATE_READY;
3349 
3350  /* Reset RxIsr function pointer */
3351  huart->RxISR = NULL;
3352 }
3353 
3354 
3361 {
3362  UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent);
3363 
3364  /* DMA Normal mode */
3365  if (HAL_IS_BIT_CLR(hdma->Instance->CCR, DMA_CCR_CIRC))
3366  {
3367  huart->TxXferCount = 0U;
3368 
3369  /* Disable the DMA transfer for transmit request by resetting the DMAT bit
3370  in the UART CR3 register */
3371  CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT);
3372 
3373  /* Enable the UART Transmit Complete Interrupt */
3374  SET_BIT(huart->Instance->CR1, USART_CR1_TCIE);
3375  }
3376  /* DMA Circular mode */
3377  else
3378  {
3379 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3380  /*Call registered Tx complete callback*/
3381  huart->TxCpltCallback(huart);
3382 #else
3383  /*Call legacy weak Tx complete callback*/
3384  HAL_UART_TxCpltCallback(huart);
3385 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3386  }
3387 }
3388 
3395 {
3396  UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent);
3397 
3398 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3399  /*Call registered Tx Half complete callback*/
3400  huart->TxHalfCpltCallback(huart);
3401 #else
3402  /*Call legacy weak Tx Half complete callback*/
3404 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3405 }
3406 
3413 {
3414  UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent);
3415 
3416  /* DMA Normal mode */
3417  if (HAL_IS_BIT_CLR(hdma->Instance->CCR, DMA_CCR_CIRC))
3418  {
3419  huart->RxXferCount = 0U;
3420 
3421  /* Disable PE and ERR (Frame error, noise error, overrun error) interrupts */
3422  CLEAR_BIT(huart->Instance->CR1, USART_CR1_PEIE);
3423  CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
3424 
3425  /* Disable the DMA transfer for the receiver request by resetting the DMAR bit
3426  in the UART CR3 register */
3427  CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);
3428 
3429  /* At end of Rx process, restore huart->RxState to Ready */
3430  huart->RxState = HAL_UART_STATE_READY;
3431  }
3432 
3433 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3434  /*Call registered Rx complete callback*/
3435  huart->RxCpltCallback(huart);
3436 #else
3437  /*Call legacy weak Rx complete callback*/
3438  HAL_UART_RxCpltCallback(huart);
3439 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3440 }
3441 
3448 {
3449  UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent);
3450 
3451 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3452  /*Call registered Rx Half complete callback*/
3453  huart->RxHalfCpltCallback(huart);
3454 #else
3455  /*Call legacy weak Rx Half complete callback*/
3457 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3458 }
3459 
3466 {
3467  UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent);
3468 
3469  const HAL_UART_StateTypeDef gstate = huart->gState;
3470  const HAL_UART_StateTypeDef rxstate = huart->RxState;
3471 
3472  /* Stop UART DMA Tx request if ongoing */
3473  if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT)) &&
3474  (gstate == HAL_UART_STATE_BUSY_TX))
3475  {
3476  huart->TxXferCount = 0U;
3477  UART_EndTxTransfer(huart);
3478  }
3479 
3480  /* Stop UART DMA Rx request if ongoing */
3481  if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) &&
3482  (rxstate == HAL_UART_STATE_BUSY_RX))
3483  {
3484  huart->RxXferCount = 0U;
3485  UART_EndRxTransfer(huart);
3486  }
3487 
3488  huart->ErrorCode |= HAL_UART_ERROR_DMA;
3489 
3490 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3491  /*Call registered error callback*/
3492  huart->ErrorCallback(huart);
3493 #else
3494  /*Call legacy weak error callback*/
3495  HAL_UART_ErrorCallback(huart);
3496 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3497 }
3498 
3506 {
3507  UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent);
3508  huart->RxXferCount = 0U;
3509  huart->TxXferCount = 0U;
3510 
3511 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3512  /*Call registered error callback*/
3513  huart->ErrorCallback(huart);
3514 #else
3515  /*Call legacy weak error callback*/
3516  HAL_UART_ErrorCallback(huart);
3517 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3518 }
3519 
3529 {
3530  UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent);
3531 
3532  huart->hdmatx->XferAbortCallback = NULL;
3533 
3534  /* Check if an Abort process is still ongoing */
3535  if (huart->hdmarx != NULL)
3536  {
3537  if (huart->hdmarx->XferAbortCallback != NULL)
3538  {
3539  return;
3540  }
3541  }
3542 
3543  /* No Abort process still ongoing : All DMA channels are aborted, call user Abort Complete callback */
3544  huart->TxXferCount = 0U;
3545  huart->RxXferCount = 0U;
3546 
3547  /* Reset errorCode */
3548  huart->ErrorCode = HAL_UART_ERROR_NONE;
3549 
3550  /* Clear the Error flags in the ICR register */
3551  __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF | UART_CLEAR_NEF | UART_CLEAR_PEF | UART_CLEAR_FEF);
3552 
3553 #if defined(USART_CR1_FIFOEN)
3554  /* Flush the whole TX FIFO (if needed) */
3555  if (huart->FifoMode == UART_FIFOMODE_ENABLE)
3556  {
3557  __HAL_UART_SEND_REQ(huart, UART_TXDATA_FLUSH_REQUEST);
3558  }
3559 #endif /* USART_CR1_FIFOEN */
3560 
3561  /* Restore huart->gState and huart->RxState to Ready */
3562  huart->gState = HAL_UART_STATE_READY;
3563  huart->RxState = HAL_UART_STATE_READY;
3564 
3565  /* Call user Abort complete callback */
3566 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3567  /* Call registered Abort complete callback */
3568  huart->AbortCpltCallback(huart);
3569 #else
3570  /* Call legacy weak Abort complete callback */
3572 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3573 }
3574 
3575 
3585 {
3586  UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent);
3587 
3588  huart->hdmarx->XferAbortCallback = NULL;
3589 
3590  /* Check if an Abort process is still ongoing */
3591  if (huart->hdmatx != NULL)
3592  {
3593  if (huart->hdmatx->XferAbortCallback != NULL)
3594  {
3595  return;
3596  }
3597  }
3598 
3599  /* No Abort process still ongoing : All DMA channels are aborted, call user Abort Complete callback */
3600  huart->TxXferCount = 0U;
3601  huart->RxXferCount = 0U;
3602 
3603  /* Reset errorCode */
3604  huart->ErrorCode = HAL_UART_ERROR_NONE;
3605 
3606  /* Clear the Error flags in the ICR register */
3607  __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF | UART_CLEAR_NEF | UART_CLEAR_PEF | UART_CLEAR_FEF);
3608 
3609  /* Discard the received data */
3610  __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
3611 
3612  /* Restore huart->gState and huart->RxState to Ready */
3613  huart->gState = HAL_UART_STATE_READY;
3614  huart->RxState = HAL_UART_STATE_READY;
3615 
3616  /* Call user Abort complete callback */
3617 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3618  /* Call registered Abort complete callback */
3619  huart->AbortCpltCallback(huart);
3620 #else
3621  /* Call legacy weak Abort complete callback */
3623 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3624 }
3625 
3626 
3636 {
3637  UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent);
3638 
3639  huart->TxXferCount = 0U;
3640 
3641 #if defined(USART_CR1_FIFOEN)
3642  /* Flush the whole TX FIFO (if needed) */
3643  if (huart->FifoMode == UART_FIFOMODE_ENABLE)
3644  {
3645  __HAL_UART_SEND_REQ(huart, UART_TXDATA_FLUSH_REQUEST);
3646  }
3647 #endif /* USART_CR1_FIFOEN */
3648 
3649  /* Restore huart->gState to Ready */
3650  huart->gState = HAL_UART_STATE_READY;
3651 
3652  /* Call user Abort complete callback */
3653 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3654  /* Call registered Abort Transmit Complete Callback */
3655  huart->AbortTransmitCpltCallback(huart);
3656 #else
3657  /* Call legacy weak Abort Transmit Complete Callback */
3659 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3660 }
3661 
3671 {
3672  UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
3673 
3674  huart->RxXferCount = 0U;
3675 
3676  /* Clear the Error flags in the ICR register */
3677  __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF | UART_CLEAR_NEF | UART_CLEAR_PEF | UART_CLEAR_FEF);
3678 
3679  /* Discard the received data */
3680  __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
3681 
3682  /* Restore huart->RxState to Ready */
3683  huart->RxState = HAL_UART_STATE_READY;
3684 
3685  /* Call user Abort complete callback */
3686 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3687  /* Call registered Abort Receive Complete Callback */
3688  huart->AbortReceiveCpltCallback(huart);
3689 #else
3690  /* Call legacy weak Abort Receive Complete Callback */
3692 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3693 }
3694 
3703 {
3704  /* Check that a Tx process is ongoing */
3705  if (huart->gState == HAL_UART_STATE_BUSY_TX)
3706  {
3707  if (huart->TxXferCount == 0U)
3708  {
3709  /* Disable the UART Transmit Data Register Empty Interrupt */
3710 #if defined(USART_CR1_FIFOEN)
3711  CLEAR_BIT(huart->Instance->CR1, USART_CR1_TXEIE_TXFNFIE);
3712 #else
3713  CLEAR_BIT(huart->Instance->CR1, USART_CR1_TXEIE);
3714 #endif /* USART_CR1_FIFOEN */
3715 
3716  /* Enable the UART Transmit Complete Interrupt */
3717  SET_BIT(huart->Instance->CR1, USART_CR1_TCIE);
3718  }
3719  else
3720  {
3721  huart->Instance->TDR = (uint8_t)(*huart->pTxBuffPtr & (uint8_t)0xFF);
3722  huart->pTxBuffPtr++;
3723  huart->TxXferCount--;
3724  }
3725  }
3726 }
3727 
3736 {
3737  uint16_t *tmp;
3738 
3739  /* Check that a Tx process is ongoing */
3740  if (huart->gState == HAL_UART_STATE_BUSY_TX)
3741  {
3742  if (huart->TxXferCount == 0U)
3743  {
3744  /* Disable the UART Transmit Data Register Empty Interrupt */
3745 #if defined(USART_CR1_FIFOEN)
3746  CLEAR_BIT(huart->Instance->CR1, USART_CR1_TXEIE_TXFNFIE);
3747 #else
3748  CLEAR_BIT(huart->Instance->CR1, USART_CR1_TXEIE);
3749 #endif /* USART_CR1_FIFOEN */
3750 
3751  /* Enable the UART Transmit Complete Interrupt */
3752  SET_BIT(huart->Instance->CR1, USART_CR1_TCIE);
3753  }
3754  else
3755  {
3756  tmp = (uint16_t *) huart->pTxBuffPtr;
3757  huart->Instance->TDR = (((uint32_t)(*tmp)) & 0x01FFUL);
3758  huart->pTxBuffPtr += 2U;
3759  huart->TxXferCount--;
3760  }
3761  }
3762 }
3763 
3764 #if defined(USART_CR1_FIFOEN)
3765 
3773 {
3774  uint16_t nb_tx_data;
3775 
3776  /* Check that a Tx process is ongoing */
3777  if (huart->gState == HAL_UART_STATE_BUSY_TX)
3778  {
3779  for (nb_tx_data = huart->NbTxDataToProcess ; nb_tx_data > 0U ; nb_tx_data--)
3780  {
3781  if (huart->TxXferCount == 0U)
3782  {
3783  /* Disable the TX FIFO threshold interrupt */
3784  CLEAR_BIT(huart->Instance->CR3, USART_CR3_TXFTIE);
3785 
3786  /* Enable the UART Transmit Complete Interrupt */
3787  SET_BIT(huart->Instance->CR1, USART_CR1_TCIE);
3788 
3789  break; /* force exit loop */
3790  }
3791  else if (READ_BIT(huart->Instance->ISR, USART_ISR_TXE_TXFNF) != 0U)
3792  {
3793  huart->Instance->TDR = (uint8_t)(*huart->pTxBuffPtr & (uint8_t)0xFF);
3794  huart->pTxBuffPtr++;
3795  huart->TxXferCount--;
3796  }
3797  else
3798  {
3799  /* Nothing to do */
3800  }
3801  }
3802  }
3803 }
3804 
3813 {
3814  uint16_t *tmp;
3815  uint16_t nb_tx_data;
3816 
3817  /* Check that a Tx process is ongoing */
3818  if (huart->gState == HAL_UART_STATE_BUSY_TX)
3819  {
3820  for (nb_tx_data = huart->NbTxDataToProcess ; nb_tx_data > 0U ; nb_tx_data--)
3821  {
3822  if (huart->TxXferCount == 0U)
3823  {
3824  /* Disable the TX FIFO threshold interrupt */
3825  CLEAR_BIT(huart->Instance->CR3, USART_CR3_TXFTIE);
3826 
3827  /* Enable the UART Transmit Complete Interrupt */
3828  SET_BIT(huart->Instance->CR1, USART_CR1_TCIE);
3829 
3830  break; /* force exit loop */
3831  }
3832  else if (READ_BIT(huart->Instance->ISR, USART_ISR_TXE_TXFNF) != 0U)
3833  {
3834  tmp = (uint16_t *) huart->pTxBuffPtr;
3835  huart->Instance->TDR = (((uint32_t)(*tmp)) & 0x01FFUL);
3836  huart->pTxBuffPtr += 2U;
3837  huart->TxXferCount--;
3838  }
3839  else
3840  {
3841  /* Nothing to do */
3842  }
3843  }
3844  }
3845 }
3846 #endif /* USART_CR1_FIFOEN */
3847 
3855 {
3856  /* Disable the UART Transmit Complete Interrupt */
3857  CLEAR_BIT(huart->Instance->CR1, USART_CR1_TCIE);
3858 
3859  /* Tx process is ended, restore huart->gState to Ready */
3860  huart->gState = HAL_UART_STATE_READY;
3861 
3862  /* Cleat TxISR function pointer */
3863  huart->TxISR = NULL;
3864 
3865 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3866  /*Call registered Tx complete callback*/
3867  huart->TxCpltCallback(huart);
3868 #else
3869  /*Call legacy weak Tx complete callback*/
3870  HAL_UART_TxCpltCallback(huart);
3871 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3872 }
3873 
3880 {
3881  uint16_t uhMask = huart->Mask;
3882  uint16_t uhdata;
3883 
3884  /* Check that a Rx process is ongoing */
3885  if (huart->RxState == HAL_UART_STATE_BUSY_RX)
3886  {
3887  uhdata = (uint16_t) READ_REG(huart->Instance->RDR);
3888  *huart->pRxBuffPtr = (uint8_t)(uhdata & (uint8_t)uhMask);
3889  huart->pRxBuffPtr++;
3890  huart->RxXferCount--;
3891 
3892  if (huart->RxXferCount == 0U)
3893  {
3894  /* Disable the UART Parity Error Interrupt and RXNE interrupts */
3895 #if defined(USART_CR1_FIFOEN)
3896  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE));
3897 #else
3898  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
3899 #endif /* USART_CR1_FIFOEN */
3900 
3901  /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
3902  CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
3903 
3904  /* Rx process is completed, restore huart->RxState to Ready */
3905  huart->RxState = HAL_UART_STATE_READY;
3906 
3907  /* Clear RxISR function pointer */
3908  huart->RxISR = NULL;
3909 
3910 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3911  /*Call registered Rx complete callback*/
3912  huart->RxCpltCallback(huart);
3913 #else
3914  /*Call legacy weak Rx complete callback*/
3915  HAL_UART_RxCpltCallback(huart);
3916 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3917  }
3918  }
3919  else
3920  {
3921  /* Clear RXNE interrupt flag */
3922  __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
3923  }
3924 }
3925 
3934 {
3935  uint16_t *tmp;
3936  uint16_t uhMask = huart->Mask;
3937  uint16_t uhdata;
3938 
3939  /* Check that a Rx process is ongoing */
3940  if (huart->RxState == HAL_UART_STATE_BUSY_RX)
3941  {
3942  uhdata = (uint16_t) READ_REG(huart->Instance->RDR);
3943  tmp = (uint16_t *) huart->pRxBuffPtr ;
3944  *tmp = (uint16_t)(uhdata & uhMask);
3945  huart->pRxBuffPtr += 2U;
3946  huart->RxXferCount--;
3947 
3948  if (huart->RxXferCount == 0U)
3949  {
3950  /* Disable the UART Parity Error Interrupt and RXNE interrupt*/
3951 #if defined(USART_CR1_FIFOEN)
3952  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE));
3953 #else
3954  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
3955 #endif /* USART_CR1_FIFOEN */
3956 
3957  /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
3958  CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
3959 
3960  /* Rx process is completed, restore huart->RxState to Ready */
3961  huart->RxState = HAL_UART_STATE_READY;
3962 
3963  /* Clear RxISR function pointer */
3964  huart->RxISR = NULL;
3965 
3966 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3967  /*Call registered Rx complete callback*/
3968  huart->RxCpltCallback(huart);
3969 #else
3970  /*Call legacy weak Rx complete callback*/
3971  HAL_UART_RxCpltCallback(huart);
3972 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3973  }
3974  }
3975  else
3976  {
3977  /* Clear RXNE interrupt flag */
3978  __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
3979  }
3980 }
3981 
3982 #if defined(USART_CR1_FIFOEN)
3983 
3991 {
3992  uint16_t uhMask = huart->Mask;
3993  uint16_t uhdata;
3994  uint16_t nb_rx_data;
3995  uint16_t rxdatacount;
3996 
3997  /* Check that a Rx process is ongoing */
3998  if (huart->RxState == HAL_UART_STATE_BUSY_RX)
3999  {
4000  for (nb_rx_data = huart->NbRxDataToProcess ; nb_rx_data > 0U ; nb_rx_data--)
4001  {
4002  uhdata = (uint16_t) READ_REG(huart->Instance->RDR);
4003  *huart->pRxBuffPtr = (uint8_t)(uhdata & (uint8_t)uhMask);
4004  huart->pRxBuffPtr++;
4005  huart->RxXferCount--;
4006 
4007  if (huart->RxXferCount == 0U)
4008  {
4009  /* Disable the UART Parity Error Interrupt and RXFT interrupt*/
4010  CLEAR_BIT(huart->Instance->CR1, USART_CR1_PEIE);
4011 
4012  /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) and RX FIFO Threshold interrupt */
4013  CLEAR_BIT(huart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE));
4014 
4015  /* Rx process is completed, restore huart->RxState to Ready */
4016  huart->RxState = HAL_UART_STATE_READY;
4017 
4018  /* Clear RxISR function pointer */
4019  huart->RxISR = NULL;
4020 
4021 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
4022  /*Call registered Rx complete callback*/
4023  huart->RxCpltCallback(huart);
4024 #else
4025  /*Call legacy weak Rx complete callback*/
4026  HAL_UART_RxCpltCallback(huart);
4027 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
4028  }
4029  }
4030 
4031  /* When remaining number of bytes to receive is less than the RX FIFO
4032  threshold, next incoming frames are processed as if FIFO mode was
4033  disabled (i.e. one interrupt per received frame).
4034  */
4035  rxdatacount = huart->RxXferCount;
4036  if ((rxdatacount != 0U) && (rxdatacount < huart->NbRxDataToProcess))
4037  {
4038  /* Disable the UART RXFT interrupt*/
4039  CLEAR_BIT(huart->Instance->CR3, USART_CR3_RXFTIE);
4040 
4041  /* Update the RxISR function pointer */
4042  huart->RxISR = UART_RxISR_8BIT;
4043 
4044  /* Enable the UART Data Register Not Empty interrupt */
4045  SET_BIT(huart->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE);
4046  }
4047  }
4048  else
4049  {
4050  /* Clear RXNE interrupt flag */
4051  __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
4052  }
4053 }
4054 
4063 {
4064  uint16_t *tmp;
4065  uint16_t uhMask = huart->Mask;
4066  uint16_t uhdata;
4067  uint16_t nb_rx_data;
4068  uint16_t rxdatacount;
4069 
4070  /* Check that a Rx process is ongoing */
4071  if (huart->RxState == HAL_UART_STATE_BUSY_RX)
4072  {
4073  for (nb_rx_data = huart->NbRxDataToProcess ; nb_rx_data > 0U ; nb_rx_data--)
4074  {
4075  uhdata = (uint16_t) READ_REG(huart->Instance->RDR);
4076  tmp = (uint16_t *) huart->pRxBuffPtr ;
4077  *tmp = (uint16_t)(uhdata & uhMask);
4078  huart->pRxBuffPtr += 2U;
4079  huart->RxXferCount--;
4080 
4081  if (huart->RxXferCount == 0U)
4082  {
4083  /* Disable the UART Parity Error Interrupt and RXFT interrupt*/
4084  CLEAR_BIT(huart->Instance->CR1, USART_CR1_PEIE);
4085 
4086  /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) and RX FIFO Threshold interrupt */
4087  CLEAR_BIT(huart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE));
4088 
4089  /* Rx process is completed, restore huart->RxState to Ready */
4090  huart->RxState = HAL_UART_STATE_READY;
4091 
4092  /* Clear RxISR function pointer */
4093  huart->RxISR = NULL;
4094 
4095 #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
4096  /*Call registered Rx complete callback*/
4097  huart->RxCpltCallback(huart);
4098 #else
4099  /*Call legacy weak Rx complete callback*/
4100  HAL_UART_RxCpltCallback(huart);
4101 #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
4102  }
4103  }
4104 
4105  /* When remaining number of bytes to receive is less than the RX FIFO
4106  threshold, next incoming frames are processed as if FIFO mode was
4107  disabled (i.e. one interrupt per received frame).
4108  */
4109  rxdatacount = huart->RxXferCount;
4110  if ((rxdatacount != 0U) && (rxdatacount < huart->NbRxDataToProcess))
4111  {
4112  /* Disable the UART RXFT interrupt*/
4113  CLEAR_BIT(huart->Instance->CR3, USART_CR3_RXFTIE);
4114 
4115  /* Update the RxISR function pointer */
4116  huart->RxISR = UART_RxISR_16BIT;
4117 
4118  /* Enable the UART Data Register Not Empty interrupt */
4119  SET_BIT(huart->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE);
4120  }
4121  }
4122  else
4123  {
4124  /* Clear RXNE interrupt flag */
4125  __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
4126  }
4127 }
4128 #endif /* USART_CR1_FIFOEN */
4129 
4134 #endif /* HAL_UART_MODULE_ENABLED */
4135 
4143 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
Receive an amount of data in DMA mode.
void(* TxFifoEmptyCallback)(struct __UART_HandleTypeDef *huart)
static void UART_RxISR_16BIT_FIFOEN(UART_HandleTypeDef *huart)
RX interrrupt handler for 9 bits data word length and FIFO mode is enabled.
static void UART_DMATxOnlyAbortCallback(DMA_HandleTypeDef *hdma)
DMA UART Tx communication abort callback, when initiated by user by a call to HAL_UART_AbortTransmit_...
void(* TxISR)(struct __UART_HandleTypeDef *huart)
HAL_StatusTypeDef HAL_MultiProcessor_Init(UART_HandleTypeDef *huart, uint8_t Address, uint32_t WakeUpMethod)
Initialize the multiprocessor mode according to the specified parameters in the UART_InitTypeDef and ...
register uint32_t brrtemp
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
UART handle Structure definition.
void HAL_UARTEx_TxFifoEmptyCallback(UART_HandleTypeDef *huart)
UART TX Fifo empty callback.
__IO HAL_UART_StateTypeDef RxState
void(* RxCpltCallback)(struct __UART_HandleTypeDef *huart)
HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID, pUART_CallbackTypeDef pCallback)
Register a User UART Callback To be used instead of the weak predefined callback. ...
DMA handle Structure definition.
void(* XferCpltCallback)(struct __DMA_HandleTypeDef *hdma)
void(* RxHalfCpltCallback)(struct __UART_HandleTypeDef *huart)
if(lpuartdiv >=LPUART_BRR_MIN_VALUE)
DMA_HandleTypeDef * hdmarx
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
Send an amount of data in blocking mode.
This file contains all the functions prototypes for the HAL module driver.
HAL_StatusTypeDef HAL_MultiProcessor_EnableMuteMode(UART_HandleTypeDef *huart)
Enable UART in mute mode (does not mean UART enters mute mode; to enter mute mode, HAL_MultiProcessor_EnterMuteMode() API must be called).
uint32_t HAL_UART_StateTypeDef
HAL UART State definition.
HAL_StatusTypeDef UART_CheckIdleState(UART_HandleTypeDef *huart)
Check the UART Idle State.
HAL_StatusTypeDef HAL_UART_AbortReceive(UART_HandleTypeDef *huart)
Abort ongoing Receive transfer (blocking mode).
static void UART_DMAAbortOnError(DMA_HandleTypeDef *hdma)
DMA UART communication abort callback, when initiated by HAL services on Error (To be called at end o...
static void UART_DMAError(DMA_HandleTypeDef *hdma)
DMA UART communication error callback.
HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart)
Transmit break characters.
void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart)
Tx Half Transfer completed callback.
void HAL_UART_AbortCpltCallback(UART_HandleTypeDef *huart)
UART Abort Complete callback.
HAL_StatusTypeDef HAL_UART_AbortReceive_IT(UART_HandleTypeDef *huart)
Abort ongoing Receive transfer (Interrupt mode).
void HAL_UARTEx_RxFifoFullCallback(UART_HandleTypeDef *huart)
UART RX Fifo full callback.
uint32_t HAL_GetTick(void)
Provide a tick value in millisecond.
void UART_AdvFeatureConfig(UART_HandleTypeDef *huart)
Configure the UART peripheral advanced features.
DMA_Channel_TypeDef * Instance
void(* XferErrorCallback)(struct __DMA_HandleTypeDef *hdma)
UART_ClockSourceTypeDef
UART clock sources definition.
HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma)
Aborts the DMA Transfer in Interrupt mode.
__HAL_UNLOCK(hrtc)
void(* XferHalfCpltCallback)(struct __DMA_HandleTypeDef *hdma)
static void UART_EndRxTransfer(UART_HandleTypeDef *huart)
End ongoing Rx transfer on UART peripheral (following error detection or Reception completion)...
void(* WakeupCallback)(struct __UART_HandleTypeDef *huart)
HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart)
Initialize the UART mode according to the specified parameters in the UART_InitTypeDef and initialize...
void(* pUART_CallbackTypeDef)(UART_HandleTypeDef *huart)
HAL UART Callback pointer definition.
uint32_t HAL_RCC_GetPCLK2Freq(void)
Return the PCLK2 frequency.
static void UART_TxISR_8BIT_FIFOEN(UART_HandleTypeDef *huart)
TX interrrupt handler for 7 or 8 bits data word length and FIFO mode is enabled.
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
Start the DMA Transfer with interrupt enabled.
static void UART_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
DMA UART receive process complete callback.
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart)
UART Abort Receive Complete callback.
HAL_StatusTypeDef HAL_UART_AbortTransmit(UART_HandleTypeDef *huart)
Abort ongoing Transmit transfer (blocking mode).
__HAL_LOCK(hrtc)
static void UART_DMARxAbortCallback(DMA_HandleTypeDef *hdma)
DMA UART Rx communication abort callback, when initiated by user (To be called at end of DMA Rx Abort...
void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
Handle UART interrupt request.
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
Receive an amount of data in blocking mode.
HAL_StatusTypeDef HAL_UART_AbortTransmit_IT(UART_HandleTypeDef *huart)
Abort ongoing Transmit transfer (Interrupt mode).
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
Initialize the UART MSP.
HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart)
Pause the DMA Transfer.
HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart)
Resume the DMA Transfer.
HAL_UART_StateTypeDef HAL_UART_GetState(UART_HandleTypeDef *huart)
Return the UART handle state.
HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID)
Unregister an UART Callback UART callaback is redirected to the weak predefined callback.
HAL_StatusTypeDef HAL_MultiProcessor_DisableMuteMode(UART_HandleTypeDef *huart)
Disable UART mute mode (does not mean the UART actually exits mute mode as it may not have been in mu...
return HAL_OK
static void UART_RxISR_8BIT_FIFOEN(UART_HandleTypeDef *huart)
RX interrrupt handler for 7 or 8 bits data word length and FIFO mode is enabled.
USART_TypeDef * Instance
HAL_StatusTypeDef HAL_HalfDuplex_EnableReceiver(UART_HandleTypeDef *huart)
Enable the UART receiver and disable the UART transmitter.
HAL_StatusTypeDef HAL_HalfDuplex_Init(UART_HandleTypeDef *huart)
Initialize the half-duplex mode according to the specified parameters in the UART_InitTypeDef and cre...
HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma)
Abort the DMA Transfer.
HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart)
Stop the DMA Transfer.
void(* TxCpltCallback)(struct __UART_HandleTypeDef *huart)
HAL_StatusTypeDef HAL_HalfDuplex_EnableTransmitter(UART_HandleTypeDef *huart)
Enable the UART transmitter and disable the UART receiver.
static void UART_DMATxAbortCallback(DMA_HandleTypeDef *hdma)
DMA UART Tx communication abort callback, when initiated by user (To be called at end of DMA Tx Abort...
void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart)
Rx Half Transfer completed callback.
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
Rx Transfer completed callback.
void(* RxISR)(struct __UART_HandleTypeDef *huart)
void(* TxHalfCpltCallback)(struct __UART_HandleTypeDef *huart)
DMA_HandleTypeDef * hdmatx
HAL_StatusTypeDef HAL_UART_DeInit(UART_HandleTypeDef *huart)
DeInitialize the UART peripheral.
static void UART_RxISR_8BIT(UART_HandleTypeDef *huart)
RX interrrupt handler for 7 or 8 bits data word length .
UART_AdvFeatureInitTypeDef AdvancedInit
void(* MspInitCallback)(struct __UART_HandleTypeDef *huart)
void(* ErrorCallback)(struct __UART_HandleTypeDef *huart)
uint32_t HAL_UART_GetError(UART_HandleTypeDef *huart)
Return the UART handle error code.
static void UART_EndTransmit_IT(UART_HandleTypeDef *huart)
Wrap up transmission in non-blocking mode.
static void UART_TxISR_16BIT(UART_HandleTypeDef *huart)
TX interrrupt handler for 9 bits data word length.
void HAL_UARTEx_WakeupCallback(UART_HandleTypeDef *huart)
UART wakeup from Stop mode callback.
void UART_InitCallbacksToDefault(UART_HandleTypeDef *huart)
Initialize the callbacks to their default values.
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
Send an amount of data in interrupt mode.
static void UART_DMATransmitCplt(DMA_HandleTypeDef *hdma)
DMA UART transmit process complete callback.
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
Receive an amount of data in interrupt mode.
void HAL_UART_MspDeInit(UART_HandleTypeDef *huart)
DeInitialize the UART MSP.
void HAL_UART_AbortTransmitCpltCallback(UART_HandleTypeDef *huart)
UART Abort Complete callback.
ADC handle Structure definition.
uint32_t HAL_RCC_GetSysClockFreq(void)
Return the SYSCLK frequency.
HAL_UART_CallbackIDTypeDef
HAL UART Callback ID enumeration definition.
HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef *huart)
Abort ongoing transfers (blocking mode).
MODIFY_REG(hrtc->Instance->CR, RTC_CR_WUCKSEL,(uint32_t) WakeUpClock)
HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout)
Handle UART Communication Timeout.
static void UART_DMARxHalfCplt(DMA_HandleTypeDef *hdma)
DMA UART receive process half complete callback.
static void UART_DMATxHalfCplt(DMA_HandleTypeDef *hdma)
DMA UART transmit process half complete callback.
static void UART_TxISR_16BIT_FIFOEN(UART_HandleTypeDef *huart)
TX interrrupt handler for 9 bits data word length and FIFO mode is enabled.
void(* RxFifoFullCallback)(struct __UART_HandleTypeDef *huart)
HAL_StatusTypeDef HAL_UART_Abort_IT(UART_HandleTypeDef *huart)
Abort ongoing transfers (Interrupt mode).
static void UART_EndTxTransfer(UART_HandleTypeDef *huart)
End ongoing Tx transfer on UART peripheral (following error detection or Transmit completion)...
static void UART_RxISR_16BIT(UART_HandleTypeDef *huart)
RX interrrupt handler for 9 bits data word length .
void(* AbortCpltCallback)(struct __UART_HandleTypeDef *huart)
uint32_t HAL_RCC_GetPCLK1Freq(void)
Return the PCLK1 frequency.
void HAL_MultiProcessor_EnterMuteMode(UART_HandleTypeDef *huart)
Enter UART mute mode (means UART actually enters mute mode).
static void UART_DMARxOnlyAbortCallback(DMA_HandleTypeDef *hdma)
DMA UART Rx communication abort callback, when initiated by user by a call to HAL_UART_AbortReceive_I...
void(* MspDeInitCallback)(struct __UART_HandleTypeDef *huart)
HAL_StatusTypeDef HAL_LIN_Init(UART_HandleTypeDef *huart, uint32_t BreakDetectLength)
Initialize the LIN mode according to the specified parameters in the UART_InitTypeDef and creates the...
void(* AbortTransmitCpltCallback)(struct __UART_HandleTypeDef *huart)
void(* AbortReceiveCpltCallback)(struct __UART_HandleTypeDef *huart)
HAL_StatusTypeDef UART_SetConfig(UART_HandleTypeDef *huart)
Configure the UART peripheral.
assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock))
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
Tx Transfer completed callback.
__IO HAL_UART_StateTypeDef gState
HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
Send an amount of data in DMA mode.
static void UART_TxISR_8BIT(UART_HandleTypeDef *huart)
TX interrrupt handler for 7 or 8 bits data word length .
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
UART error callback.
uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma)
Return the DMA error code.