STM32F4xx HAL Documentation
Hardware Abstraction Layer for STM32F4 familiy
Loading...
Searching...
No Matches
stm32f4xx_hal_uart.c
Go to the documentation of this file.
1
257/* Includes ------------------------------------------------------------------*/
258#include "stm32f4xx_hal.h"
259
268#ifdef HAL_UART_MODULE_ENABLED
269
270/* Private typedef -----------------------------------------------------------*/
271/* Private define ------------------------------------------------------------*/
278/* Private macro -------------------------------------------------------------*/
279/* Private variables ---------------------------------------------------------*/
280/* Private function prototypes -----------------------------------------------*/
285#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
286void UART_InitCallbacksToDefault(UART_HandleTypeDef *huart);
287#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
288static void UART_EndTxTransfer(UART_HandleTypeDef *huart);
289static void UART_EndRxTransfer(UART_HandleTypeDef *huart);
290static void UART_DMATransmitCplt(DMA_HandleTypeDef *hdma);
291static void UART_DMAReceiveCplt(DMA_HandleTypeDef *hdma);
292static void UART_DMATxHalfCplt(DMA_HandleTypeDef *hdma);
293static void UART_DMARxHalfCplt(DMA_HandleTypeDef *hdma);
294static void UART_DMAError(DMA_HandleTypeDef *hdma);
295static void UART_DMAAbortOnError(DMA_HandleTypeDef *hdma);
303static HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status,
304 uint32_t Tickstart, uint32_t Timeout);
305static void UART_SetConfig(UART_HandleTypeDef *huart);
306
311/* Exported functions ---------------------------------------------------------*/
358{
359 /* Check the UART handle allocation */
360 if (huart == NULL)
361 {
362 return HAL_ERROR;
363 }
364
365 /* Check the parameters */
366 if (huart->Init.HwFlowCtl != UART_HWCONTROL_NONE)
367 {
368 /* The hardware flow control is available only for USART1, USART2, USART3 and USART6.
369 Except for STM32F446xx devices, that is available for USART1, USART2, USART3, USART6, UART4 and UART5.
370 */
371 assert_param(IS_UART_HWFLOW_INSTANCE(huart->Instance));
373 }
374 else
375 {
376 assert_param(IS_UART_INSTANCE(huart->Instance));
377 }
380
381 if (huart->gState == HAL_UART_STATE_RESET)
382 {
383 /* Allocate lock resource and initialize it */
384 huart->Lock = HAL_UNLOCKED;
385
386#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
387 UART_InitCallbacksToDefault(huart);
388
389 if (huart->MspInitCallback == NULL)
390 {
391 huart->MspInitCallback = HAL_UART_MspInit;
392 }
393
394 /* Init the low level hardware */
395 huart->MspInitCallback(huart);
396#else
397 /* Init the low level hardware : GPIO, CLOCK */
398 HAL_UART_MspInit(huart);
399#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */
400 }
401
403
404 /* Disable the peripheral */
405 __HAL_UART_DISABLE(huart);
406
407 /* Set the UART Communication parameters */
408 UART_SetConfig(huart);
409
410 /* In asynchronous mode, the following bits must be kept cleared:
411 - LINEN and CLKEN bits in the USART_CR2 register,
412 - SCEN, HDSEL and IREN bits in the USART_CR3 register.*/
413 CLEAR_BIT(huart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN));
414 CLEAR_BIT(huart->Instance->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN));
415
416 /* Enable the peripheral */
417 __HAL_UART_ENABLE(huart);
418
419 /* Initialize the UART state */
424
425 return HAL_OK;
426}
427
436{
437 /* Check the UART handle allocation */
438 if (huart == NULL)
439 {
440 return HAL_ERROR;
441 }
442
443 /* Check the parameters */
444 assert_param(IS_UART_HALFDUPLEX_INSTANCE(huart->Instance));
447
448 if (huart->gState == HAL_UART_STATE_RESET)
449 {
450 /* Allocate lock resource and initialize it */
451 huart->Lock = HAL_UNLOCKED;
452
453#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
454 UART_InitCallbacksToDefault(huart);
455
456 if (huart->MspInitCallback == NULL)
457 {
458 huart->MspInitCallback = HAL_UART_MspInit;
459 }
460
461 /* Init the low level hardware */
462 huart->MspInitCallback(huart);
463#else
464 /* Init the low level hardware : GPIO, CLOCK */
465 HAL_UART_MspInit(huart);
466#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */
467 }
468
470
471 /* Disable the peripheral */
472 __HAL_UART_DISABLE(huart);
473
474 /* Set the UART Communication parameters */
475 UART_SetConfig(huart);
476
477 /* In half-duplex mode, the following bits must be kept cleared:
478 - LINEN and CLKEN bits in the USART_CR2 register,
479 - SCEN and IREN bits in the USART_CR3 register.*/
480 CLEAR_BIT(huart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN));
481 CLEAR_BIT(huart->Instance->CR3, (USART_CR3_IREN | USART_CR3_SCEN));
482
483 /* Enable the Half-Duplex mode by setting the HDSEL bit in the CR3 register */
484 SET_BIT(huart->Instance->CR3, USART_CR3_HDSEL);
485
486 /* Enable the peripheral */
487 __HAL_UART_ENABLE(huart);
488
489 /* Initialize the UART state*/
494
495 return HAL_OK;
496}
497
509HAL_StatusTypeDef HAL_LIN_Init(UART_HandleTypeDef *huart, uint32_t BreakDetectLength)
510{
511 /* Check the UART handle allocation */
512 if (huart == NULL)
513 {
514 return HAL_ERROR;
515 }
516
517 /* Check the LIN UART instance */
518 assert_param(IS_UART_LIN_INSTANCE(huart->Instance));
519
520 /* Check the Break detection length parameter */
524
525 if (huart->gState == HAL_UART_STATE_RESET)
526 {
527 /* Allocate lock resource and initialize it */
528 huart->Lock = HAL_UNLOCKED;
529
530#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
531 UART_InitCallbacksToDefault(huart);
532
533 if (huart->MspInitCallback == NULL)
534 {
535 huart->MspInitCallback = HAL_UART_MspInit;
536 }
537
538 /* Init the low level hardware */
539 huart->MspInitCallback(huart);
540#else
541 /* Init the low level hardware : GPIO, CLOCK */
542 HAL_UART_MspInit(huart);
543#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */
544 }
545
547
548 /* Disable the peripheral */
549 __HAL_UART_DISABLE(huart);
550
551 /* Set the UART Communication parameters */
552 UART_SetConfig(huart);
553
554 /* In LIN mode, the following bits must be kept cleared:
555 - CLKEN bits in the USART_CR2 register,
556 - SCEN, HDSEL and IREN bits in the USART_CR3 register.*/
557 CLEAR_BIT(huart->Instance->CR2, (USART_CR2_CLKEN));
558 CLEAR_BIT(huart->Instance->CR3, (USART_CR3_HDSEL | USART_CR3_IREN | USART_CR3_SCEN));
559
560 /* Enable the LIN mode by setting the LINEN bit in the CR2 register */
561 SET_BIT(huart->Instance->CR2, USART_CR2_LINEN);
562
563 /* Set the USART LIN Break detection length. */
564 CLEAR_BIT(huart->Instance->CR2, USART_CR2_LBDL);
565 SET_BIT(huart->Instance->CR2, BreakDetectLength);
566
567 /* Enable the peripheral */
568 __HAL_UART_ENABLE(huart);
569
570 /* Initialize the UART state*/
575
576 return HAL_OK;
577}
578
591HAL_StatusTypeDef HAL_MultiProcessor_Init(UART_HandleTypeDef *huart, uint8_t Address, uint32_t WakeUpMethod)
592{
593 /* Check the UART handle allocation */
594 if (huart == NULL)
595 {
596 return HAL_ERROR;
597 }
598
599 /* Check the parameters */
600 assert_param(IS_UART_INSTANCE(huart->Instance));
601
602 /* Check the Address & wake up method parameters */
603 assert_param(IS_UART_WAKEUPMETHOD(WakeUpMethod));
607
608 if (huart->gState == HAL_UART_STATE_RESET)
609 {
610 /* Allocate lock resource and initialize it */
611 huart->Lock = HAL_UNLOCKED;
612
613#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
614 UART_InitCallbacksToDefault(huart);
615
616 if (huart->MspInitCallback == NULL)
617 {
618 huart->MspInitCallback = HAL_UART_MspInit;
619 }
620
621 /* Init the low level hardware */
622 huart->MspInitCallback(huart);
623#else
624 /* Init the low level hardware : GPIO, CLOCK */
625 HAL_UART_MspInit(huart);
626#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */
627 }
628
630
631 /* Disable the peripheral */
632 __HAL_UART_DISABLE(huart);
633
634 /* Set the UART Communication parameters */
635 UART_SetConfig(huart);
636
637 /* In Multi-Processor mode, the following bits must be kept cleared:
638 - LINEN and CLKEN bits in the USART_CR2 register,
639 - SCEN, HDSEL and IREN bits in the USART_CR3 register */
640 CLEAR_BIT(huart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN));
641 CLEAR_BIT(huart->Instance->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN));
642
643 /* Set the USART address node */
644 CLEAR_BIT(huart->Instance->CR2, USART_CR2_ADD);
645 SET_BIT(huart->Instance->CR2, Address);
646
647 /* Set the wake up method by setting the WAKE bit in the CR1 register */
648 CLEAR_BIT(huart->Instance->CR1, USART_CR1_WAKE);
649 SET_BIT(huart->Instance->CR1, WakeUpMethod);
650
651 /* Enable the peripheral */
652 __HAL_UART_ENABLE(huart);
653
654 /* Initialize the UART state */
659
660 return HAL_OK;
661}
662
670{
671 /* Check the UART handle allocation */
672 if (huart == NULL)
673 {
674 return HAL_ERROR;
675 }
676
677 /* Check the parameters */
678 assert_param(IS_UART_INSTANCE(huart->Instance));
679
681
682 /* Disable the Peripheral */
683 __HAL_UART_DISABLE(huart);
684
685#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
686 if (huart->MspDeInitCallback == NULL)
687 {
688 huart->MspDeInitCallback = HAL_UART_MspDeInit;
689 }
690 /* DeInit the low level hardware */
691 huart->MspDeInitCallback(huart);
692#else
693 /* DeInit the low level hardware */
694 HAL_UART_MspDeInit(huart);
695#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */
696
702
703 /* Process Unlock */
704 __HAL_UNLOCK(huart);
705
706 return HAL_OK;
707}
708
716{
717 /* Prevent unused argument(s) compilation warning */
718 UNUSED(huart);
719 /* NOTE: This function should not be modified, when the callback is needed,
720 the HAL_UART_MspInit could be implemented in the user file
721 */
722}
723
731{
732 /* Prevent unused argument(s) compilation warning */
733 UNUSED(huart);
734 /* NOTE: This function should not be modified, when the callback is needed,
735 the HAL_UART_MspDeInit could be implemented in the user file
736 */
737}
738
739#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
761HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID,
762 pUART_CallbackTypeDef pCallback)
763{
764 HAL_StatusTypeDef status = HAL_OK;
765
766 if (pCallback == NULL)
767 {
768 /* Update the error code */
769 huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK;
770
771 return HAL_ERROR;
772 }
773
774 if (huart->gState == HAL_UART_STATE_READY)
775 {
776 switch (CallbackID)
777 {
778 case HAL_UART_TX_HALFCOMPLETE_CB_ID :
779 huart->TxHalfCpltCallback = pCallback;
780 break;
781
782 case HAL_UART_TX_COMPLETE_CB_ID :
783 huart->TxCpltCallback = pCallback;
784 break;
785
786 case HAL_UART_RX_HALFCOMPLETE_CB_ID :
787 huart->RxHalfCpltCallback = pCallback;
788 break;
789
790 case HAL_UART_RX_COMPLETE_CB_ID :
791 huart->RxCpltCallback = pCallback;
792 break;
793
794 case HAL_UART_ERROR_CB_ID :
795 huart->ErrorCallback = pCallback;
796 break;
797
798 case HAL_UART_ABORT_COMPLETE_CB_ID :
799 huart->AbortCpltCallback = pCallback;
800 break;
801
802 case HAL_UART_ABORT_TRANSMIT_COMPLETE_CB_ID :
803 huart->AbortTransmitCpltCallback = pCallback;
804 break;
805
806 case HAL_UART_ABORT_RECEIVE_COMPLETE_CB_ID :
807 huart->AbortReceiveCpltCallback = pCallback;
808 break;
809
810 case HAL_UART_MSPINIT_CB_ID :
811 huart->MspInitCallback = pCallback;
812 break;
813
814 case HAL_UART_MSPDEINIT_CB_ID :
815 huart->MspDeInitCallback = pCallback;
816 break;
817
818 default :
819 /* Update the error code */
820 huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK;
821
822 /* Return error status */
823 status = HAL_ERROR;
824 break;
825 }
826 }
827 else if (huart->gState == HAL_UART_STATE_RESET)
828 {
829 switch (CallbackID)
830 {
831 case HAL_UART_MSPINIT_CB_ID :
832 huart->MspInitCallback = pCallback;
833 break;
834
835 case HAL_UART_MSPDEINIT_CB_ID :
836 huart->MspDeInitCallback = pCallback;
837 break;
838
839 default :
840 /* Update the error code */
841 huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK;
842
843 /* Return error status */
844 status = HAL_ERROR;
845 break;
846 }
847 }
848 else
849 {
850 /* Update the error code */
851 huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK;
852
853 /* Return error status */
854 status = HAL_ERROR;
855 }
856
857 return status;
858}
859
881HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID)
882{
883 HAL_StatusTypeDef status = HAL_OK;
884
885 if (HAL_UART_STATE_READY == huart->gState)
886 {
887 switch (CallbackID)
888 {
889 case HAL_UART_TX_HALFCOMPLETE_CB_ID :
890 huart->TxHalfCpltCallback = HAL_UART_TxHalfCpltCallback; /* Legacy weak TxHalfCpltCallback */
891 break;
892
893 case HAL_UART_TX_COMPLETE_CB_ID :
894 huart->TxCpltCallback = HAL_UART_TxCpltCallback; /* Legacy weak TxCpltCallback */
895 break;
896
897 case HAL_UART_RX_HALFCOMPLETE_CB_ID :
898 huart->RxHalfCpltCallback = HAL_UART_RxHalfCpltCallback; /* Legacy weak RxHalfCpltCallback */
899 break;
900
901 case HAL_UART_RX_COMPLETE_CB_ID :
902 huart->RxCpltCallback = HAL_UART_RxCpltCallback; /* Legacy weak RxCpltCallback */
903 break;
904
905 case HAL_UART_ERROR_CB_ID :
906 huart->ErrorCallback = HAL_UART_ErrorCallback; /* Legacy weak ErrorCallback */
907 break;
908
909 case HAL_UART_ABORT_COMPLETE_CB_ID :
910 huart->AbortCpltCallback = HAL_UART_AbortCpltCallback; /* Legacy weak AbortCpltCallback */
911 break;
912
913 case HAL_UART_ABORT_TRANSMIT_COMPLETE_CB_ID :
914 huart->AbortTransmitCpltCallback = HAL_UART_AbortTransmitCpltCallback; /* Legacy weak AbortTransmitCpltCallback */
915 break;
916
917 case HAL_UART_ABORT_RECEIVE_COMPLETE_CB_ID :
918 huart->AbortReceiveCpltCallback = HAL_UART_AbortReceiveCpltCallback; /* Legacy weak AbortReceiveCpltCallback */
919 break;
920
921 case HAL_UART_MSPINIT_CB_ID :
922 huart->MspInitCallback = HAL_UART_MspInit; /* Legacy weak MspInitCallback */
923 break;
924
925 case HAL_UART_MSPDEINIT_CB_ID :
926 huart->MspDeInitCallback = HAL_UART_MspDeInit; /* Legacy weak MspDeInitCallback */
927 break;
928
929 default :
930 /* Update the error code */
931 huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK;
932
933 /* Return error status */
934 status = HAL_ERROR;
935 break;
936 }
937 }
938 else if (HAL_UART_STATE_RESET == huart->gState)
939 {
940 switch (CallbackID)
941 {
942 case HAL_UART_MSPINIT_CB_ID :
943 huart->MspInitCallback = HAL_UART_MspInit;
944 break;
945
946 case HAL_UART_MSPDEINIT_CB_ID :
947 huart->MspDeInitCallback = HAL_UART_MspDeInit;
948 break;
949
950 default :
951 /* Update the error code */
952 huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK;
953
954 /* Return error status */
955 status = HAL_ERROR;
956 break;
957 }
958 }
959 else
960 {
961 /* Update the error code */
962 huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK;
963
964 /* Return error status */
965 status = HAL_ERROR;
966 }
967
968 return status;
969}
970
978HAL_StatusTypeDef HAL_UART_RegisterRxEventCallback(UART_HandleTypeDef *huart, pUART_RxEventCallbackTypeDef pCallback)
979{
980 HAL_StatusTypeDef status = HAL_OK;
981
982 if (pCallback == NULL)
983 {
984 huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK;
985
986 return HAL_ERROR;
987 }
988
989 /* Process locked */
990 __HAL_LOCK(huart);
991
992 if (huart->gState == HAL_UART_STATE_READY)
993 {
994 huart->RxEventCallback = pCallback;
995 }
996 else
997 {
998 huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK;
999
1000 status = HAL_ERROR;
1001 }
1002
1003 /* Release Lock */
1004 __HAL_UNLOCK(huart);
1005
1006 return status;
1007}
1008
1015HAL_StatusTypeDef HAL_UART_UnRegisterRxEventCallback(UART_HandleTypeDef *huart)
1016{
1017 HAL_StatusTypeDef status = HAL_OK;
1018
1019 /* Process locked */
1020 __HAL_LOCK(huart);
1021
1022 if (huart->gState == HAL_UART_STATE_READY)
1023 {
1024 huart->RxEventCallback = HAL_UARTEx_RxEventCallback; /* Legacy weak UART Rx Event Callback */
1025 }
1026 else
1027 {
1028 huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK;
1029
1030 status = HAL_ERROR;
1031 }
1032
1033 /* Release Lock */
1034 __HAL_UNLOCK(huart);
1035 return status;
1036}
1037#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
1038
1135HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout)
1136{
1137 const uint8_t *pdata8bits;
1138 const uint16_t *pdata16bits;
1139 uint32_t tickstart = 0U;
1140
1141 /* Check that a Tx process is not already ongoing */
1142 if (huart->gState == HAL_UART_STATE_READY)
1143 {
1144 if ((pData == NULL) || (Size == 0U))
1145 {
1146 return HAL_ERROR;
1147 }
1148
1151
1152 /* Init tickstart for timeout management */
1153 tickstart = HAL_GetTick();
1154
1155 huart->TxXferSize = Size;
1156 huart->TxXferCount = Size;
1157
1158 /* In case of 9bits/No Parity transfer, pData needs to be handled as a uint16_t pointer */
1159 if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
1160 {
1161 pdata8bits = NULL;
1162 pdata16bits = (const uint16_t *) pData;
1163 }
1164 else
1165 {
1166 pdata8bits = pData;
1167 pdata16bits = NULL;
1168 }
1169
1170 while (huart->TxXferCount > 0U)
1171 {
1172 if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
1173 {
1175
1176 return HAL_TIMEOUT;
1177 }
1178 if (pdata8bits == NULL)
1179 {
1180 huart->Instance->DR = (uint16_t)(*pdata16bits & 0x01FFU);
1181 pdata16bits++;
1182 }
1183 else
1184 {
1185 huart->Instance->DR = (uint8_t)(*pdata8bits & 0xFFU);
1186 pdata8bits++;
1187 }
1188 huart->TxXferCount--;
1189 }
1190
1191 if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TC, RESET, tickstart, Timeout) != HAL_OK)
1192 {
1194
1195 return HAL_TIMEOUT;
1196 }
1197
1198 /* At end of Tx process, restore huart->gState to Ready */
1200
1201 return HAL_OK;
1202 }
1203 else
1204 {
1205 return HAL_BUSY;
1206 }
1207}
1208
1221HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
1222{
1223 uint8_t *pdata8bits;
1224 uint16_t *pdata16bits;
1225 uint32_t tickstart = 0U;
1226
1227 /* Check that a Rx process is not already ongoing */
1228 if (huart->RxState == HAL_UART_STATE_READY)
1229 {
1230 if ((pData == NULL) || (Size == 0U))
1231 {
1232 return HAL_ERROR;
1233 }
1234
1238
1239 /* Init tickstart for timeout management */
1240 tickstart = HAL_GetTick();
1241
1242 huart->RxXferSize = Size;
1243 huart->RxXferCount = Size;
1244
1245 /* In case of 9bits/No Parity transfer, pRxData needs to be handled as a uint16_t pointer */
1246 if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
1247 {
1248 pdata8bits = NULL;
1249 pdata16bits = (uint16_t *) pData;
1250 }
1251 else
1252 {
1253 pdata8bits = pData;
1254 pdata16bits = NULL;
1255 }
1256
1257 /* Check the remain data to be received */
1258 while (huart->RxXferCount > 0U)
1259 {
1260 if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK)
1261 {
1263
1264 return HAL_TIMEOUT;
1265 }
1266 if (pdata8bits == NULL)
1267 {
1268 *pdata16bits = (uint16_t)(huart->Instance->DR & 0x01FF);
1269 pdata16bits++;
1270 }
1271 else
1272 {
1273 if ((huart->Init.WordLength == UART_WORDLENGTH_9B) || ((huart->Init.WordLength == UART_WORDLENGTH_8B) && (huart->Init.Parity == UART_PARITY_NONE)))
1274 {
1275 *pdata8bits = (uint8_t)(huart->Instance->DR & (uint8_t)0x00FF);
1276 }
1277 else
1278 {
1279 *pdata8bits = (uint8_t)(huart->Instance->DR & (uint8_t)0x007F);
1280 }
1281 pdata8bits++;
1282 }
1283 huart->RxXferCount--;
1284 }
1285
1286 /* At end of Rx process, restore huart->RxState to Ready */
1288
1289 return HAL_OK;
1290 }
1291 else
1292 {
1293 return HAL_BUSY;
1294 }
1295}
1296
1308HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)
1309{
1310 /* Check that a Tx process is not already ongoing */
1311 if (huart->gState == HAL_UART_STATE_READY)
1312 {
1313 if ((pData == NULL) || (Size == 0U))
1314 {
1315 return HAL_ERROR;
1316 }
1317
1318 huart->pTxBuffPtr = pData;
1319 huart->TxXferSize = Size;
1320 huart->TxXferCount = Size;
1321
1324
1325 /* Enable the UART Transmit data register empty Interrupt */
1327
1328 return HAL_OK;
1329 }
1330 else
1331 {
1332 return HAL_BUSY;
1333 }
1334}
1335
1347HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
1348{
1349 /* Check that a Rx process is not already ongoing */
1350 if (huart->RxState == HAL_UART_STATE_READY)
1351 {
1352 if ((pData == NULL) || (Size == 0U))
1353 {
1354 return HAL_ERROR;
1355 }
1356
1357 /* Set Reception type to Standard reception */
1359
1360 return (UART_Start_Receive_IT(huart, pData, Size));
1361 }
1362 else
1363 {
1364 return HAL_BUSY;
1365 }
1366}
1367
1379HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)
1380{
1381 const uint32_t *tmp;
1382
1383 /* Check that a Tx process is not already ongoing */
1384 if (huart->gState == HAL_UART_STATE_READY)
1385 {
1386 if ((pData == NULL) || (Size == 0U))
1387 {
1388 return HAL_ERROR;
1389 }
1390
1391 huart->pTxBuffPtr = pData;
1392 huart->TxXferSize = Size;
1393 huart->TxXferCount = Size;
1394
1397
1398 /* Set the UART DMA transfer complete callback */
1400
1401 /* Set the UART DMA Half transfer complete callback */
1403
1404 /* Set the DMA error callback */
1406
1407 /* Set the DMA abort callback */
1408 huart->hdmatx->XferAbortCallback = NULL;
1409
1410 /* Enable the UART transmit DMA stream */
1411 tmp = (const uint32_t *)&pData;
1412 HAL_DMA_Start_IT(huart->hdmatx, *(const uint32_t *)tmp, (uint32_t)&huart->Instance->DR, Size);
1413
1414 /* Clear the TC flag in the SR register by writing 0 to it */
1416
1417 /* Enable the DMA transfer for transmit request by setting the DMAT bit
1418 in the UART CR3 register */
1419 ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_DMAT);
1420
1421 return HAL_OK;
1422 }
1423 else
1424 {
1425 return HAL_BUSY;
1426 }
1427}
1428
1441HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
1442{
1443 /* Check that a Rx process is not already ongoing */
1444 if (huart->RxState == HAL_UART_STATE_READY)
1445 {
1446 if ((pData == NULL) || (Size == 0U))
1447 {
1448 return HAL_ERROR;
1449 }
1450
1451 /* Set Reception type to Standard reception */
1453
1454 return (UART_Start_Receive_DMA(huart, pData, Size));
1455 }
1456 else
1457 {
1458 return HAL_BUSY;
1459 }
1460}
1461
1469{
1470 uint32_t dmarequest = 0x00U;
1471
1472 dmarequest = HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT);
1473 if ((huart->gState == HAL_UART_STATE_BUSY_TX) && dmarequest)
1474 {
1475 /* Disable the UART DMA Tx request */
1476 ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT);
1477 }
1478
1479 dmarequest = HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR);
1480 if ((huart->RxState == HAL_UART_STATE_BUSY_RX) && dmarequest)
1481 {
1482 /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
1483 ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_PEIE);
1484 ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
1485
1486 /* Disable the UART DMA Rx request */
1487 ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);
1488 }
1489
1490 return HAL_OK;
1491}
1492
1500{
1501
1502 if (huart->gState == HAL_UART_STATE_BUSY_TX)
1503 {
1504 /* Enable the UART DMA Tx request */
1505 ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_DMAT);
1506 }
1507
1508 if (huart->RxState == HAL_UART_STATE_BUSY_RX)
1509 {
1510 /* Clear the Overrun flag before resuming the Rx transfer*/
1512
1513 /* Re-enable PE and ERR (Frame error, noise error, overrun error) interrupts */
1514 if (huart->Init.Parity != UART_PARITY_NONE)
1515 {
1516 ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_PEIE);
1517 }
1518 ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_EIE);
1519
1520 /* Enable the UART DMA Rx request */
1521 ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_DMAR);
1522 }
1523
1524 return HAL_OK;
1525}
1526
1534{
1535 uint32_t dmarequest = 0x00U;
1536 /* The Lock is not implemented on this API to allow the user application
1537 to call the HAL UART API under callbacks HAL_UART_TxCpltCallback() / HAL_UART_RxCpltCallback():
1538 when calling HAL_DMA_Abort() API the DMA TX/RX Transfer complete interrupt is generated
1539 and the correspond call back is executed HAL_UART_TxCpltCallback() / HAL_UART_RxCpltCallback()
1540 */
1541
1542 /* Stop UART DMA Tx request if ongoing */
1543 dmarequest = HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT);
1544 if ((huart->gState == HAL_UART_STATE_BUSY_TX) && dmarequest)
1545 {
1546 ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT);
1547
1548 /* Abort the UART DMA Tx stream */
1549 if (huart->hdmatx != NULL)
1550 {
1551 HAL_DMA_Abort(huart->hdmatx);
1552 }
1553 UART_EndTxTransfer(huart);
1554 }
1555
1556 /* Stop UART DMA Rx request if ongoing */
1557 dmarequest = HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR);
1558 if ((huart->RxState == HAL_UART_STATE_BUSY_RX) && dmarequest)
1559 {
1560 ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);
1561
1562 /* Abort the UART DMA Rx stream */
1563 if (huart->hdmarx != NULL)
1564 {
1565 HAL_DMA_Abort(huart->hdmarx);
1566 }
1567 UART_EndRxTransfer(huart);
1568 }
1569
1570 return HAL_OK;
1571}
1572
1588HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint16_t *RxLen,
1589 uint32_t Timeout)
1590{
1591 uint8_t *pdata8bits;
1592 uint16_t *pdata16bits;
1593 uint32_t tickstart;
1594
1595 /* Check that a Rx process is not already ongoing */
1596 if (huart->RxState == HAL_UART_STATE_READY)
1597 {
1598 if ((pData == NULL) || (Size == 0U))
1599 {
1600 return HAL_ERROR;
1601 }
1602
1607
1608 /* Init tickstart for timeout management */
1609 tickstart = HAL_GetTick();
1610
1611 huart->RxXferSize = Size;
1612 huart->RxXferCount = Size;
1613
1614 /* In case of 9bits/No Parity transfer, pRxData needs to be handled as a uint16_t pointer */
1615 if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
1616 {
1617 pdata8bits = NULL;
1618 pdata16bits = (uint16_t *) pData;
1619 }
1620 else
1621 {
1622 pdata8bits = pData;
1623 pdata16bits = NULL;
1624 }
1625
1626 /* Initialize output number of received elements */
1627 *RxLen = 0U;
1628
1629 /* as long as data have to be received */
1630 while (huart->RxXferCount > 0U)
1631 {
1632 /* Check if IDLE flag is set */
1634 {
1635 /* Clear IDLE flag in ISR */
1637
1638 /* If Set, but no data ever received, clear flag without exiting loop */
1639 /* If Set, and data has already been received, this means Idle Event is valid : End reception */
1640 if (*RxLen > 0U)
1641 {
1644
1645 return HAL_OK;
1646 }
1647 }
1648
1649 /* Check if RXNE flag is set */
1651 {
1652 if (pdata8bits == NULL)
1653 {
1654 *pdata16bits = (uint16_t)(huart->Instance->DR & (uint16_t)0x01FF);
1655 pdata16bits++;
1656 }
1657 else
1658 {
1659 if ((huart->Init.WordLength == UART_WORDLENGTH_9B) || ((huart->Init.WordLength == UART_WORDLENGTH_8B) && (huart->Init.Parity == UART_PARITY_NONE)))
1660 {
1661 *pdata8bits = (uint8_t)(huart->Instance->DR & (uint8_t)0x00FF);
1662 }
1663 else
1664 {
1665 *pdata8bits = (uint8_t)(huart->Instance->DR & (uint8_t)0x007F);
1666 }
1667
1668 pdata8bits++;
1669 }
1670 /* Increment number of received elements */
1671 *RxLen += 1U;
1672 huart->RxXferCount--;
1673 }
1674
1675 /* Check for the Timeout */
1676 if (Timeout != HAL_MAX_DELAY)
1677 {
1678 if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U))
1679 {
1681
1682 return HAL_TIMEOUT;
1683 }
1684 }
1685 }
1686
1687 /* Set number of received elements in output parameter : RxLen */
1688 *RxLen = huart->RxXferSize - huart->RxXferCount;
1689 /* At end of Rx process, restore huart->RxState to Ready */
1691
1692 return HAL_OK;
1693 }
1694 else
1695 {
1696 return HAL_BUSY;
1697 }
1698}
1699
1714{
1715 HAL_StatusTypeDef status;
1716
1717 /* Check that a Rx process is not already ongoing */
1718 if (huart->RxState == HAL_UART_STATE_READY)
1719 {
1720 if ((pData == NULL) || (Size == 0U))
1721 {
1722 return HAL_ERROR;
1723 }
1724
1725 /* Set Reception type to reception till IDLE Event*/
1728
1729 status = UART_Start_Receive_IT(huart, pData, Size);
1730
1731 /* Check Rx process has been successfully started */
1732 if (status == HAL_OK)
1733 {
1735 {
1737 ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_IDLEIE);
1738 }
1739 else
1740 {
1741 /* In case of errors already pending when reception is started,
1742 Interrupts may have already been raised and lead to reception abortion.
1743 (Overrun error for instance).
1744 In such case Reception Type has been reset to HAL_UART_RECEPTION_STANDARD. */
1745 status = HAL_ERROR;
1746 }
1747 }
1748
1749 return status;
1750 }
1751 else
1752 {
1753 return HAL_BUSY;
1754 }
1755}
1756
1774{
1775 HAL_StatusTypeDef status;
1776
1777 /* Check that a Rx process is not already ongoing */
1778 if (huart->RxState == HAL_UART_STATE_READY)
1779 {
1780 if ((pData == NULL) || (Size == 0U))
1781 {
1782 return HAL_ERROR;
1783 }
1784
1785 /* Set Reception type to reception till IDLE Event*/
1788
1789 status = UART_Start_Receive_DMA(huart, pData, Size);
1790
1791 /* Check Rx process has been successfully started */
1792 if (status == HAL_OK)
1793 {
1795 {
1797 ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_IDLEIE);
1798 }
1799 else
1800 {
1801 /* In case of errors already pending when reception is started,
1802 Interrupts may have already been raised and lead to reception abortion.
1803 (Overrun error for instance).
1804 In such case Reception Type has been reset to HAL_UART_RECEPTION_STANDARD. */
1805 status = HAL_ERROR;
1806 }
1807 }
1808
1809 return status;
1810 }
1811 else
1812 {
1813 return HAL_BUSY;
1814 }
1815}
1816
1842{
1843 /* Return Rx Event type value, as stored in UART handle */
1844 return(huart->RxEventType);
1845}
1846
1860{
1861 /* Disable TXEIE, TCIE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
1862 ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE | USART_CR1_TCIE));
1863 ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
1864
1865 /* If Reception till IDLE event was ongoing, disable IDLEIE interrupt */
1867 {
1868 ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_IDLEIE));
1869 }
1870
1871 /* Disable the UART DMA Tx request if enabled */
1872 if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT))
1873 {
1874 ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT);
1875
1876 /* Abort the UART DMA Tx stream: use blocking DMA Abort API (no callback) */
1877 if (huart->hdmatx != NULL)
1878 {
1879 /* Set the UART DMA Abort callback to Null.
1880 No call back execution at end of DMA abort procedure */
1881 huart->hdmatx->XferAbortCallback = NULL;
1882
1883 if (HAL_DMA_Abort(huart->hdmatx) != HAL_OK)
1884 {
1886 {
1887 /* Set error code to DMA */
1889
1890 return HAL_TIMEOUT;
1891 }
1892 }
1893 }
1894 }
1895
1896 /* Disable the UART DMA Rx request if enabled */
1897 if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))
1898 {
1899 ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);
1900
1901 /* Abort the UART DMA Rx stream: use blocking DMA Abort API (no callback) */
1902 if (huart->hdmarx != NULL)
1903 {
1904 /* Set the UART DMA Abort callback to Null.
1905 No call back execution at end of DMA abort procedure */
1906 huart->hdmarx->XferAbortCallback = NULL;
1907
1908 if (HAL_DMA_Abort(huart->hdmarx) != HAL_OK)
1909 {
1911 {
1912 /* Set error code to DMA */
1914
1915 return HAL_TIMEOUT;
1916 }
1917 }
1918 }
1919 }
1920
1921 /* Reset Tx and Rx transfer counters */
1922 huart->TxXferCount = 0x00U;
1923 huart->RxXferCount = 0x00U;
1924
1925 /* Reset ErrorCode */
1927
1928 /* Restore huart->RxState and huart->gState to Ready */
1932
1933 return HAL_OK;
1934}
1935
1949{
1950 /* Disable TXEIE and TCIE interrupts */
1951 ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE));
1952
1953 /* Disable the UART DMA Tx request if enabled */
1954 if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT))
1955 {
1956 ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT);
1957
1958 /* Abort the UART DMA Tx stream : use blocking DMA Abort API (no callback) */
1959 if (huart->hdmatx != NULL)
1960 {
1961 /* Set the UART DMA Abort callback to Null.
1962 No call back execution at end of DMA abort procedure */
1963 huart->hdmatx->XferAbortCallback = NULL;
1964
1965 if (HAL_DMA_Abort(huart->hdmatx) != HAL_OK)
1966 {
1968 {
1969 /* Set error code to DMA */
1971
1972 return HAL_TIMEOUT;
1973 }
1974 }
1975 }
1976 }
1977
1978 /* Reset Tx transfer counter */
1979 huart->TxXferCount = 0x00U;
1980
1981 /* Restore huart->gState to Ready */
1983
1984 return HAL_OK;
1985}
1986
2000{
2001 /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
2002 ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
2003 ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
2004
2005 /* If Reception till IDLE event was ongoing, disable IDLEIE interrupt */
2007 {
2008 ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_IDLEIE));
2009 }
2010
2011 /* Disable the UART DMA Rx request if enabled */
2012 if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))
2013 {
2014 ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);
2015
2016 /* Abort the UART DMA Rx stream : use blocking DMA Abort API (no callback) */
2017 if (huart->hdmarx != NULL)
2018 {
2019 /* Set the UART DMA Abort callback to Null.
2020 No call back execution at end of DMA abort procedure */
2021 huart->hdmarx->XferAbortCallback = NULL;
2022
2023 if (HAL_DMA_Abort(huart->hdmarx) != HAL_OK)
2024 {
2026 {
2027 /* Set error code to DMA */
2029
2030 return HAL_TIMEOUT;
2031 }
2032 }
2033 }
2034 }
2035
2036 /* Reset Rx transfer counter */
2037 huart->RxXferCount = 0x00U;
2038
2039 /* Restore huart->RxState to Ready */
2042
2043 return HAL_OK;
2044}
2045
2061{
2062 uint32_t AbortCplt = 0x01U;
2063
2064 /* Disable TXEIE, TCIE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
2065 ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE | USART_CR1_TCIE));
2066 ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
2067
2068 /* If Reception till IDLE event was ongoing, disable IDLEIE interrupt */
2070 {
2071 ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_IDLEIE));
2072 }
2073
2074 /* If DMA Tx and/or DMA Rx Handles are associated to UART Handle, DMA Abort complete callbacks should be initialised
2075 before any call to DMA Abort functions */
2076 /* DMA Tx Handle is valid */
2077 if (huart->hdmatx != NULL)
2078 {
2079 /* Set DMA Abort Complete callback if UART DMA Tx request if enabled.
2080 Otherwise, set it to NULL */
2081 if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT))
2082 {
2084 }
2085 else
2086 {
2087 huart->hdmatx->XferAbortCallback = NULL;
2088 }
2089 }
2090 /* DMA Rx Handle is valid */
2091 if (huart->hdmarx != NULL)
2092 {
2093 /* Set DMA Abort Complete callback if UART DMA Rx request if enabled.
2094 Otherwise, set it to NULL */
2095 if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))
2096 {
2098 }
2099 else
2100 {
2101 huart->hdmarx->XferAbortCallback = NULL;
2102 }
2103 }
2104
2105 /* Disable the UART DMA Tx request if enabled */
2106 if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT))
2107 {
2108 /* Disable DMA Tx at UART level */
2109 ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT);
2110
2111 /* Abort the UART DMA Tx stream : use non blocking DMA Abort API (callback) */
2112 if (huart->hdmatx != NULL)
2113 {
2114 /* UART Tx DMA Abort callback has already been initialised :
2115 will lead to call HAL_UART_AbortCpltCallback() at end of DMA abort procedure */
2116
2117 /* Abort DMA TX */
2118 if (HAL_DMA_Abort_IT(huart->hdmatx) != HAL_OK)
2119 {
2120 huart->hdmatx->XferAbortCallback = NULL;
2121 }
2122 else
2123 {
2124 AbortCplt = 0x00U;
2125 }
2126 }
2127 }
2128
2129 /* Disable the UART DMA Rx request if enabled */
2130 if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))
2131 {
2132 ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);
2133
2134 /* Abort the UART DMA Rx stream : use non blocking DMA Abort API (callback) */
2135 if (huart->hdmarx != NULL)
2136 {
2137 /* UART Rx DMA Abort callback has already been initialised :
2138 will lead to call HAL_UART_AbortCpltCallback() at end of DMA abort procedure */
2139
2140 /* Abort DMA RX */
2141 if (HAL_DMA_Abort_IT(huart->hdmarx) != HAL_OK)
2142 {
2143 huart->hdmarx->XferAbortCallback = NULL;
2144 AbortCplt = 0x01U;
2145 }
2146 else
2147 {
2148 AbortCplt = 0x00U;
2149 }
2150 }
2151 }
2152
2153 /* if no DMA abort complete callback execution is required => call user Abort Complete callback */
2154 if (AbortCplt == 0x01U)
2155 {
2156 /* Reset Tx and Rx transfer counters */
2157 huart->TxXferCount = 0x00U;
2158 huart->RxXferCount = 0x00U;
2159
2160 /* Reset ErrorCode */
2162
2163 /* Restore huart->gState and huart->RxState to Ready */
2167
2168 /* As no DMA to be aborted, call directly user Abort complete callback */
2169#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
2170 /* Call registered Abort complete callback */
2171 huart->AbortCpltCallback(huart);
2172#else
2173 /* Call legacy weak Abort complete callback */
2175#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
2176 }
2177
2178 return HAL_OK;
2179}
2180
2196{
2197 /* Disable TXEIE and TCIE interrupts */
2198 ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE));
2199
2200 /* Disable the UART DMA Tx request if enabled */
2201 if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT))
2202 {
2203 ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT);
2204
2205 /* Abort the UART DMA Tx stream : use blocking DMA Abort API (no callback) */
2206 if (huart->hdmatx != NULL)
2207 {
2208 /* Set the UART DMA Abort callback :
2209 will lead to call HAL_UART_AbortCpltCallback() at end of DMA abort procedure */
2211
2212 /* Abort DMA TX */
2213 if (HAL_DMA_Abort_IT(huart->hdmatx) != HAL_OK)
2214 {
2215 /* Call Directly huart->hdmatx->XferAbortCallback function in case of error */
2216 huart->hdmatx->XferAbortCallback(huart->hdmatx);
2217 }
2218 }
2219 else
2220 {
2221 /* Reset Tx transfer counter */
2222 huart->TxXferCount = 0x00U;
2223
2224 /* Restore huart->gState to Ready */
2226
2227 /* As no DMA to be aborted, call directly user Abort complete callback */
2228#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
2229 /* Call registered Abort Transmit Complete Callback */
2230 huart->AbortTransmitCpltCallback(huart);
2231#else
2232 /* Call legacy weak Abort Transmit Complete Callback */
2234#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
2235 }
2236 }
2237 else
2238 {
2239 /* Reset Tx transfer counter */
2240 huart->TxXferCount = 0x00U;
2241
2242 /* Restore huart->gState to Ready */
2244
2245 /* As no DMA to be aborted, call directly user Abort complete callback */
2246#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
2247 /* Call registered Abort Transmit Complete Callback */
2248 huart->AbortTransmitCpltCallback(huart);
2249#else
2250 /* Call legacy weak Abort Transmit Complete Callback */
2252#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
2253 }
2254
2255 return HAL_OK;
2256}
2257
2273{
2274 /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
2275 ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
2276 ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
2277
2278 /* If Reception till IDLE event was ongoing, disable IDLEIE interrupt */
2280 {
2281 ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_IDLEIE));
2282 }
2283
2284 /* Disable the UART DMA Rx request if enabled */
2285 if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))
2286 {
2287 ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);
2288
2289 /* Abort the UART DMA Rx stream : use blocking DMA Abort API (no callback) */
2290 if (huart->hdmarx != NULL)
2291 {
2292 /* Set the UART DMA Abort callback :
2293 will lead to call HAL_UART_AbortCpltCallback() at end of DMA abort procedure */
2295
2296 /* Abort DMA RX */
2297 if (HAL_DMA_Abort_IT(huart->hdmarx) != HAL_OK)
2298 {
2299 /* Call Directly huart->hdmarx->XferAbortCallback function in case of error */
2300 huart->hdmarx->XferAbortCallback(huart->hdmarx);
2301 }
2302 }
2303 else
2304 {
2305 /* Reset Rx transfer counter */
2306 huart->RxXferCount = 0x00U;
2307
2308 /* Restore huart->RxState to Ready */
2311
2312 /* As no DMA to be aborted, call directly user Abort complete callback */
2313#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
2314 /* Call registered Abort Receive Complete Callback */
2315 huart->AbortReceiveCpltCallback(huart);
2316#else
2317 /* Call legacy weak Abort Receive Complete Callback */
2319#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
2320 }
2321 }
2322 else
2323 {
2324 /* Reset Rx transfer counter */
2325 huart->RxXferCount = 0x00U;
2326
2327 /* Restore huart->RxState to Ready */
2330
2331 /* As no DMA to be aborted, call directly user Abort complete callback */
2332#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
2333 /* Call registered Abort Receive Complete Callback */
2334 huart->AbortReceiveCpltCallback(huart);
2335#else
2336 /* Call legacy weak Abort Receive Complete Callback */
2338#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
2339 }
2340
2341 return HAL_OK;
2342}
2343
2351{
2352 uint32_t isrflags = READ_REG(huart->Instance->SR);
2353 uint32_t cr1its = READ_REG(huart->Instance->CR1);
2354 uint32_t cr3its = READ_REG(huart->Instance->CR3);
2355 uint32_t errorflags = 0x00U;
2356 uint32_t dmarequest = 0x00U;
2357
2358 /* If no error occurs */
2359 errorflags = (isrflags & (uint32_t)(USART_SR_PE | USART_SR_FE | USART_SR_ORE | USART_SR_NE));
2360 if (errorflags == RESET)
2361 {
2362 /* UART in mode Receiver -------------------------------------------------*/
2363 if (((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
2364 {
2365 UART_Receive_IT(huart);
2366 return;
2367 }
2368 }
2369
2370 /* If some errors occur */
2371 if ((errorflags != RESET) && (((cr3its & USART_CR3_EIE) != RESET)
2372 || ((cr1its & (USART_CR1_RXNEIE | USART_CR1_PEIE)) != RESET)))
2373 {
2374 /* UART parity error interrupt occurred ----------------------------------*/
2375 if (((isrflags & USART_SR_PE) != RESET) && ((cr1its & USART_CR1_PEIE) != RESET))
2376 {
2377 huart->ErrorCode |= HAL_UART_ERROR_PE;
2378 }
2379
2380 /* UART noise error interrupt occurred -----------------------------------*/
2381 if (((isrflags & USART_SR_NE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET))
2382 {
2383 huart->ErrorCode |= HAL_UART_ERROR_NE;
2384 }
2385
2386 /* UART frame error interrupt occurred -----------------------------------*/
2387 if (((isrflags & USART_SR_FE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET))
2388 {
2389 huart->ErrorCode |= HAL_UART_ERROR_FE;
2390 }
2391
2392 /* UART Over-Run interrupt occurred --------------------------------------*/
2393 if (((isrflags & USART_SR_ORE) != RESET) && (((cr1its & USART_CR1_RXNEIE) != RESET)
2394 || ((cr3its & USART_CR3_EIE) != RESET)))
2395 {
2396 huart->ErrorCode |= HAL_UART_ERROR_ORE;
2397 }
2398
2399 /* Call UART Error Call back function if need be --------------------------*/
2400 if (huart->ErrorCode != HAL_UART_ERROR_NONE)
2401 {
2402 /* UART in mode Receiver -----------------------------------------------*/
2403 if (((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
2404 {
2405 UART_Receive_IT(huart);
2406 }
2407
2408 /* If Overrun error occurs, or if any error occurs in DMA mode reception,
2409 consider error as blocking */
2410 dmarequest = HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR);
2411 if (((huart->ErrorCode & HAL_UART_ERROR_ORE) != RESET) || dmarequest)
2412 {
2413 /* Blocking error : transfer is aborted
2414 Set the UART state ready to be able to start again the process,
2415 Disable Rx Interrupts, and disable Rx DMA request, if ongoing */
2416 UART_EndRxTransfer(huart);
2417
2418 /* Disable the UART DMA Rx request if enabled */
2419 if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))
2420 {
2421 ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);
2422
2423 /* Abort the UART DMA Rx stream */
2424 if (huart->hdmarx != NULL)
2425 {
2426 /* Set the UART DMA Abort callback :
2427 will lead to call HAL_UART_ErrorCallback() at end of DMA abort procedure */
2429 if (HAL_DMA_Abort_IT(huart->hdmarx) != HAL_OK)
2430 {
2431 /* Call Directly XferAbortCallback function in case of error */
2432 huart->hdmarx->XferAbortCallback(huart->hdmarx);
2433 }
2434 }
2435 else
2436 {
2437 /* Call user error callback */
2438#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
2439 /*Call registered error callback*/
2440 huart->ErrorCallback(huart);
2441#else
2442 /*Call legacy weak error callback*/
2444#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
2445 }
2446 }
2447 else
2448 {
2449 /* Call user error callback */
2450#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
2451 /*Call registered error callback*/
2452 huart->ErrorCallback(huart);
2453#else
2454 /*Call legacy weak error callback*/
2456#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
2457 }
2458 }
2459 else
2460 {
2461 /* Non Blocking error : transfer could go on.
2462 Error is notified to user through user error callback */
2463#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
2464 /*Call registered error callback*/
2465 huart->ErrorCallback(huart);
2466#else
2467 /*Call legacy weak error callback*/
2469#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
2470
2472 }
2473 }
2474 return;
2475 } /* End if some error occurs */
2476
2477 /* Check current reception Mode :
2478 If Reception till IDLE event has been selected : */
2480 && ((isrflags & USART_SR_IDLE) != 0U)
2481 && ((cr1its & USART_SR_IDLE) != 0U))
2482 {
2484
2485 /* Check if DMA mode is enabled in UART */
2486 if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))
2487 {
2488 /* DMA mode enabled */
2489 /* Check received length : If all expected data are received, do nothing,
2490 (DMA cplt callback will be called).
2491 Otherwise, if at least one data has already been received, IDLE event is to be notified to user */
2492 uint16_t nb_remaining_rx_data = (uint16_t) __HAL_DMA_GET_COUNTER(huart->hdmarx);
2493 if ((nb_remaining_rx_data > 0U)
2494 && (nb_remaining_rx_data < huart->RxXferSize))
2495 {
2496 /* Reception is not complete */
2497 huart->RxXferCount = nb_remaining_rx_data;
2498
2499 /* In Normal mode, end DMA xfer and HAL UART Rx process*/
2500 if (huart->hdmarx->Init.Mode != DMA_CIRCULAR)
2501 {
2502 /* Disable PE and ERR (Frame error, noise error, overrun error) interrupts */
2503 ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_PEIE);
2504 ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
2505
2506 /* Disable the DMA transfer for the receiver request by resetting the DMAR bit
2507 in the UART CR3 register */
2508 ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);
2509
2510 /* At end of Rx process, restore huart->RxState to Ready */
2513
2514 ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE);
2515
2516 /* Last bytes received, so no need as the abort is immediate */
2517 (void)HAL_DMA_Abort(huart->hdmarx);
2518 }
2519
2520 /* Initialize type of RxEvent that correspond to RxEvent callback execution;
2521 In this case, Rx Event type is Idle Event */
2523
2524#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
2525 /*Call registered Rx Event callback*/
2526 huart->RxEventCallback(huart, (huart->RxXferSize - huart->RxXferCount));
2527#else
2528 /*Call legacy weak Rx Event callback*/
2529 HAL_UARTEx_RxEventCallback(huart, (huart->RxXferSize - huart->RxXferCount));
2530#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
2531 }
2532 return;
2533 }
2534 else
2535 {
2536 /* DMA mode not enabled */
2537 /* Check received length : If all expected data are received, do nothing.
2538 Otherwise, if at least one data has already been received, IDLE event is to be notified to user */
2539 uint16_t nb_rx_data = huart->RxXferSize - huart->RxXferCount;
2540 if ((huart->RxXferCount > 0U)
2541 && (nb_rx_data > 0U))
2542 {
2543 /* Disable the UART Parity Error Interrupt and RXNE interrupts */
2544 ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
2545
2546 /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
2547 ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
2548
2549 /* Rx process is completed, restore huart->RxState to Ready */
2552
2553 ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE);
2554
2555 /* Initialize type of RxEvent that correspond to RxEvent callback execution;
2556 In this case, Rx Event type is Idle Event */
2558
2559#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
2560 /*Call registered Rx complete callback*/
2561 huart->RxEventCallback(huart, nb_rx_data);
2562#else
2563 /*Call legacy weak Rx Event callback*/
2564 HAL_UARTEx_RxEventCallback(huart, nb_rx_data);
2565#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
2566 }
2567 return;
2568 }
2569 }
2570
2571 /* UART in mode Transmitter ------------------------------------------------*/
2572 if (((isrflags & USART_SR_TXE) != RESET) && ((cr1its & USART_CR1_TXEIE) != RESET))
2573 {
2574 UART_Transmit_IT(huart);
2575 return;
2576 }
2577
2578 /* UART in mode Transmitter end --------------------------------------------*/
2579 if (((isrflags & USART_SR_TC) != RESET) && ((cr1its & USART_CR1_TCIE) != RESET))
2580 {
2581 UART_EndTransmit_IT(huart);
2582 return;
2583 }
2584}
2585
2593{
2594 /* Prevent unused argument(s) compilation warning */
2595 UNUSED(huart);
2596 /* NOTE: This function should not be modified, when the callback is needed,
2597 the HAL_UART_TxCpltCallback could be implemented in the user file
2598 */
2599}
2600
2608{
2609 /* Prevent unused argument(s) compilation warning */
2610 UNUSED(huart);
2611 /* NOTE: This function should not be modified, when the callback is needed,
2612 the HAL_UART_TxHalfCpltCallback could be implemented in the user file
2613 */
2614}
2615
2623{
2624 /* Prevent unused argument(s) compilation warning */
2625 UNUSED(huart);
2626 /* NOTE: This function should not be modified, when the callback is needed,
2627 the HAL_UART_RxCpltCallback could be implemented in the user file
2628 */
2629}
2630
2638{
2639 /* Prevent unused argument(s) compilation warning */
2640 UNUSED(huart);
2641 /* NOTE: This function should not be modified, when the callback is needed,
2642 the HAL_UART_RxHalfCpltCallback could be implemented in the user file
2643 */
2644}
2645
2653{
2654 /* Prevent unused argument(s) compilation warning */
2655 UNUSED(huart);
2656 /* NOTE: This function should not be modified, when the callback is needed,
2657 the HAL_UART_ErrorCallback could be implemented in the user file
2658 */
2659}
2660
2667{
2668 /* Prevent unused argument(s) compilation warning */
2669 UNUSED(huart);
2670
2671 /* NOTE : This function should not be modified, when the callback is needed,
2672 the HAL_UART_AbortCpltCallback can be implemented in the user file.
2673 */
2674}
2675
2682{
2683 /* Prevent unused argument(s) compilation warning */
2684 UNUSED(huart);
2685
2686 /* NOTE : This function should not be modified, when the callback is needed,
2687 the HAL_UART_AbortTransmitCpltCallback can be implemented in the user file.
2688 */
2689}
2690
2697{
2698 /* Prevent unused argument(s) compilation warning */
2699 UNUSED(huart);
2700
2701 /* NOTE : This function should not be modified, when the callback is needed,
2702 the HAL_UART_AbortReceiveCpltCallback can be implemented in the user file.
2703 */
2704}
2705
2713__weak void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
2714{
2715 /* Prevent unused argument(s) compilation warning */
2716 UNUSED(huart);
2717 UNUSED(Size);
2718
2719 /* NOTE : This function should not be modified, when the callback is needed,
2720 the HAL_UARTEx_RxEventCallback can be implemented in the user file.
2721 */
2722}
2723
2754{
2755 /* Check the parameters */
2756 assert_param(IS_UART_INSTANCE(huart->Instance));
2757
2758 /* Process Locked */
2759 __HAL_LOCK(huart);
2760
2761 huart->gState = HAL_UART_STATE_BUSY;
2762
2763 /* Send break characters */
2764 ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_SBK);
2765
2767
2768 /* Process Unlocked */
2769 __HAL_UNLOCK(huart);
2770
2771 return HAL_OK;
2772}
2773
2781{
2782 /* Check the parameters */
2783 assert_param(IS_UART_INSTANCE(huart->Instance));
2784
2785 /* Process Locked */
2786 __HAL_LOCK(huart);
2787
2788 huart->gState = HAL_UART_STATE_BUSY;
2789
2790 /* Enable the USART mute mode by setting the RWU bit in the CR1 register */
2791 ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_RWU);
2792
2795
2796 /* Process Unlocked */
2797 __HAL_UNLOCK(huart);
2798
2799 return HAL_OK;
2800}
2801
2809{
2810 /* Check the parameters */
2811 assert_param(IS_UART_INSTANCE(huart->Instance));
2812
2813 /* Process Locked */
2814 __HAL_LOCK(huart);
2815
2816 huart->gState = HAL_UART_STATE_BUSY;
2817
2818 /* Disable the USART mute mode by clearing the RWU bit in the CR1 register */
2819 ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_RWU);
2820
2823
2824 /* Process Unlocked */
2825 __HAL_UNLOCK(huart);
2826
2827 return HAL_OK;
2828}
2829
2837{
2838 uint32_t tmpreg = 0x00U;
2839
2840 /* Process Locked */
2841 __HAL_LOCK(huart);
2842
2843 huart->gState = HAL_UART_STATE_BUSY;
2844
2845 /*-------------------------- USART CR1 Configuration -----------------------*/
2846 tmpreg = huart->Instance->CR1;
2847
2848 /* Clear TE and RE bits */
2849 tmpreg &= (uint32_t)~((uint32_t)(USART_CR1_TE | USART_CR1_RE));
2850
2851 /* Enable the USART's transmit interface by setting the TE bit in the USART CR1 register */
2852 tmpreg |= (uint32_t)USART_CR1_TE;
2853
2854 /* Write to USART CR1 */
2855 WRITE_REG(huart->Instance->CR1, (uint32_t)tmpreg);
2856
2858
2859 /* Process Unlocked */
2860 __HAL_UNLOCK(huart);
2861
2862 return HAL_OK;
2863}
2864
2872{
2873 uint32_t tmpreg = 0x00U;
2874
2875 /* Process Locked */
2876 __HAL_LOCK(huart);
2877
2878 huart->gState = HAL_UART_STATE_BUSY;
2879
2880 /*-------------------------- USART CR1 Configuration -----------------------*/
2881 tmpreg = huart->Instance->CR1;
2882
2883 /* Clear TE and RE bits */
2884 tmpreg &= (uint32_t)~((uint32_t)(USART_CR1_TE | USART_CR1_RE));
2885
2886 /* Enable the USART's receive interface by setting the RE bit in the USART CR1 register */
2887 tmpreg |= (uint32_t)USART_CR1_RE;
2888
2889 /* Write to USART CR1 */
2890 WRITE_REG(huart->Instance->CR1, (uint32_t)tmpreg);
2891
2893
2894 /* Process Unlocked */
2895 __HAL_UNLOCK(huart);
2896
2897 return HAL_OK;
2898}
2899
2929{
2930 uint32_t temp1 = 0x00U, temp2 = 0x00U;
2931 temp1 = huart->gState;
2932 temp2 = huart->RxState;
2933
2934 return (HAL_UART_StateTypeDef)(temp1 | temp2);
2935}
2936
2944{
2945 return huart->ErrorCode;
2946}
2947
2965#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
2966void UART_InitCallbacksToDefault(UART_HandleTypeDef *huart)
2967{
2968 /* Init the UART Callback settings */
2969 huart->TxHalfCpltCallback = HAL_UART_TxHalfCpltCallback; /* Legacy weak TxHalfCpltCallback */
2970 huart->TxCpltCallback = HAL_UART_TxCpltCallback; /* Legacy weak TxCpltCallback */
2971 huart->RxHalfCpltCallback = HAL_UART_RxHalfCpltCallback; /* Legacy weak RxHalfCpltCallback */
2972 huart->RxCpltCallback = HAL_UART_RxCpltCallback; /* Legacy weak RxCpltCallback */
2973 huart->ErrorCallback = HAL_UART_ErrorCallback; /* Legacy weak ErrorCallback */
2974 huart->AbortCpltCallback = HAL_UART_AbortCpltCallback; /* Legacy weak AbortCpltCallback */
2975 huart->AbortTransmitCpltCallback = HAL_UART_AbortTransmitCpltCallback; /* Legacy weak AbortTransmitCpltCallback */
2976 huart->AbortReceiveCpltCallback = HAL_UART_AbortReceiveCpltCallback; /* Legacy weak AbortReceiveCpltCallback */
2977 huart->RxEventCallback = HAL_UARTEx_RxEventCallback; /* Legacy weak RxEventCallback */
2978
2979}
2980#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
2981
2989{
2990 UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
2991 /* DMA Normal mode*/
2992 if ((hdma->Instance->CR & DMA_SxCR_CIRC) == 0U)
2993 {
2994 huart->TxXferCount = 0x00U;
2995
2996 /* Disable the DMA transfer for transmit request by setting the DMAT bit
2997 in the UART CR3 register */
2998 ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT);
2999
3000 /* Enable the UART Transmit Complete Interrupt */
3001 ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_TCIE);
3002
3003 }
3004 /* DMA Circular mode */
3005 else
3006 {
3007#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3008 /*Call registered Tx complete callback*/
3009 huart->TxCpltCallback(huart);
3010#else
3011 /*Call legacy weak Tx complete callback*/
3013#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3014 }
3015}
3016
3024{
3025 UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
3026
3027#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3028 /*Call registered Tx complete callback*/
3029 huart->TxHalfCpltCallback(huart);
3030#else
3031 /*Call legacy weak Tx complete callback*/
3033#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3034}
3035
3043{
3044 UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
3045
3046 /* DMA Normal mode*/
3047 if ((hdma->Instance->CR & DMA_SxCR_CIRC) == 0U)
3048 {
3049 huart->RxXferCount = 0U;
3050
3051 /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
3052 ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_PEIE);
3053 ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
3054
3055 /* Disable the DMA transfer for the receiver request by setting the DMAR bit
3056 in the UART CR3 register */
3057 ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);
3058
3059 /* At end of Rx process, restore huart->RxState to Ready */
3061
3062 /* If Reception till IDLE event has been selected, Disable IDLE Interrupt */
3064 {
3065 ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE);
3066 }
3067 }
3068
3069 /* Initialize type of RxEvent that correspond to RxEvent callback execution;
3070 In this case, Rx Event type is Transfer Complete */
3072
3073 /* Check current reception Mode :
3074 If Reception till IDLE event has been selected : use Rx Event callback */
3076 {
3077#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3078 /*Call registered Rx Event callback*/
3079 huart->RxEventCallback(huart, huart->RxXferSize);
3080#else
3081 /*Call legacy weak Rx Event callback*/
3083#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3084 }
3085 else
3086 {
3087 /* In other cases : use Rx Complete callback */
3088#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3089 /*Call registered Rx complete callback*/
3090 huart->RxCpltCallback(huart);
3091#else
3092 /*Call legacy weak Rx complete callback*/
3094#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3095 }
3096}
3097
3105{
3106 UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
3107
3108 /* Initialize type of RxEvent that correspond to RxEvent callback execution;
3109 In this case, Rx Event type is Half Transfer */
3111
3112 /* Check current reception Mode :
3113 If Reception till IDLE event has been selected : use Rx Event callback */
3115 {
3116#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3117 /*Call registered Rx Event callback*/
3118 huart->RxEventCallback(huart, huart->RxXferSize / 2U);
3119#else
3120 /*Call legacy weak Rx Event callback*/
3121 HAL_UARTEx_RxEventCallback(huart, huart->RxXferSize / 2U);
3122#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3123 }
3124 else
3125 {
3126 /* In other cases : use Rx Half Complete callback */
3127#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3128 /*Call registered Rx Half complete callback*/
3129 huart->RxHalfCpltCallback(huart);
3130#else
3131 /*Call legacy weak Rx Half complete callback*/
3133#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3134 }
3135}
3136
3144{
3145 uint32_t dmarequest = 0x00U;
3146 UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
3147
3148 /* Stop UART DMA Tx request if ongoing */
3149 dmarequest = HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT);
3150 if ((huart->gState == HAL_UART_STATE_BUSY_TX) && dmarequest)
3151 {
3152 huart->TxXferCount = 0x00U;
3153 UART_EndTxTransfer(huart);
3154 }
3155
3156 /* Stop UART DMA Rx request if ongoing */
3157 dmarequest = HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR);
3158 if ((huart->RxState == HAL_UART_STATE_BUSY_RX) && dmarequest)
3159 {
3160 huart->RxXferCount = 0x00U;
3161 UART_EndRxTransfer(huart);
3162 }
3163
3164 huart->ErrorCode |= HAL_UART_ERROR_DMA;
3165#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3166 /*Call registered error callback*/
3167 huart->ErrorCallback(huart);
3168#else
3169 /*Call legacy weak error callback*/
3171#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3172}
3173
3185static HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status,
3186 uint32_t Tickstart, uint32_t Timeout)
3187{
3188 /* Wait until flag is set */
3189 while ((__HAL_UART_GET_FLAG(huart, Flag) ? SET : RESET) == Status)
3190 {
3191 /* Check for the Timeout */
3192 if (Timeout != HAL_MAX_DELAY)
3193 {
3194 if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
3195 {
3196
3197 return HAL_TIMEOUT;
3198 }
3199
3200 if ((READ_BIT(huart->Instance->CR1, USART_CR1_RE) != 0U) && (Flag != UART_FLAG_TXE) && (Flag != UART_FLAG_TC))
3201 {
3202 if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) == SET)
3203 {
3204 /* Clear Overrun Error flag*/
3206
3207 /* Blocking error : transfer is aborted
3208 Set the UART state ready to be able to start again the process,
3209 Disable Rx Interrupts if ongoing */
3210 UART_EndRxTransfer(huart);
3211
3213
3214 /* Process Unlocked */
3215 __HAL_UNLOCK(huart);
3216
3217 return HAL_ERROR;
3218 }
3219 }
3220 }
3221 }
3222 return HAL_OK;
3223}
3224
3236HAL_StatusTypeDef UART_Start_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
3237{
3238 huart->pRxBuffPtr = pData;
3239 huart->RxXferSize = Size;
3240 huart->RxXferCount = Size;
3241
3244
3245 if (huart->Init.Parity != UART_PARITY_NONE)
3246 {
3247 /* Enable the UART Parity Error Interrupt */
3249 }
3250
3251 /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */
3253
3254 /* Enable the UART Data Register not empty Interrupt */
3256
3257 return HAL_OK;
3258}
3259
3272{
3273 uint32_t *tmp;
3274
3275 huart->pRxBuffPtr = pData;
3276 huart->RxXferSize = Size;
3277
3280
3281 /* Set the UART DMA transfer complete callback */
3283
3284 /* Set the UART DMA Half transfer complete callback */
3286
3287 /* Set the DMA error callback */
3289
3290 /* Set the DMA abort callback */
3291 huart->hdmarx->XferAbortCallback = NULL;
3292
3293 /* Enable the DMA stream */
3294 tmp = (uint32_t *)&pData;
3295 HAL_DMA_Start_IT(huart->hdmarx, (uint32_t)&huart->Instance->DR, *(uint32_t *)tmp, Size);
3296
3297 /* Clear the Overrun flag just before enabling the DMA Rx request: can be mandatory for the second transfer */
3299
3300 if (huart->Init.Parity != UART_PARITY_NONE)
3301 {
3302 /* Enable the UART Parity Error Interrupt */
3303 ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_PEIE);
3304 }
3305
3306 /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */
3307 ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_EIE);
3308
3309 /* Enable the DMA transfer for the receiver request by setting the DMAR bit
3310 in the UART CR3 register */
3311 ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_DMAR);
3312
3313 return HAL_OK;
3314}
3315
3322{
3323 /* Disable TXEIE and TCIE interrupts */
3324 ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE));
3325
3326 /* At end of Tx process, restore huart->gState to Ready */
3328}
3329
3336{
3337 /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
3338 ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
3339 ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
3340
3341 /* In case of reception waiting for IDLE event, disable also the IDLE IE interrupt source */
3343 {
3344 ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE);
3345 }
3346
3347 /* At end of Rx process, restore huart->RxState to Ready */
3350}
3351
3360{
3361 UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
3362 huart->RxXferCount = 0x00U;
3363 huart->TxXferCount = 0x00U;
3364
3365#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3366 /*Call registered error callback*/
3367 huart->ErrorCallback(huart);
3368#else
3369 /*Call legacy weak error callback*/
3371#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3372}
3373
3384{
3385 UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
3386
3387 huart->hdmatx->XferAbortCallback = NULL;
3388
3389 /* Check if an Abort process is still ongoing */
3390 if (huart->hdmarx != NULL)
3391 {
3392 if (huart->hdmarx->XferAbortCallback != NULL)
3393 {
3394 return;
3395 }
3396 }
3397
3398 /* No Abort process still ongoing : All DMA channels are aborted, call user Abort Complete callback */
3399 huart->TxXferCount = 0x00U;
3400 huart->RxXferCount = 0x00U;
3401
3402 /* Reset ErrorCode */
3404
3405 /* Restore huart->gState and huart->RxState to Ready */
3409
3410 /* Call user Abort complete callback */
3411#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3412 /* Call registered Abort complete callback */
3413 huart->AbortCpltCallback(huart);
3414#else
3415 /* Call legacy weak Abort complete callback */
3417#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3418}
3419
3430{
3431 UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
3432
3433 huart->hdmarx->XferAbortCallback = NULL;
3434
3435 /* Check if an Abort process is still ongoing */
3436 if (huart->hdmatx != NULL)
3437 {
3438 if (huart->hdmatx->XferAbortCallback != NULL)
3439 {
3440 return;
3441 }
3442 }
3443
3444 /* No Abort process still ongoing : All DMA channels are aborted, call user Abort Complete callback */
3445 huart->TxXferCount = 0x00U;
3446 huart->RxXferCount = 0x00U;
3447
3448 /* Reset ErrorCode */
3450
3451 /* Restore huart->gState and huart->RxState to Ready */
3455
3456 /* Call user Abort complete callback */
3457#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3458 /* Call registered Abort complete callback */
3459 huart->AbortCpltCallback(huart);
3460#else
3461 /* Call legacy weak Abort complete callback */
3463#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3464}
3465
3476{
3477 UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
3478
3479 huart->TxXferCount = 0x00U;
3480
3481 /* Restore huart->gState to Ready */
3483
3484 /* Call user Abort complete callback */
3485#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3486 /* Call registered Abort Transmit Complete Callback */
3487 huart->AbortTransmitCpltCallback(huart);
3488#else
3489 /* Call legacy weak Abort Transmit Complete Callback */
3491#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3492}
3493
3504{
3505 UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
3506
3507 huart->RxXferCount = 0x00U;
3508
3509 /* Restore huart->RxState to Ready */
3512
3513 /* Call user Abort complete callback */
3514#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3515 /* Call registered Abort Receive Complete Callback */
3516 huart->AbortReceiveCpltCallback(huart);
3517#else
3518 /* Call legacy weak Abort Receive Complete Callback */
3520#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3521}
3522
3530{
3531 const uint16_t *tmp;
3532
3533 /* Check that a Tx process is ongoing */
3534 if (huart->gState == HAL_UART_STATE_BUSY_TX)
3535 {
3536 if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
3537 {
3538 tmp = (const uint16_t *) huart->pTxBuffPtr;
3539 huart->Instance->DR = (uint16_t)(*tmp & (uint16_t)0x01FF);
3540 huart->pTxBuffPtr += 2U;
3541 }
3542 else
3543 {
3544 huart->Instance->DR = (uint8_t)(*huart->pTxBuffPtr++ & (uint8_t)0x00FF);
3545 }
3546
3547 if (--huart->TxXferCount == 0U)
3548 {
3549 /* Disable the UART Transmit Data Register Empty Interrupt */
3551
3552 /* Enable the UART Transmit Complete Interrupt */
3554 }
3555 return HAL_OK;
3556 }
3557 else
3558 {
3559 return HAL_BUSY;
3560 }
3561}
3562
3570{
3571 /* Disable the UART Transmit Complete Interrupt */
3573
3574 /* Tx process is ended, restore huart->gState to Ready */
3576
3577#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3578 /*Call registered Tx complete callback*/
3579 huart->TxCpltCallback(huart);
3580#else
3581 /*Call legacy weak Tx complete callback*/
3583#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3584
3585 return HAL_OK;
3586}
3587
3595{
3596 uint8_t *pdata8bits;
3597 uint16_t *pdata16bits;
3598
3599 /* Check that a Rx process is ongoing */
3600 if (huart->RxState == HAL_UART_STATE_BUSY_RX)
3601 {
3602 if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
3603 {
3604 pdata8bits = NULL;
3605 pdata16bits = (uint16_t *) huart->pRxBuffPtr;
3606 *pdata16bits = (uint16_t)(huart->Instance->DR & (uint16_t)0x01FF);
3607 huart->pRxBuffPtr += 2U;
3608 }
3609 else
3610 {
3611 pdata8bits = (uint8_t *) huart->pRxBuffPtr;
3612 pdata16bits = NULL;
3613
3614 if ((huart->Init.WordLength == UART_WORDLENGTH_9B) || ((huart->Init.WordLength == UART_WORDLENGTH_8B) && (huart->Init.Parity == UART_PARITY_NONE)))
3615 {
3616 *pdata8bits = (uint8_t)(huart->Instance->DR & (uint8_t)0x00FF);
3617 }
3618 else
3619 {
3620 *pdata8bits = (uint8_t)(huart->Instance->DR & (uint8_t)0x007F);
3621 }
3622 huart->pRxBuffPtr += 1U;
3623 }
3624
3625 if (--huart->RxXferCount == 0U)
3626 {
3627 /* Disable the UART Data Register not empty Interrupt */
3629
3630 /* Disable the UART Parity Error Interrupt */
3632
3633 /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
3635
3636 /* Rx process is completed, restore huart->RxState to Ready */
3638
3639 /* Initialize type of RxEvent to Transfer Complete */
3641
3642 /* Check current reception Mode :
3643 If Reception till IDLE event has been selected : */
3645 {
3646 /* Set reception type to Standard */
3648
3649 /* Disable IDLE interrupt */
3650 ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE);
3651
3652 /* Check if IDLE flag is set */
3654 {
3655 /* Clear IDLE flag in ISR */
3657 }
3658
3659#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3660 /*Call registered Rx Event callback*/
3661 huart->RxEventCallback(huart, huart->RxXferSize);
3662#else
3663 /*Call legacy weak Rx Event callback*/
3665#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3666 }
3667 else
3668 {
3669 /* Standard reception API called */
3670#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
3671 /*Call registered Rx complete callback*/
3672 huart->RxCpltCallback(huart);
3673#else
3674 /*Call legacy weak Rx complete callback*/
3676#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
3677 }
3678
3679 return HAL_OK;
3680 }
3681 return HAL_OK;
3682 }
3683 else
3684 {
3685 return HAL_BUSY;
3686 }
3687}
3688
3696{
3697 uint32_t tmpreg;
3698 uint32_t pclk;
3699
3700 /* Check the parameters */
3705
3706 /*-------------------------- USART CR2 Configuration -----------------------*/
3707 /* Configure the UART Stop Bits: Set STOP[13:12] bits
3708 according to huart->Init.StopBits value */
3709 MODIFY_REG(huart->Instance->CR2, USART_CR2_STOP, huart->Init.StopBits);
3710
3711 /*-------------------------- USART CR1 Configuration -----------------------*/
3712 /* Configure the UART Word Length, Parity and mode:
3713 Set the M bits according to huart->Init.WordLength value
3714 Set PCE and PS bits according to huart->Init.Parity value
3715 Set TE and RE bits according to huart->Init.Mode value
3716 Set OVER8 bit according to huart->Init.OverSampling value */
3717
3718 tmpreg = (uint32_t)huart->Init.WordLength | huart->Init.Parity | huart->Init.Mode | huart->Init.OverSampling;
3719 MODIFY_REG(huart->Instance->CR1,
3720 (uint32_t)(USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | USART_CR1_TE | USART_CR1_RE | USART_CR1_OVER8),
3721 tmpreg);
3722
3723 /*-------------------------- USART CR3 Configuration -----------------------*/
3724 /* Configure the UART HFC: Set CTSE and RTSE bits according to huart->Init.HwFlowCtl value */
3725 MODIFY_REG(huart->Instance->CR3, (USART_CR3_RTSE | USART_CR3_CTSE), huart->Init.HwFlowCtl);
3726
3727
3728#if defined(USART6) && defined(UART9) && defined(UART10)
3729 if ((huart->Instance == USART1) || (huart->Instance == USART6) || (huart->Instance == UART9) || (huart->Instance == UART10))
3730 {
3731 pclk = HAL_RCC_GetPCLK2Freq();
3732 }
3733#elif defined(USART6)
3734 if ((huart->Instance == USART1) || (huart->Instance == USART6))
3735 {
3736 pclk = HAL_RCC_GetPCLK2Freq();
3737 }
3738#else
3739 if (huart->Instance == USART1)
3740 {
3741 pclk = HAL_RCC_GetPCLK2Freq();
3742 }
3743#endif /* USART6 */
3744 else
3745 {
3746 pclk = HAL_RCC_GetPCLK1Freq();
3747 }
3748 /*-------------------------- USART BRR Configuration ---------------------*/
3750 {
3751 huart->Instance->BRR = UART_BRR_SAMPLING8(pclk, huart->Init.BaudRate);
3752 }
3753 else
3754 {
3755 huart->Instance->BRR = UART_BRR_SAMPLING16(pclk, huart->Init.BaudRate);
3756 }
3757}
3758
3763#endif /* HAL_UART_MODULE_ENABLED */
#define HAL_DMA_ERROR_TIMEOUT
HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma)
Aborts the DMA Transfer.
HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma)
Aborts the DMA Transfer in Interrupt mode.
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.
uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma)
Return the DMA error code.
#define DMA_CIRCULAR
#define __HAL_DMA_GET_COUNTER(__HANDLE__)
Returns the number of remaining data units in the current DMAy Streamx transfer.
uint32_t HAL_GetTick(void)
Provides a tick value in millisecond.
uint32_t HAL_RCC_GetPCLK1Freq(void)
Returns the PCLK1 frequency.
uint32_t HAL_RCC_GetPCLK2Freq(void)
Returns the PCLK2 frequency.
#define HAL_UART_ERROR_NONE
#define HAL_UART_ERROR_NE
#define HAL_UART_ERROR_DMA
#define HAL_UART_ERROR_PE
#define HAL_UART_ERROR_ORE
#define HAL_UART_ERROR_FE
void HAL_UART_MspDeInit(UART_HandleTypeDef *huart)
UART MSP DeInit.
HAL_StatusTypeDef HAL_LIN_Init(UART_HandleTypeDef *huart, uint32_t BreakDetectLength)
Initializes the LIN mode according to the specified parameters in the UART_InitTypeDef and create the...
HAL_StatusTypeDef HAL_UART_DeInit(UART_HandleTypeDef *huart)
DeInitializes the UART peripheral.
HAL_StatusTypeDef HAL_HalfDuplex_Init(UART_HandleTypeDef *huart)
Initializes the half-duplex mode according to the specified parameters in the UART_InitTypeDef and cr...
HAL_StatusTypeDef HAL_MultiProcessor_Init(UART_HandleTypeDef *huart, uint8_t Address, uint32_t WakeUpMethod)
Initializes the Multi-Processor mode according to the specified parameters in the UART_InitTypeDef an...
HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart)
Initializes the UART mode according to the specified parameters in the UART_InitTypeDef and create th...
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
UART MSP Init.
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout)
Sends an amount of data in blocking mode.
HAL_StatusTypeDef HAL_UART_AbortTransmit_IT(UART_HandleTypeDef *huart)
Abort ongoing Transmit transfer (Interrupt mode).
HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef *huart)
Abort ongoing transfers (blocking mode).
HAL_StatusTypeDef HAL_UART_Abort_IT(UART_HandleTypeDef *huart)
Abort ongoing transfers (Interrupt mode).
HAL_UART_RxEventTypeTypeDef HAL_UARTEx_GetRxEventType(UART_HandleTypeDef *huart)
Provide Rx Event type that has lead to RxEvent callback execution.
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
Rx Transfer completed callbacks.
HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint16_t *RxLen, uint32_t Timeout)
Receive an amount of data in blocking mode till either the expected number of data is received or an ...
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
Tx Transfer completed callbacks.
void HAL_UART_AbortTransmitCpltCallback(UART_HandleTypeDef *huart)
UART Abort Complete callback.
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_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)
Sends an amount of data in non blocking mode.
HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)
Sends an amount of data in DMA mode.
void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart)
Rx Half Transfer completed callbacks.
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
UART error callbacks.
HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart)
Pauses the DMA Transfer.
HAL_StatusTypeDef HAL_UART_AbortReceive(UART_HandleTypeDef *huart)
Abort ongoing Receive transfer (blocking mode).
void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
This function handles UART interrupt request.
HAL_StatusTypeDef HAL_UART_AbortReceive_IT(UART_HandleTypeDef *huart)
Abort ongoing Receive transfer (Interrupt mode).
HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart)
Stops the DMA Transfer.
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
Receives an amount of data in blocking mode.
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
Reception Event Callback (Rx event notification called after use of advanced reception service).
HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
Receives an amount of data in DMA mode.
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
Receives an amount of data in non blocking mode.
HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
Receive an amount of data in interrupt mode till either the expected number of data is received or an...
HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart)
Resumes the DMA Transfer.
void HAL_UART_AbortCpltCallback(UART_HandleTypeDef *huart)
UART Abort Complete callback.
HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
Receive an amount of data in DMA mode till either the expected number of data is received or an IDLE ...
void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart)
Tx Half Transfer completed callbacks.
HAL_StatusTypeDef HAL_HalfDuplex_EnableReceiver(UART_HandleTypeDef *huart)
Enables the UART receiver and disables the UART transmitter.
HAL_StatusTypeDef HAL_HalfDuplex_EnableTransmitter(UART_HandleTypeDef *huart)
Enables the UART transmitter and disables the UART receiver.
HAL_StatusTypeDef HAL_MultiProcessor_EnterMuteMode(UART_HandleTypeDef *huart)
Enters the UART in mute mode.
HAL_StatusTypeDef HAL_MultiProcessor_ExitMuteMode(UART_HandleTypeDef *huart)
Exits the UART mute mode: wake up software.
HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart)
Transmits break characters.
uint32_t HAL_UART_GetError(const UART_HandleTypeDef *huart)
Return the UART error code.
HAL_UART_StateTypeDef HAL_UART_GetState(const UART_HandleTypeDef *huart)
Returns the UART state.
#define __HAL_UART_CLEAR_IDLEFLAG(__HANDLE__)
Clears the UART IDLE pending flag.
#define __HAL_UART_GET_FLAG(__HANDLE__, __FLAG__)
Checks whether the specified UART flag is set or not.
#define __HAL_UART_DISABLE_IT(__HANDLE__, __INTERRUPT__)
Disable the specified UART interrupt.
#define __HAL_UART_ENABLE(__HANDLE__)
Enable UART.
#define __HAL_UART_CLEAR_FLAG(__HANDLE__, __FLAG__)
Clears the specified UART pending flag.
#define __HAL_UART_CLEAR_OREFLAG(__HANDLE__)
Clears the UART ORE pending flag.
#define __HAL_UART_ENABLE_IT(__HANDLE__, __INTERRUPT__)
Enable the specified UART interrupt.
#define __HAL_UART_DISABLE(__HANDLE__)
Disable UART.
uint32_t HAL_UART_RxEventTypeTypeDef
HAL UART Rx Event type definition.
HAL_UART_StateTypeDef
HAL UART State structures definition.
@ HAL_UART_STATE_RESET
@ HAL_UART_STATE_BUSY
@ HAL_UART_STATE_BUSY_TX
@ HAL_UART_STATE_READY
@ HAL_UART_STATE_BUSY_RX
#define UART_FLAG_ORE
#define UART_FLAG_IDLE
#define UART_FLAG_TC
#define UART_FLAG_RXNE
#define UART_FLAG_TXE
#define UART_HWCONTROL_NONE
#define UART_IT_TXE
#define UART_IT_PE
#define UART_IT_ERR
#define UART_IT_TC
#define UART_IT_RXNE
#define UART_OVERSAMPLING_8
#define UART_PARITY_NONE
static void UART_SetConfig(UART_HandleTypeDef *huart)
Configures the UART peripheral.
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_DMARxHalfCplt(DMA_HandleTypeDef *hdma)
DMA UART receive process half complete callback.
HAL_StatusTypeDef UART_Start_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
Start Receive operation in DMA mode.
static void UART_DMATxOnlyAbortCallback(DMA_HandleTypeDef *hdma)
DMA UART Tx communication abort callback, when initiated by user by a call to HAL_UART_AbortTransmit_...
HAL_StatusTypeDef UART_Start_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
Start Receive operation in 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_DMATxAbortCallback(DMA_HandleTypeDef *hdma)
DMA UART Tx communication abort callback, when initiated by user (To be called at end of DMA Tx Abort...
static HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart)
Receives an amount of data in non blocking mode.
static void UART_DMAError(DMA_HandleTypeDef *hdma)
DMA UART communication error callback.
static void UART_EndRxTransfer(UART_HandleTypeDef *huart)
End ongoing Rx transfer on UART peripheral (following error detection or Reception completion).
static HAL_StatusTypeDef UART_EndTransmit_IT(UART_HandleTypeDef *huart)
Wraps up transmission in non blocking mode.
static HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout)
This function handles UART Communication Timeout. It waits until a flag is no longer in the specified...
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...
static void UART_DMATransmitCplt(DMA_HandleTypeDef *hdma)
Initialize the callbacks to their default values.
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...
static HAL_StatusTypeDef UART_Transmit_IT(UART_HandleTypeDef *huart)
Sends an amount of data in non blocking mode.
static void UART_DMATxHalfCplt(DMA_HandleTypeDef *hdma)
DMA UART transmit process half complete callback.
static void UART_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
DMA UART receive process complete callback.
#define IS_UART_LIN_WORD_LENGTH(LENGTH)
#define IS_UART_ADDRESS(ADDRESS)
#define IS_UART_STOPBITS(STOPBITS)
#define IS_UART_HARDWARE_FLOW_CONTROL(CONTROL)
#define IS_UART_WORD_LENGTH(LENGTH)
#define IS_UART_BAUDRATE(BAUDRATE)
#define IS_UART_LIN_BREAK_DETECT_LENGTH(LENGTH)
#define IS_UART_WAKEUPMETHOD(WAKEUP)
#define IS_UART_MODE(MODE)
#define IS_UART_OVERSAMPLING(SAMPLING)
#define IS_UART_LIN_OVERSAMPLING(SAMPLING)
#define UART_BRR_SAMPLING8(_PCLK_, _BAUD_)
#define UART_BRR_SAMPLING16(_PCLK_, _BAUD_)
#define IS_UART_PARITY(PARITY)
#define HAL_UART_RECEPTION_TOIDLE
#define HAL_UART_RECEPTION_STANDARD
#define HAL_UART_RXEVENT_HT
#define HAL_UART_RXEVENT_IDLE
#define HAL_UART_RXEVENT_TC
#define UART_WORDLENGTH_8B
#define UART_WORDLENGTH_9B
#define assert_param(expr)
This file contains all the functions prototypes for the HAL module driver.
#define HAL_IS_BIT_SET(REG, BIT)
HAL_StatusTypeDef
HAL Status structures definition
@ HAL_TIMEOUT
@ HAL_ERROR
@ HAL_OK
@ HAL_BUSY
#define UNUSED(X)
#define __HAL_UNLOCK(__HANDLE__)
#define HAL_MAX_DELAY
@ HAL_UNLOCKED
#define __HAL_LOCK(__HANDLE__)
DMA handle Structure definition.
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
void(* XferCpltCallback)(struct __DMA_HandleTypeDef *hdma)
void(* XferErrorCallback)(struct __DMA_HandleTypeDef *hdma)
void(* XferHalfCpltCallback)(struct __DMA_HandleTypeDef *hdma)
DMA_Stream_TypeDef * Instance
UART handle Structure definition.
__IO HAL_UART_RxEventTypeTypeDef RxEventType
__IO HAL_UART_StateTypeDef gState
__IO HAL_UART_StateTypeDef RxState
DMA_HandleTypeDef * hdmarx
__IO HAL_UART_RxTypeTypeDef ReceptionType
DMA_HandleTypeDef * hdmatx