STM32F4xx HAL Driver master
STM32CubeF4 HAL / LL Drivers API Reference
Loading...
Searching...
No Matches
stm32f4xx_hal_smartcard.c
Go to the documentation of this file.
1
174
175/* Includes ------------------------------------------------------------------*/
176#include "stm32f4xx_hal.h"
177
181
186#ifdef HAL_SMARTCARD_MODULE_ENABLED
187/* Private typedef -----------------------------------------------------------*/
188/* Private define ------------------------------------------------------------*/
195
196/* Private macro -------------------------------------------------------------*/
197/* Private variables ---------------------------------------------------------*/
198/* Private function prototypes -----------------------------------------------*/
202#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
203void SMARTCARD_InitCallbacksToDefault(SMARTCARD_HandleTypeDef *hsc);
204#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACKS */
205static void SMARTCARD_EndTxTransfer(SMARTCARD_HandleTypeDef *hsc);
206static void SMARTCARD_EndRxTransfer(SMARTCARD_HandleTypeDef *hsc);
207static void SMARTCARD_SetConfig (SMARTCARD_HandleTypeDef *hsc);
208static HAL_StatusTypeDef SMARTCARD_Transmit_IT(SMARTCARD_HandleTypeDef *hsc);
209static HAL_StatusTypeDef SMARTCARD_EndTransmit_IT(SMARTCARD_HandleTypeDef *hsc);
210static HAL_StatusTypeDef SMARTCARD_Receive_IT(SMARTCARD_HandleTypeDef *hsc);
211static void SMARTCARD_DMATransmitCplt(DMA_HandleTypeDef *hdma);
212static void SMARTCARD_DMAReceiveCplt(DMA_HandleTypeDef *hdma);
213static void SMARTCARD_DMAError(DMA_HandleTypeDef *hdma);
214static void SMARTCARD_DMAAbortOnError(DMA_HandleTypeDef *hdma);
215static void SMARTCARD_DMATxAbortCallback(DMA_HandleTypeDef *hdma);
216static void SMARTCARD_DMARxAbortCallback(DMA_HandleTypeDef *hdma);
217static void SMARTCARD_DMATxOnlyAbortCallback(DMA_HandleTypeDef *hdma);
218static void SMARTCARD_DMARxOnlyAbortCallback(DMA_HandleTypeDef *hdma);
219static HAL_StatusTypeDef SMARTCARD_WaitOnFlagUntilTimeout(SMARTCARD_HandleTypeDef *hsc, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout);
223
224/* Exported functions --------------------------------------------------------*/
228
291
300{
301 /* Check the SMARTCARD handle allocation */
302 if(hsc == NULL)
303 {
304 return HAL_ERROR;
305 }
306
307 /* Check the parameters */
308 assert_param(IS_SMARTCARD_INSTANCE(hsc->Instance));
310
312 {
313 /* Allocate lock resource and initialize it */
314 hsc->Lock = HAL_UNLOCKED;
315
316#if USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1
317 SMARTCARD_InitCallbacksToDefault(hsc);
318
319 if (hsc->MspInitCallback == NULL)
320 {
321 hsc->MspInitCallback = HAL_SMARTCARD_MspInit;
322 }
323
324 /* Init the low level hardware */
325 hsc->MspInitCallback(hsc);
326#else
327 /* Init the low level hardware : GPIO, CLOCK */
329#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACKS */
330 }
331
333
334 /* Set the Prescaler */
335 MODIFY_REG(hsc->Instance->GTPR, USART_GTPR_PSC, hsc->Init.Prescaler);
336
337 /* Set the Guard Time */
338 MODIFY_REG(hsc->Instance->GTPR, USART_GTPR_GT, ((hsc->Init.GuardTime)<<8U));
339
340 /* Set the Smartcard Communication parameters */
341 SMARTCARD_SetConfig(hsc);
342
343 /* In SmartCard mode, the following bits must be kept cleared:
344 - LINEN bit in the USART_CR2 register
345 - HDSEL and IREN bits in the USART_CR3 register.*/
346 CLEAR_BIT(hsc->Instance->CR2, USART_CR2_LINEN);
347 CLEAR_BIT(hsc->Instance->CR3, (USART_CR3_IREN | USART_CR3_HDSEL));
348
349 /* Enable the SMARTCARD Parity Error Interrupt */
350 SET_BIT(hsc->Instance->CR1, USART_CR1_PEIE);
351
352 /* Enable the SMARTCARD Framing Error Interrupt */
353 SET_BIT(hsc->Instance->CR3, USART_CR3_EIE);
354
355 /* Enable the Peripheral */
357
358 /* Configure the Smartcard NACK state */
359 MODIFY_REG(hsc->Instance->CR3, USART_CR3_NACK, hsc->Init.NACKState);
360
361 /* Enable the SC mode by setting the SCEN bit in the CR3 register */
362 hsc->Instance->CR3 |= (USART_CR3_SCEN);
363
364 /* Initialize the SMARTCARD state*/
368
369 return HAL_OK;
370}
371
379{
380 /* Check the SMARTCARD handle allocation */
381 if(hsc == NULL)
382 {
383 return HAL_ERROR;
384 }
385
386 /* Check the parameters */
387 assert_param(IS_SMARTCARD_INSTANCE(hsc->Instance));
388
390
391 /* Disable the Peripheral */
393
394 /* DeInit the low level hardware */
395#if USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1
396 if (hsc->MspDeInitCallback == NULL)
397 {
398 hsc->MspDeInitCallback = HAL_SMARTCARD_MspDeInit;
399 }
400 /* DeInit the low level hardware */
401 hsc->MspDeInitCallback(hsc);
402#else
404#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACKS */
405
409
410 /* Release Lock */
411 __HAL_UNLOCK(hsc);
412
413 return HAL_OK;
414}
415
423{
424 /* Prevent unused argument(s) compilation warning */
425 UNUSED(hsc);
426
427 /* NOTE : This function should not be modified, when the callback is needed,
428 the HAL_SMARTCARD_MspInit can be implemented in the user file
429 */
430}
431
439{
440 /* Prevent unused argument(s) compilation warning */
441 UNUSED(hsc);
442
443 /* NOTE : This function should not be modified, when the callback is needed,
444 the HAL_SMARTCARD_MspDeInit can be implemented in the user file
445 */
446}
447
448#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
469HAL_StatusTypeDef HAL_SMARTCARD_RegisterCallback(SMARTCARD_HandleTypeDef *hsc, HAL_SMARTCARD_CallbackIDTypeDef CallbackID, pSMARTCARD_CallbackTypeDef pCallback)
470{
471 HAL_StatusTypeDef status = HAL_OK;
472
473 if (pCallback == NULL)
474 {
475 /* Update the error code */
476 hsc->ErrorCode |= HAL_SMARTCARD_ERROR_INVALID_CALLBACK;
477
478 return HAL_ERROR;
479 }
480
482 {
483 switch (CallbackID)
484 {
485
486 case HAL_SMARTCARD_TX_COMPLETE_CB_ID :
487 hsc->TxCpltCallback = pCallback;
488 break;
489
490 case HAL_SMARTCARD_RX_COMPLETE_CB_ID :
491 hsc->RxCpltCallback = pCallback;
492 break;
493
494 case HAL_SMARTCARD_ERROR_CB_ID :
495 hsc->ErrorCallback = pCallback;
496 break;
497
498 case HAL_SMARTCARD_ABORT_COMPLETE_CB_ID :
499 hsc->AbortCpltCallback = pCallback;
500 break;
501
502 case HAL_SMARTCARD_ABORT_TRANSMIT_COMPLETE_CB_ID :
503 hsc->AbortTransmitCpltCallback = pCallback;
504 break;
505
506 case HAL_SMARTCARD_ABORT_RECEIVE_COMPLETE_CB_ID :
507 hsc->AbortReceiveCpltCallback = pCallback;
508 break;
509
510
511 case HAL_SMARTCARD_MSPINIT_CB_ID :
512 hsc->MspInitCallback = pCallback;
513 break;
514
515 case HAL_SMARTCARD_MSPDEINIT_CB_ID :
516 hsc->MspDeInitCallback = pCallback;
517 break;
518
519 default :
520 /* Update the error code */
521 hsc->ErrorCode |= HAL_SMARTCARD_ERROR_INVALID_CALLBACK;
522
523 /* Return error status */
524 status = HAL_ERROR;
525 break;
526 }
527 }
528 else if (hsc->gState == HAL_SMARTCARD_STATE_RESET)
529 {
530 switch (CallbackID)
531 {
532 case HAL_SMARTCARD_MSPINIT_CB_ID :
533 hsc->MspInitCallback = pCallback;
534 break;
535
536 case HAL_SMARTCARD_MSPDEINIT_CB_ID :
537 hsc->MspDeInitCallback = pCallback;
538 break;
539
540 default :
541 /* Update the error code */
542 hsc->ErrorCode |= HAL_SMARTCARD_ERROR_INVALID_CALLBACK;
543
544 /* Return error status */
545 status = HAL_ERROR;
546 break;
547 }
548 }
549 else
550 {
551 /* Update the error code */
552 hsc->ErrorCode |= HAL_SMARTCARD_ERROR_INVALID_CALLBACK;
553
554 /* Return error status */
555 status = HAL_ERROR;
556 }
557
558 return status;
559}
560
580HAL_StatusTypeDef HAL_SMARTCARD_UnRegisterCallback(SMARTCARD_HandleTypeDef *hsc, HAL_SMARTCARD_CallbackIDTypeDef CallbackID)
581{
582 HAL_StatusTypeDef status = HAL_OK;
583
585 {
586 switch (CallbackID)
587 {
588 case HAL_SMARTCARD_TX_COMPLETE_CB_ID :
589 hsc->TxCpltCallback = HAL_SMARTCARD_TxCpltCallback; /* Legacy weak TxCpltCallback */
590 break;
591
592 case HAL_SMARTCARD_RX_COMPLETE_CB_ID :
593 hsc->RxCpltCallback = HAL_SMARTCARD_RxCpltCallback; /* Legacy weak RxCpltCallback */
594 break;
595
596 case HAL_SMARTCARD_ERROR_CB_ID :
597 hsc->ErrorCallback = HAL_SMARTCARD_ErrorCallback; /* Legacy weak ErrorCallback */
598 break;
599
600 case HAL_SMARTCARD_ABORT_COMPLETE_CB_ID :
601 hsc->AbortCpltCallback = HAL_SMARTCARD_AbortCpltCallback; /* Legacy weak AbortCpltCallback */
602 break;
603
604 case HAL_SMARTCARD_ABORT_TRANSMIT_COMPLETE_CB_ID :
605 hsc->AbortTransmitCpltCallback = HAL_SMARTCARD_AbortTransmitCpltCallback; /* Legacy weak AbortTransmitCpltCallback */
606 break;
607
608 case HAL_SMARTCARD_ABORT_RECEIVE_COMPLETE_CB_ID :
609 hsc->AbortReceiveCpltCallback = HAL_SMARTCARD_AbortReceiveCpltCallback; /* Legacy weak AbortReceiveCpltCallback */
610 break;
611
612
613 case HAL_SMARTCARD_MSPINIT_CB_ID :
614 hsc->MspInitCallback = HAL_SMARTCARD_MspInit; /* Legacy weak MspInitCallback */
615 break;
616
617 case HAL_SMARTCARD_MSPDEINIT_CB_ID :
618 hsc->MspDeInitCallback = HAL_SMARTCARD_MspDeInit; /* Legacy weak MspDeInitCallback */
619 break;
620
621 default :
622 /* Update the error code */
623 hsc->ErrorCode |= HAL_SMARTCARD_ERROR_INVALID_CALLBACK;
624
625 /* Return error status */
626 status = HAL_ERROR;
627 break;
628 }
629 }
630 else if (HAL_SMARTCARD_STATE_RESET == hsc->gState)
631 {
632 switch (CallbackID)
633 {
634 case HAL_SMARTCARD_MSPINIT_CB_ID :
635 hsc->MspInitCallback = HAL_SMARTCARD_MspInit;
636 break;
637
638 case HAL_SMARTCARD_MSPDEINIT_CB_ID :
639 hsc->MspDeInitCallback = HAL_SMARTCARD_MspDeInit;
640 break;
641
642 default :
643 /* Update the error code */
644 hsc->ErrorCode |= HAL_SMARTCARD_ERROR_INVALID_CALLBACK;
645
646 /* Return error status */
647 status = HAL_ERROR;
648 break;
649 }
650 }
651 else
652 {
653 /* Update the error code */
654 hsc->ErrorCode |= HAL_SMARTCARD_ERROR_INVALID_CALLBACK;
655
656 /* Return error status */
657 status = HAL_ERROR;
658 }
659
660 return status;
661}
662#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACKS */
663
667
744
754HAL_StatusTypeDef HAL_SMARTCARD_Transmit(SMARTCARD_HandleTypeDef *hsc, const uint8_t *pData, uint16_t Size, uint32_t Timeout)
755{
756 const uint8_t *tmp = pData;
757 uint32_t tickstart = 0U;
758
760 {
761 if((pData == NULL) || (Size == 0U))
762 {
763 return HAL_ERROR;
764 }
765
766 /* Process Locked */
767 __HAL_LOCK(hsc);
768
771
772 /* Init tickstart for timeout management */
773 tickstart = HAL_GetTick();
774
775 hsc->TxXferSize = Size;
776 hsc->TxXferCount = Size;
777 while(hsc->TxXferCount > 0U)
778 {
779 hsc->TxXferCount--;
780 if(SMARTCARD_WaitOnFlagUntilTimeout(hsc, SMARTCARD_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
781 {
782 return HAL_TIMEOUT;
783 }
784 hsc->Instance->DR = (uint8_t)(*tmp & 0xFFU);
785 tmp++;
786 }
787
788 if(SMARTCARD_WaitOnFlagUntilTimeout(hsc, SMARTCARD_FLAG_TC, RESET, tickstart, Timeout) != HAL_OK)
789 {
790 return HAL_TIMEOUT;
791 }
792
793 /* At end of Tx process, restore hsc->gState to Ready */
795
796 /* Process Unlocked */
797 __HAL_UNLOCK(hsc);
798
799 return HAL_OK;
800 }
801 else
802 {
803 return HAL_BUSY;
804 }
805}
806
816HAL_StatusTypeDef HAL_SMARTCARD_Receive(SMARTCARD_HandleTypeDef *hsc, uint8_t *pData, uint16_t Size, uint32_t Timeout)
817{
818 uint8_t *tmp = pData;
819 uint32_t tickstart = 0U;
820
822 {
823 if((pData == NULL) || (Size == 0U))
824 {
825 return HAL_ERROR;
826 }
827
828 /* Process Locked */
829 __HAL_LOCK(hsc);
830
833
834 /* Init tickstart for timeout management */
835 tickstart = HAL_GetTick();
836
837 hsc->RxXferSize = Size;
838 hsc->RxXferCount = Size;
839
840 /* Check the remain data to be received */
841 while(hsc->RxXferCount > 0U)
842 {
843 hsc->RxXferCount--;
844 if(SMARTCARD_WaitOnFlagUntilTimeout(hsc, SMARTCARD_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK)
845 {
846 return HAL_TIMEOUT;
847 }
848 *tmp = (uint8_t)(hsc->Instance->DR & (uint8_t)0xFFU);
849 tmp++;
850 }
851
852 /* At end of Rx process, restore hsc->RxState to Ready */
854
855 /* Process Unlocked */
856 __HAL_UNLOCK(hsc);
857
858 return HAL_OK;
859 }
860 else
861 {
862 return HAL_BUSY;
863 }
864}
865
874HAL_StatusTypeDef HAL_SMARTCARD_Transmit_IT(SMARTCARD_HandleTypeDef *hsc, const uint8_t *pData, uint16_t Size)
875{
876 /* Check that a Tx process is not already ongoing */
878 {
879 if((pData == NULL) || (Size == 0U))
880 {
881 return HAL_ERROR;
882 }
883
884 /* Process Locked */
885 __HAL_LOCK(hsc);
886
887 hsc->pTxBuffPtr = pData;
888 hsc->TxXferSize = Size;
889 hsc->TxXferCount = Size;
890
893
894 /* Process Unlocked */
895 __HAL_UNLOCK(hsc);
896
897 /* Enable the SMARTCARD Parity Error Interrupt */
898 SET_BIT(hsc->Instance->CR1, USART_CR1_PEIE);
899
900 /* Disable the SMARTCARD Error Interrupt: (Frame error, noise error, overrun error) */
901 CLEAR_BIT(hsc->Instance->CR3, USART_CR3_EIE);
902
903 /* Enable the SMARTCARD Transmit data register empty Interrupt */
904 SET_BIT(hsc->Instance->CR1, USART_CR1_TXEIE);
905
906 return HAL_OK;
907 }
908 else
909 {
910 return HAL_BUSY;
911 }
912}
913
922HAL_StatusTypeDef HAL_SMARTCARD_Receive_IT(SMARTCARD_HandleTypeDef *hsc, uint8_t *pData, uint16_t Size)
923{
924 /* Check that a Rx process is not already ongoing */
926 {
927 if((pData == NULL) || (Size == 0U))
928 {
929 return HAL_ERROR;
930 }
931
932 /* Process Locked */
933 __HAL_LOCK(hsc);
934
935 hsc->pRxBuffPtr = pData;
936 hsc->RxXferSize = Size;
937 hsc->RxXferCount = Size;
938
941
942 /* Process Unlocked */
943 __HAL_UNLOCK(hsc);
944
945 /* Enable the SMARTCARD Parity Error and Data Register not empty Interrupts */
946 SET_BIT(hsc->Instance->CR1, USART_CR1_PEIE| USART_CR1_RXNEIE);
947
948 /* Enable the SMARTCARD Error Interrupt: (Frame error, noise error, overrun error) */
949 SET_BIT(hsc->Instance->CR3, USART_CR3_EIE);
950
951 return HAL_OK;
952 }
953 else
954 {
955 return HAL_BUSY;
956 }
957}
958
967HAL_StatusTypeDef HAL_SMARTCARD_Transmit_DMA(SMARTCARD_HandleTypeDef *hsc, const uint8_t *pData, uint16_t Size)
968{
969 const uint32_t *tmp;
970
971 /* Check that a Tx process is not already ongoing */
973 {
974 if((pData == NULL) || (Size == 0U))
975 {
976 return HAL_ERROR;
977 }
978
979 /* Process Locked */
980 __HAL_LOCK(hsc);
981
982 hsc->pTxBuffPtr = pData;
983 hsc->TxXferSize = Size;
984 hsc->TxXferCount = Size;
985
988
989 /* Set the SMARTCARD DMA transfer complete callback */
990 hsc->hdmatx->XferCpltCallback = SMARTCARD_DMATransmitCplt;
991
992 /* Set the DMA error callback */
993 hsc->hdmatx->XferErrorCallback = SMARTCARD_DMAError;
994
995 /* Set the DMA abort callback */
996 hsc->hdmatx->XferAbortCallback = NULL;
997
998 /* Enable the SMARTCARD transmit DMA stream */
999 tmp = (const uint32_t*)&pData;
1000 if (HAL_DMA_Start_IT(hsc->hdmatx, *(const uint32_t*)tmp, (uint32_t)&hsc->Instance->DR, Size) == HAL_OK)
1001 {
1002 /* Clear the TC flag in the SR register by writing 0 to it */
1004
1005 /* Process Unlocked */
1006 __HAL_UNLOCK(hsc);
1007
1008 /* Enable the DMA transfer for transmit request by setting the DMAT bit
1009 in the SMARTCARD CR3 register */
1010 SET_BIT(hsc->Instance->CR3, USART_CR3_DMAT);
1011
1012 return HAL_OK;
1013 }
1014 else
1015 {
1016 /* Set error code to DMA */
1018
1019 /* Process Unlocked */
1020 __HAL_UNLOCK(hsc);
1021
1022 /* Restore hsc->State to ready */
1024
1025 return HAL_ERROR;
1026 }
1027 }
1028 else
1029 {
1030 return HAL_BUSY;
1031 }
1032}
1033
1043HAL_StatusTypeDef HAL_SMARTCARD_Receive_DMA(SMARTCARD_HandleTypeDef *hsc, uint8_t *pData, uint16_t Size)
1044{
1045 uint32_t *tmp;
1046
1047 /* Check that a Rx process is not already ongoing */
1049 {
1050 if((pData == NULL) || (Size == 0U))
1051 {
1052 return HAL_ERROR;
1053 }
1054
1055 /* Process Locked */
1056 __HAL_LOCK(hsc);
1057
1058 hsc->pRxBuffPtr = pData;
1059 hsc->RxXferSize = Size;
1060
1063
1064 /* Set the SMARTCARD DMA transfer complete callback */
1065 hsc->hdmarx->XferCpltCallback = SMARTCARD_DMAReceiveCplt;
1066
1067 /* Set the DMA error callback */
1068 hsc->hdmarx->XferErrorCallback = SMARTCARD_DMAError;
1069
1070 /* Set the DMA abort callback */
1071 hsc->hdmatx->XferAbortCallback = NULL;
1072
1073 /* Enable the DMA stream */
1074 tmp = (uint32_t*)&pData;
1075 if (HAL_DMA_Start_IT(hsc->hdmarx, (uint32_t)&hsc->Instance->DR, *(uint32_t*)tmp, Size) == HAL_OK)
1076 {
1077 /* Clear the Overrun flag just before enabling the DMA Rx request: can be mandatory for the second transfer */
1079
1080 /* Process Unlocked */
1081 __HAL_UNLOCK(hsc);
1082
1083 /* Enable the SMARTCARD Parity Error Interrupt */
1084 SET_BIT(hsc->Instance->CR1, USART_CR1_PEIE);
1085
1086 /* Enable the SMARTCARD Error Interrupt: (Frame error, noise error, overrun error) */
1087 SET_BIT(hsc->Instance->CR3, USART_CR3_EIE);
1088
1089 /* Enable the DMA transfer for the receiver request by setting the DMAR bit
1090 in the SMARTCARD CR3 register */
1091 SET_BIT(hsc->Instance->CR3, USART_CR3_DMAR);
1092
1093 return HAL_OK;
1094 }
1095 else
1096 {
1097 /* Set error code to DMA */
1099
1100 /* Process Unlocked */
1101 __HAL_UNLOCK(hsc);
1102
1103 /* Restore hsc->State to ready */
1105
1106 return HAL_ERROR;
1107 }
1108 }
1109 else
1110 {
1111 return HAL_BUSY;
1112 }
1113}
1114
1128{
1129 /* Disable TXEIE, TCIE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
1130 CLEAR_BIT(hsc->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE | USART_CR1_TCIE));
1131 CLEAR_BIT(hsc->Instance->CR3, USART_CR3_EIE);
1132
1133 /* Disable the SMARTCARD DMA Tx request if enabled */
1134 if(HAL_IS_BIT_SET(hsc->Instance->CR3, USART_CR3_DMAT))
1135 {
1136 CLEAR_BIT(hsc->Instance->CR3, USART_CR3_DMAT);
1137
1138 /* Abort the SMARTCARD DMA Tx channel : use blocking DMA Abort API (no callback) */
1139 if(hsc->hdmatx != NULL)
1140 {
1141 /* Set the SMARTCARD DMA Abort callback to Null.
1142 No call back execution at end of DMA abort procedure */
1143 hsc->hdmatx->XferAbortCallback = NULL;
1144
1145 HAL_DMA_Abort(hsc->hdmatx);
1146 }
1147 }
1148
1149 /* Disable the SMARTCARD DMA Rx request if enabled */
1150 if(HAL_IS_BIT_SET(hsc->Instance->CR3, USART_CR3_DMAR))
1151 {
1152 CLEAR_BIT(hsc->Instance->CR3, USART_CR3_DMAR);
1153
1154 /* Abort the SMARTCARD DMA Rx channel : use blocking DMA Abort API (no callback) */
1155 if(hsc->hdmarx != NULL)
1156 {
1157 /* Set the SMARTCARD DMA Abort callback to Null.
1158 No call back execution at end of DMA abort procedure */
1159 hsc->hdmarx->XferAbortCallback = NULL;
1160
1161 HAL_DMA_Abort(hsc->hdmarx);
1162 }
1163 }
1164
1165 /* Reset Tx and Rx transfer counters */
1166 hsc->TxXferCount = 0x00U;
1167 hsc->RxXferCount = 0x00U;
1168
1169 /* Reset ErrorCode */
1171
1172 /* Restore hsc->RxState and hsc->gState to Ready */
1175
1176 return HAL_OK;
1177}
1178
1192{
1193 /* Disable TXEIE and TCIE interrupts */
1194 CLEAR_BIT(hsc->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE));
1195
1196 /* Disable the SMARTCARD DMA Tx request if enabled */
1197 if(HAL_IS_BIT_SET(hsc->Instance->CR3, USART_CR3_DMAT))
1198 {
1199 CLEAR_BIT(hsc->Instance->CR3, USART_CR3_DMAT);
1200
1201 /* Abort the SMARTCARD DMA Tx channel : use blocking DMA Abort API (no callback) */
1202 if(hsc->hdmatx != NULL)
1203 {
1204 /* Set the SMARTCARD DMA Abort callback to Null.
1205 No call back execution at end of DMA abort procedure */
1206 hsc->hdmatx->XferAbortCallback = NULL;
1207
1208 HAL_DMA_Abort(hsc->hdmatx);
1209 }
1210 }
1211
1212 /* Reset Tx transfer counter */
1213 hsc->TxXferCount = 0x00U;
1214
1215 /* Restore hsc->gState to Ready */
1217
1218 return HAL_OK;
1219}
1220
1234{
1235 /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
1236 CLEAR_BIT(hsc->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
1237 CLEAR_BIT(hsc->Instance->CR3, USART_CR3_EIE);
1238
1239 /* Disable the SMARTCARD DMA Rx request if enabled */
1240 if(HAL_IS_BIT_SET(hsc->Instance->CR3, USART_CR3_DMAR))
1241 {
1242 CLEAR_BIT(hsc->Instance->CR3, USART_CR3_DMAR);
1243
1244 /* Abort the SMARTCARD DMA Rx channel : use blocking DMA Abort API (no callback) */
1245 if(hsc->hdmarx != NULL)
1246 {
1247 /* Set the SMARTCARD DMA Abort callback to Null.
1248 No call back execution at end of DMA abort procedure */
1249 hsc->hdmarx->XferAbortCallback = NULL;
1250
1251 HAL_DMA_Abort(hsc->hdmarx);
1252 }
1253 }
1254
1255 /* Reset Rx transfer counter */
1256 hsc->RxXferCount = 0x00U;
1257
1258 /* Restore hsc->RxState to Ready */
1260
1261 return HAL_OK;
1262}
1263
1279{
1280 uint32_t AbortCplt = 0x01U;
1281
1282 /* Disable TXEIE, TCIE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
1283 CLEAR_BIT(hsc->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE | USART_CR1_TCIE));
1284 CLEAR_BIT(hsc->Instance->CR3, USART_CR3_EIE);
1285
1286 /* If DMA Tx and/or DMA Rx Handles are associated to SMARTCARD Handle, DMA Abort complete callbacks should be initialised
1287 before any call to DMA Abort functions */
1288 /* DMA Tx Handle is valid */
1289 if(hsc->hdmatx != NULL)
1290 {
1291 /* Set DMA Abort Complete callback if SMARTCARD DMA Tx request if enabled.
1292 Otherwise, set it to NULL */
1293 if(HAL_IS_BIT_SET(hsc->Instance->CR3, USART_CR3_DMAT))
1294 {
1295 hsc->hdmatx->XferAbortCallback = SMARTCARD_DMATxAbortCallback;
1296 }
1297 else
1298 {
1299 hsc->hdmatx->XferAbortCallback = NULL;
1300 }
1301 }
1302 /* DMA Rx Handle is valid */
1303 if(hsc->hdmarx != NULL)
1304 {
1305 /* Set DMA Abort Complete callback if SMARTCARD DMA Rx request if enabled.
1306 Otherwise, set it to NULL */
1307 if(HAL_IS_BIT_SET(hsc->Instance->CR3, USART_CR3_DMAR))
1308 {
1309 hsc->hdmarx->XferAbortCallback = SMARTCARD_DMARxAbortCallback;
1310 }
1311 else
1312 {
1313 hsc->hdmarx->XferAbortCallback = NULL;
1314 }
1315 }
1316
1317 /* Disable the SMARTCARD DMA Tx request if enabled */
1318 if(HAL_IS_BIT_SET(hsc->Instance->CR3, USART_CR3_DMAT))
1319 {
1320 /* Disable DMA Tx at SMARTCARD level */
1321 CLEAR_BIT(hsc->Instance->CR3, USART_CR3_DMAT);
1322
1323 /* Abort the SMARTCARD DMA Tx channel : use non blocking DMA Abort API (callback) */
1324 if(hsc->hdmatx != NULL)
1325 {
1326 /* SMARTCARD Tx DMA Abort callback has already been initialised :
1327 will lead to call HAL_SMARTCARD_AbortCpltCallback() at end of DMA abort procedure */
1328
1329 /* Abort DMA TX */
1330 if(HAL_DMA_Abort_IT(hsc->hdmatx) != HAL_OK)
1331 {
1332 hsc->hdmatx->XferAbortCallback = NULL;
1333 }
1334 else
1335 {
1336 AbortCplt = 0x00U;
1337 }
1338 }
1339 }
1340
1341 /* Disable the SMARTCARD DMA Rx request if enabled */
1342 if(HAL_IS_BIT_SET(hsc->Instance->CR3, USART_CR3_DMAR))
1343 {
1344 CLEAR_BIT(hsc->Instance->CR3, USART_CR3_DMAR);
1345
1346 /* Abort the SMARTCARD DMA Rx channel : use non blocking DMA Abort API (callback) */
1347 if(hsc->hdmarx != NULL)
1348 {
1349 /* SMARTCARD Rx DMA Abort callback has already been initialised :
1350 will lead to call HAL_SMARTCARD_AbortCpltCallback() at end of DMA abort procedure */
1351
1352 /* Abort DMA RX */
1353 if(HAL_DMA_Abort_IT(hsc->hdmarx) != HAL_OK)
1354 {
1355 hsc->hdmarx->XferAbortCallback = NULL;
1356 AbortCplt = 0x01U;
1357 }
1358 else
1359 {
1360 AbortCplt = 0x00U;
1361 }
1362 }
1363 }
1364
1365 /* if no DMA abort complete callback execution is required => call user Abort Complete callback */
1366 if(AbortCplt == 0x01U)
1367 {
1368 /* Reset Tx and Rx transfer counters */
1369 hsc->TxXferCount = 0x00U;
1370 hsc->RxXferCount = 0x00U;
1371
1372 /* Reset ErrorCode */
1374
1375 /* Restore hsc->gState and hsc->RxState to Ready */
1378
1379 /* As no DMA to be aborted, call directly user Abort complete callback */
1380#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
1381 /* Call registered Abort complete callback */
1382 hsc->AbortCpltCallback(hsc);
1383#else
1384 /* Call legacy weak Abort complete callback */
1386#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */
1387 }
1388 return HAL_OK;
1389}
1390
1406{
1407 /* Disable TXEIE and TCIE interrupts */
1408 CLEAR_BIT(hsc->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE));
1409
1410 /* Disable the SMARTCARD DMA Tx request if enabled */
1411 if(HAL_IS_BIT_SET(hsc->Instance->CR3, USART_CR3_DMAT))
1412 {
1413 CLEAR_BIT(hsc->Instance->CR3, USART_CR3_DMAT);
1414
1415 /* Abort the SMARTCARD DMA Tx channel : use blocking DMA Abort API (no callback) */
1416 if(hsc->hdmatx != NULL)
1417 {
1418 /* Set the SMARTCARD DMA Abort callback :
1419 will lead to call HAL_SMARTCARD_AbortCpltCallback() at end of DMA abort procedure */
1420 hsc->hdmatx->XferAbortCallback = SMARTCARD_DMATxOnlyAbortCallback;
1421
1422 /* Abort DMA TX */
1423 if(HAL_DMA_Abort_IT(hsc->hdmatx) != HAL_OK)
1424 {
1425 /* Call Directly hsc->hdmatx->XferAbortCallback function in case of error */
1426 hsc->hdmatx->XferAbortCallback(hsc->hdmatx);
1427 }
1428 }
1429 else
1430 {
1431 /* Reset Tx transfer counter */
1432 hsc->TxXferCount = 0x00U;
1433
1434 /* Restore hsc->gState to Ready */
1436
1437 /* As no DMA to be aborted, call directly user Abort complete callback */
1438#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
1439 /* Call registered Abort Transmit Complete Callback */
1440 hsc->AbortTransmitCpltCallback(hsc);
1441#else
1442 /* Call legacy weak Abort Transmit Complete Callback */
1444#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */
1445 }
1446 }
1447 else
1448 {
1449 /* Reset Tx transfer counter */
1450 hsc->TxXferCount = 0x00U;
1451
1452 /* Restore hsc->gState to Ready */
1454
1455 /* As no DMA to be aborted, call directly user Abort complete callback */
1456#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
1457 /* Call registered Abort Transmit Complete Callback */
1458 hsc->AbortTransmitCpltCallback(hsc);
1459#else
1460 /* Call legacy weak Abort Transmit Complete Callback */
1462#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */
1463 }
1464
1465 return HAL_OK;
1466}
1467
1483{
1484 /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
1485 CLEAR_BIT(hsc->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
1486 CLEAR_BIT(hsc->Instance->CR3, USART_CR3_EIE);
1487
1488 /* Disable the SMARTCARD DMA Rx request if enabled */
1489 if(HAL_IS_BIT_SET(hsc->Instance->CR3, USART_CR3_DMAR))
1490 {
1491 CLEAR_BIT(hsc->Instance->CR3, USART_CR3_DMAR);
1492
1493 /* Abort the SMARTCARD DMA Rx channel : use blocking DMA Abort API (no callback) */
1494 if(hsc->hdmarx != NULL)
1495 {
1496 /* Set the SMARTCARD DMA Abort callback :
1497 will lead to call HAL_SMARTCARD_AbortCpltCallback() at end of DMA abort procedure */
1498 hsc->hdmarx->XferAbortCallback = SMARTCARD_DMARxOnlyAbortCallback;
1499
1500 /* Abort DMA RX */
1501 if(HAL_DMA_Abort_IT(hsc->hdmarx) != HAL_OK)
1502 {
1503 /* Call Directly hsc->hdmarx->XferAbortCallback function in case of error */
1504 hsc->hdmarx->XferAbortCallback(hsc->hdmarx);
1505 }
1506 }
1507 else
1508 {
1509 /* Reset Rx transfer counter */
1510 hsc->RxXferCount = 0x00U;
1511
1512 /* Restore hsc->RxState to Ready */
1514
1515 /* As no DMA to be aborted, call directly user Abort complete callback */
1516#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
1517 /* Call registered Abort Receive Complete Callback */
1518 hsc->AbortReceiveCpltCallback(hsc);
1519#else
1520 /* Call legacy weak Abort Receive Complete Callback */
1522#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */
1523 }
1524 }
1525 else
1526 {
1527 /* Reset Rx transfer counter */
1528 hsc->RxXferCount = 0x00U;
1529
1530 /* Restore hsc->RxState to Ready */
1532
1533 /* As no DMA to be aborted, call directly user Abort complete callback */
1534#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
1535 /* Call registered Abort Receive Complete Callback */
1536 hsc->AbortReceiveCpltCallback(hsc);
1537#else
1538 /* Call legacy weak Abort Receive Complete Callback */
1540#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */
1541 }
1542
1543 return HAL_OK;
1544}
1545
1553{
1554 uint32_t isrflags = READ_REG(hsc->Instance->SR);
1555 uint32_t cr1its = READ_REG(hsc->Instance->CR1);
1556 uint32_t cr3its = READ_REG(hsc->Instance->CR3);
1557 uint32_t dmarequest = 0x00U;
1558 uint32_t errorflags = 0x00U;
1559
1560 /* If no error occurs */
1561 errorflags = (isrflags & (uint32_t)(USART_SR_PE | USART_SR_FE | USART_SR_ORE | USART_SR_NE));
1562 if(errorflags == RESET)
1563 {
1564 /* SMARTCARD in mode Receiver -------------------------------------------------*/
1565 if(((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
1566 {
1567 SMARTCARD_Receive_IT(hsc);
1568 return;
1569 }
1570 }
1571
1572 /* If some errors occur */
1573 if((errorflags != RESET) && (((cr3its & USART_CR3_EIE) != RESET) || ((cr1its & (USART_CR1_RXNEIE | USART_CR1_PEIE)) != RESET)))
1574 {
1575 /* SMARTCARD parity error interrupt occurred ---------------------------*/
1576 if(((isrflags & SMARTCARD_FLAG_PE) != RESET) && ((cr1its & USART_CR1_PEIE) != RESET))
1577 {
1579 }
1580
1581 /* SMARTCARD frame error interrupt occurred ----------------------------*/
1582 if(((isrflags & SMARTCARD_FLAG_FE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET))
1583 {
1585 }
1586
1587 /* SMARTCARD noise error interrupt occurred ----------------------------*/
1588 if(((isrflags & SMARTCARD_FLAG_NE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET))
1589 {
1591 }
1592
1593 /* SMARTCARD Over-Run interrupt occurred -------------------------------*/
1594 if(((isrflags & SMARTCARD_FLAG_ORE) != RESET) && (((cr1its & USART_CR1_RXNEIE) != RESET) || ((cr3its & USART_CR3_EIE) != RESET)))
1595 {
1597 }
1598 /* Call the Error call Back in case of Errors --------------------------*/
1600 {
1601 /* SMARTCARD in mode Receiver ----------------------------------------*/
1602 if(((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
1603 {
1604 SMARTCARD_Receive_IT(hsc);
1605 }
1606
1607 /* If Overrun error occurs, or if any error occurs in DMA mode reception,
1608 consider error as blocking */
1609 dmarequest = HAL_IS_BIT_SET(hsc->Instance->CR3, USART_CR3_DMAR);
1610 if(((hsc->ErrorCode & HAL_SMARTCARD_ERROR_ORE) != RESET) || dmarequest)
1611 {
1612 /* Blocking error : transfer is aborted
1613 Set the SMARTCARD state ready to be able to start again the process,
1614 Disable Rx Interrupts, and disable Rx DMA request, if ongoing */
1615 SMARTCARD_EndRxTransfer(hsc);
1616 /* Disable the SMARTCARD DMA Rx request if enabled */
1617 if(HAL_IS_BIT_SET(hsc->Instance->CR3, USART_CR3_DMAR))
1618 {
1619 CLEAR_BIT(hsc->Instance->CR3, USART_CR3_DMAR);
1620
1621 /* Abort the SMARTCARD DMA Rx channel */
1622 if(hsc->hdmarx != NULL)
1623 {
1624 /* Set the SMARTCARD DMA Abort callback :
1625 will lead to call HAL_SMARTCARD_ErrorCallback() at end of DMA abort procedure */
1626 hsc->hdmarx->XferAbortCallback = SMARTCARD_DMAAbortOnError;
1627
1628 if(HAL_DMA_Abort_IT(hsc->hdmarx) != HAL_OK)
1629 {
1630 /* Call Directly XferAbortCallback function in case of error */
1631 hsc->hdmarx->XferAbortCallback(hsc->hdmarx);
1632 }
1633 }
1634 else
1635 {
1636#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
1637 /* Call registered user error callback */
1638 hsc->ErrorCallback(hsc);
1639#else
1640 /* Call legacy weak user error callback */
1642#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */
1643 }
1644 }
1645 else
1646 {
1647#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
1648 /* Call registered user error callback */
1649 hsc->ErrorCallback(hsc);
1650#else
1651 /* Call legacy weak user error callback */
1653#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */
1654 }
1655 }
1656 else
1657 {
1658 /* Non Blocking error : transfer could go on.
1659 Error is notified to user through user error callback */
1660#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
1661 /* Call registered user error callback */
1662 hsc->ErrorCallback(hsc);
1663#else
1664 /* Call legacy weak user error callback */
1666#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */
1668 }
1669 }
1670 return;
1671 } /* End if some error occurs */
1672
1673 /* SMARTCARD in mode Transmitter ------------------------------------------*/
1674 if(((isrflags & SMARTCARD_FLAG_TXE) != RESET) && ((cr1its & USART_CR1_TXEIE) != RESET))
1675 {
1676 SMARTCARD_Transmit_IT(hsc);
1677 return;
1678 }
1679
1680 /* SMARTCARD in mode Transmitter (transmission end) -----------------------*/
1681 if(((isrflags & SMARTCARD_FLAG_TC) != RESET) && ((cr1its & USART_CR1_TCIE) != RESET))
1682 {
1683 SMARTCARD_EndTransmit_IT(hsc);
1684 return;
1685 }
1686}
1687
1695{
1696 /* Prevent unused argument(s) compilation warning */
1697 UNUSED(hsc);
1698
1699 /* NOTE : This function should not be modified, when the callback is needed,
1700 the HAL_SMARTCARD_TxCpltCallback can be implemented in the user file.
1701 */
1702}
1703
1711{
1712 /* Prevent unused argument(s) compilation warning */
1713 UNUSED(hsc);
1714
1715 /* NOTE : This function should not be modified, when the callback is needed,
1716 the HAL_SMARTCARD_RxCpltCallback can be implemented in the user file.
1717 */
1718}
1719
1727{
1728 /* Prevent unused argument(s) compilation warning */
1729 UNUSED(hsc);
1730
1731 /* NOTE : This function should not be modified, when the callback is needed,
1732 the HAL_SMARTCARD_ErrorCallback can be implemented in the user file.
1733 */
1734}
1735
1742{
1743 /* Prevent unused argument(s) compilation warning */
1744 UNUSED(hsc);
1745
1746 /* NOTE : This function should not be modified, when the callback is needed,
1747 the HAL_SMARTCARD_AbortCpltCallback can be implemented in the user file.
1748 */
1749}
1750
1757{
1758 /* Prevent unused argument(s) compilation warning */
1759 UNUSED(hsc);
1760
1761 /* NOTE : This function should not be modified, when the callback is needed,
1762 the HAL_SMARTCARD_AbortTransmitCpltCallback can be implemented in the user file.
1763 */
1764}
1765
1772{
1773 /* Prevent unused argument(s) compilation warning */
1774 UNUSED(hsc);
1775
1776 /* NOTE : This function should not be modified, when the callback is needed,
1777 the HAL_SMARTCARD_AbortReceiveCpltCallback can be implemented in the user file.
1778 */
1779}
1780
1784
1799
1807{
1808 uint32_t temp1= 0x00U, temp2 = 0x00U;
1809 temp1 = hsc->gState;
1810 temp2 = hsc->RxState;
1811
1812 return (HAL_SMARTCARD_StateTypeDef)(temp1 | temp2);
1813}
1814
1822{
1823 return hsc->ErrorCode;
1824}
1825
1829
1833
1837
1838#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
1844void SMARTCARD_InitCallbacksToDefault(SMARTCARD_HandleTypeDef *hsc)
1845{
1846 /* Init the SMARTCARD Callback settings */
1847 hsc->TxCpltCallback = HAL_SMARTCARD_TxCpltCallback; /* Legacy weak TxCpltCallback */
1848 hsc->RxCpltCallback = HAL_SMARTCARD_RxCpltCallback; /* Legacy weak RxCpltCallback */
1849 hsc->ErrorCallback = HAL_SMARTCARD_ErrorCallback; /* Legacy weak ErrorCallback */
1850 hsc->AbortCpltCallback = HAL_SMARTCARD_AbortCpltCallback; /* Legacy weak AbortCpltCallback */
1851 hsc->AbortTransmitCpltCallback = HAL_SMARTCARD_AbortTransmitCpltCallback; /* Legacy weak AbortTransmitCpltCallback */
1852 hsc->AbortReceiveCpltCallback = HAL_SMARTCARD_AbortReceiveCpltCallback; /* Legacy weak AbortReceiveCpltCallback */
1853
1854}
1855#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACKS */
1856
1863static void SMARTCARD_DMATransmitCplt(DMA_HandleTypeDef *hdma)
1864{
1866
1867 hsc->TxXferCount = 0U;
1868
1869 /* Disable the DMA transfer for transmit request by setting the DMAT bit
1870 in the USART CR3 register */
1871 CLEAR_BIT(hsc->Instance->CR3, USART_CR3_DMAT);
1872
1873 /* Enable the SMARTCARD Transmit Complete Interrupt */
1874 SET_BIT(hsc->Instance->CR1, USART_CR1_TCIE);
1875}
1876
1883static void SMARTCARD_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
1884{
1886
1887 hsc->RxXferCount = 0U;
1888
1889 /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
1890 CLEAR_BIT(hsc->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
1891 CLEAR_BIT(hsc->Instance->CR3, USART_CR3_EIE);
1892
1893 /* Disable the DMA transfer for the receiver request by setting the DMAR bit
1894 in the USART CR3 register */
1895 CLEAR_BIT(hsc->Instance->CR3, USART_CR3_DMAR);
1896
1897 /* At end of Rx process, restore hsc->RxState to Ready */
1899
1900#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
1901 /* Call registered Rx complete callback */
1902 hsc->RxCpltCallback(hsc);
1903#else
1904 /* Call legacy weak Rx complete callback */
1906#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */
1907}
1908
1915static void SMARTCARD_DMAError(DMA_HandleTypeDef *hdma)
1916{
1917 uint32_t dmarequest = 0x00U;
1919 hsc->RxXferCount = 0U;
1920 hsc->TxXferCount = 0U;
1922
1923 /* Stop SMARTCARD DMA Tx request if ongoing */
1924 dmarequest = HAL_IS_BIT_SET(hsc->Instance->CR3, USART_CR3_DMAT);
1925 if((hsc->gState == HAL_SMARTCARD_STATE_BUSY_TX) && dmarequest)
1926 {
1927 SMARTCARD_EndTxTransfer(hsc);
1928 }
1929
1930 /* Stop SMARTCARD DMA Rx request if ongoing */
1931 dmarequest = HAL_IS_BIT_SET(hsc->Instance->CR3, USART_CR3_DMAR);
1932 if((hsc->RxState == HAL_SMARTCARD_STATE_BUSY_RX) && dmarequest)
1933 {
1934 SMARTCARD_EndRxTransfer(hsc);
1935 }
1936
1937#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
1938 /* Call registered user error callback */
1939 hsc->ErrorCallback(hsc);
1940#else
1941 /* Call legacy weak user error callback */
1943#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */
1944}
1945
1957static HAL_StatusTypeDef SMARTCARD_WaitOnFlagUntilTimeout(SMARTCARD_HandleTypeDef *hsc, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout)
1958{
1959 /* Wait until flag is set */
1960 while((__HAL_SMARTCARD_GET_FLAG(hsc, Flag) ? SET : RESET) == Status)
1961 {
1962 /* Check for the Timeout */
1963 if(Timeout != HAL_MAX_DELAY)
1964 {
1965 if((Timeout == 0U)||((HAL_GetTick() - Tickstart ) > Timeout))
1966 {
1967 /* Disable TXE and RXNE interrupts for the interrupt process */
1968 CLEAR_BIT(hsc->Instance->CR1, USART_CR1_TXEIE);
1969 CLEAR_BIT(hsc->Instance->CR1, USART_CR1_RXNEIE);
1970
1973
1974 /* Process Unlocked */
1975 __HAL_UNLOCK(hsc);
1976
1977 return HAL_TIMEOUT;
1978 }
1979 }
1980 }
1981 return HAL_OK;
1982}
1983
1990static void SMARTCARD_EndTxTransfer(SMARTCARD_HandleTypeDef *hsc)
1991{
1992 /* At end of Tx process, restore hsc->gState to Ready */
1994
1995 /* Disable TXEIE and TCIE interrupts */
1996 CLEAR_BIT(hsc->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE));
1997}
1998
1999
2006static void SMARTCARD_EndRxTransfer(SMARTCARD_HandleTypeDef *hsc)
2007{
2008 /* At end of Rx process, restore hsc->RxState to Ready */
2010
2011 /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
2012 CLEAR_BIT(hsc->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
2013 CLEAR_BIT(hsc->Instance->CR3, USART_CR3_EIE);
2014}
2015
2022static HAL_StatusTypeDef SMARTCARD_Transmit_IT(SMARTCARD_HandleTypeDef *hsc)
2023{
2024
2025 /* Check that a Tx process is ongoing */
2027 {
2028 hsc->Instance->DR = (uint8_t)(*hsc->pTxBuffPtr & 0xFFU);
2029 hsc->pTxBuffPtr++;
2030
2031 if(--hsc->TxXferCount == 0U)
2032 {
2033 /* Disable the SMARTCARD Transmit data register empty Interrupt */
2034 CLEAR_BIT(hsc->Instance->CR1, USART_CR1_TXEIE);
2035
2036 /* Enable the SMARTCARD Transmit Complete Interrupt */
2037 SET_BIT(hsc->Instance->CR1, USART_CR1_TCIE);
2038 }
2039
2040 return HAL_OK;
2041 }
2042 else
2043 {
2044 return HAL_BUSY;
2045 }
2046}
2047
2054static HAL_StatusTypeDef SMARTCARD_EndTransmit_IT(SMARTCARD_HandleTypeDef *hsc)
2055{
2056 /* Disable the SMARTCARD Transmit Complete Interrupt */
2057 CLEAR_BIT(hsc->Instance->CR1, USART_CR1_TCIE);
2058
2059 /* Disable the SMARTCARD Error Interrupt: (Frame error, noise error, overrun error) */
2060 CLEAR_BIT(hsc->Instance->CR3, USART_CR3_EIE);
2061
2062 /* Tx process is ended, restore hsc->gState to Ready */
2064
2065#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
2066 /* Call registered Tx complete callback */
2067 hsc->TxCpltCallback(hsc);
2068#else
2069 /* Call legacy weak Tx complete callback */
2071#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */
2072
2073 return HAL_OK;
2074}
2075
2082static HAL_StatusTypeDef SMARTCARD_Receive_IT(SMARTCARD_HandleTypeDef *hsc)
2083{
2084
2085 /* Check that a Rx process is ongoing */
2087 {
2088 *hsc->pRxBuffPtr = (uint8_t)(hsc->Instance->DR & (uint8_t)0xFFU);
2089 hsc->pRxBuffPtr++;
2090
2091 if(--hsc->RxXferCount == 0U)
2092 {
2093 CLEAR_BIT(hsc->Instance->CR1, USART_CR1_RXNEIE);
2094
2095 /* Disable the SMARTCARD Parity Error Interrupt */
2096 CLEAR_BIT(hsc->Instance->CR1, USART_CR1_PEIE);
2097
2098 /* Disable the SMARTCARD Error Interrupt: (Frame error, noise error, overrun error) */
2099 CLEAR_BIT(hsc->Instance->CR3, USART_CR3_EIE);
2100
2101 /* Rx process is completed, restore hsc->RxState to Ready */
2103
2104#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
2105 /* Call registered Rx complete callback */
2106 hsc->RxCpltCallback(hsc);
2107#else
2108 /* Call legacy weak Rx complete callback */
2110#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */
2111
2112 return HAL_OK;
2113 }
2114 return HAL_OK;
2115 }
2116 else
2117 {
2118 return HAL_BUSY;
2119 }
2120}
2121
2128static void SMARTCARD_DMAAbortOnError(DMA_HandleTypeDef *hdma)
2129{
2131 hsc->RxXferCount = 0x00U;
2132 hsc->TxXferCount = 0x00U;
2133
2134#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
2135 /* Call registered user error callback */
2136 hsc->ErrorCallback(hsc);
2137#else
2138 /* Call legacy weak user error callback */
2140#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */
2141}
2142
2151static void SMARTCARD_DMATxAbortCallback(DMA_HandleTypeDef *hdma)
2152{
2154
2155 hsc->hdmatx->XferAbortCallback = NULL;
2156
2157 /* Check if an Abort process is still ongoing */
2158 if(hsc->hdmarx != NULL)
2159 {
2160 if(hsc->hdmarx->XferAbortCallback != NULL)
2161 {
2162 return;
2163 }
2164 }
2165
2166 /* No Abort process still ongoing : All DMA channels are aborted, call user Abort Complete callback */
2167 hsc->TxXferCount = 0x00U;
2168 hsc->RxXferCount = 0x00U;
2169
2170 /* Reset ErrorCode */
2172
2173 /* Restore hsc->gState and hsc->RxState to Ready */
2176
2177#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
2178 /* Call registered Abort complete callback */
2179 hsc->AbortCpltCallback(hsc);
2180#else
2181 /* Call legacy weak Abort complete callback */
2183#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */
2184}
2185
2194static void SMARTCARD_DMARxAbortCallback(DMA_HandleTypeDef *hdma)
2195{
2197
2198 hsc->hdmarx->XferAbortCallback = NULL;
2199
2200 /* Check if an Abort process is still ongoing */
2201 if(hsc->hdmatx != NULL)
2202 {
2203 if(hsc->hdmatx->XferAbortCallback != NULL)
2204 {
2205 return;
2206 }
2207 }
2208
2209 /* No Abort process still ongoing : All DMA channels are aborted, call user Abort Complete callback */
2210 hsc->TxXferCount = 0x00U;
2211 hsc->RxXferCount = 0x00U;
2212
2213 /* Reset ErrorCode */
2215
2216 /* Restore hsc->gState and hsc->RxState to Ready */
2219
2220#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
2221 /* Call registered Abort complete callback */
2222 hsc->AbortCpltCallback(hsc);
2223#else
2224 /* Call legacy weak Abort complete callback */
2226#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */
2227}
2228
2237static void SMARTCARD_DMATxOnlyAbortCallback(DMA_HandleTypeDef *hdma)
2238{
2240
2241 hsc->TxXferCount = 0x00U;
2242
2243 /* Restore hsc->gState to Ready */
2245
2246#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
2247 /* Call registered Abort Transmit Complete Callback */
2248 hsc->AbortTransmitCpltCallback(hsc);
2249#else
2250 /* Call legacy weak Abort Transmit Complete Callback */
2252#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */
2253}
2254
2263static void SMARTCARD_DMARxOnlyAbortCallback(DMA_HandleTypeDef *hdma)
2264{
2266
2267 hsc->RxXferCount = 0x00U;
2268
2269 /* Restore hsc->RxState to Ready */
2271
2272#if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
2273 /* Call registered Abort Receive Complete Callback */
2274 hsc->AbortReceiveCpltCallback(hsc);
2275#else
2276 /* Call legacy weak Abort Receive Complete Callback */
2278#endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */
2279}
2280
2287static void SMARTCARD_SetConfig(SMARTCARD_HandleTypeDef *hsc)
2288{
2289 uint32_t tmpreg = 0x00U;
2290 uint32_t pclk;
2291
2292 /* Check the parameters */
2293 assert_param(IS_SMARTCARD_INSTANCE(hsc->Instance));
2303
2304 /* The LBCL, CPOL and CPHA bits have to be selected when both the transmitter and the
2305 receiver are disabled (TE=RE=0) to ensure that the clock pulses function correctly. */
2306 CLEAR_BIT(hsc->Instance->CR1, (USART_CR1_TE | USART_CR1_RE));
2307
2308 /*---------------------------- USART CR2 Configuration ---------------------*/
2309 tmpreg = hsc->Instance->CR2;
2310 /* Clear CLKEN, CPOL, CPHA and LBCL bits */
2311 tmpreg &= (uint32_t)~((uint32_t)(USART_CR2_CPHA | USART_CR2_CPOL | USART_CR2_CLKEN | USART_CR2_LBCL));
2312 /* Configure the SMARTCARD Clock, CPOL, CPHA and LastBit -----------------------*/
2313 /* Set CPOL bit according to hsc->Init.CLKPolarity value */
2314 /* Set CPHA bit according to hsc->Init.CLKPhase value */
2315 /* Set LBCL bit according to hsc->Init.CLKLastBit value */
2316 /* Set Stop Bits: Set STOP[13:12] bits according to hsc->Init.StopBits value */
2317 tmpreg |= (uint32_t)(USART_CR2_CLKEN | hsc->Init.CLKPolarity |
2318 hsc->Init.CLKPhase| hsc->Init.CLKLastBit | hsc->Init.StopBits);
2319 /* Write to USART CR2 */
2320 WRITE_REG(hsc->Instance->CR2, (uint32_t)tmpreg);
2321
2322 tmpreg = hsc->Instance->CR2;
2323
2324 /* Clear STOP[13:12] bits */
2325 tmpreg &= (uint32_t)~((uint32_t)USART_CR2_STOP);
2326
2327 /* Set Stop Bits: Set STOP[13:12] bits according to hsc->Init.StopBits value */
2328 tmpreg |= (uint32_t)(hsc->Init.StopBits);
2329
2330 /* Write to USART CR2 */
2331 WRITE_REG(hsc->Instance->CR2, (uint32_t)tmpreg);
2332
2333 /*-------------------------- USART CR1 Configuration -----------------------*/
2334 tmpreg = hsc->Instance->CR1;
2335
2336 /* Clear M, PCE, PS, TE and RE bits */
2337 tmpreg &= (uint32_t)~((uint32_t)(USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | USART_CR1_TE | \
2338 USART_CR1_RE));
2339
2340 /* Configure the SMARTCARD Word Length, Parity and mode:
2341 Set the M bits according to hsc->Init.WordLength value
2342 Set PCE and PS bits according to hsc->Init.Parity value
2343 Set TE and RE bits according to hsc->Init.Mode value */
2344 tmpreg |= (uint32_t)hsc->Init.WordLength | hsc->Init.Parity | hsc->Init.Mode;
2345
2346 /* Write to USART CR1 */
2347 WRITE_REG(hsc->Instance->CR1, (uint32_t)tmpreg);
2348
2349 /*-------------------------- USART CR3 Configuration -----------------------*/
2350 /* Clear CTSE and RTSE bits */
2351 CLEAR_BIT(hsc->Instance->CR3, (USART_CR3_RTSE | USART_CR3_CTSE));
2352
2353 /*-------------------------- USART BRR Configuration -----------------------*/
2354#if defined(USART6)
2355 if((hsc->Instance == USART1) || (hsc->Instance == USART6))
2356 {
2357 pclk = HAL_RCC_GetPCLK2Freq();
2358 hsc->Instance->BRR = SMARTCARD_BRR(pclk, hsc->Init.BaudRate);
2359 }
2360#else
2361 if(hsc->Instance == USART1)
2362 {
2363 pclk = HAL_RCC_GetPCLK2Freq();
2364 hsc->Instance->BRR = SMARTCARD_BRR(pclk, hsc->Init.BaudRate);
2365 }
2366#endif /* USART6 */
2367 else
2368 {
2369 pclk = HAL_RCC_GetPCLK1Freq();
2370 hsc->Instance->BRR = SMARTCARD_BRR(pclk, hsc->Init.BaudRate);
2371 }
2372}
2373
2377
2378#endif /* HAL_SMARTCARD_MODULE_ENABLED */
2382
2386
2387
HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma)
HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma)
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
struct __DMA_HandleTypeDef DMA_HandleTypeDef
DMA handle Structure definition.
uint32_t HAL_GetTick(void)
Provides a tick value in millisecond.
uint32_t HAL_RCC_GetPCLK1Freq(void)
uint32_t HAL_RCC_GetPCLK2Freq(void)
#define HAL_SMARTCARD_ERROR_NONE
#define HAL_SMARTCARD_ERROR_NE
#define HAL_SMARTCARD_ERROR_DMA
#define HAL_SMARTCARD_ERROR_ORE
#define HAL_SMARTCARD_ERROR_FE
#define HAL_SMARTCARD_ERROR_PE
void HAL_SMARTCARD_MspInit(SMARTCARD_HandleTypeDef *hsc)
HAL_StatusTypeDef HAL_SMARTCARD_DeInit(SMARTCARD_HandleTypeDef *hsc)
HAL_StatusTypeDef HAL_SMARTCARD_Init(SMARTCARD_HandleTypeDef *hsc)
void HAL_SMARTCARD_MspDeInit(SMARTCARD_HandleTypeDef *hsc)
HAL_StatusTypeDef HAL_SMARTCARD_AbortTransmit_IT(SMARTCARD_HandleTypeDef *hsc)
HAL_StatusTypeDef HAL_SMARTCARD_AbortReceive_IT(SMARTCARD_HandleTypeDef *hsc)
HAL_StatusTypeDef HAL_SMARTCARD_Transmit_DMA(SMARTCARD_HandleTypeDef *hsc, const uint8_t *pData, uint16_t Size)
void HAL_SMARTCARD_AbortTransmitCpltCallback(SMARTCARD_HandleTypeDef *hsc)
HAL_StatusTypeDef HAL_SMARTCARD_Transmit_IT(SMARTCARD_HandleTypeDef *hsc, const uint8_t *pData, uint16_t Size)
HAL_StatusTypeDef HAL_SMARTCARD_AbortTransmit(SMARTCARD_HandleTypeDef *hsc)
void HAL_SMARTCARD_AbortReceiveCpltCallback(SMARTCARD_HandleTypeDef *hsc)
void HAL_SMARTCARD_AbortCpltCallback(SMARTCARD_HandleTypeDef *hsc)
HAL_StatusTypeDef HAL_SMARTCARD_Receive_IT(SMARTCARD_HandleTypeDef *hsc, uint8_t *pData, uint16_t Size)
void HAL_SMARTCARD_IRQHandler(SMARTCARD_HandleTypeDef *hsc)
void HAL_SMARTCARD_ErrorCallback(SMARTCARD_HandleTypeDef *hsc)
HAL_StatusTypeDef HAL_SMARTCARD_Receive(SMARTCARD_HandleTypeDef *hsc, uint8_t *pData, uint16_t Size, uint32_t Timeout)
void HAL_SMARTCARD_RxCpltCallback(SMARTCARD_HandleTypeDef *hsc)
HAL_StatusTypeDef HAL_SMARTCARD_Receive_DMA(SMARTCARD_HandleTypeDef *hsc, uint8_t *pData, uint16_t Size)
HAL_StatusTypeDef HAL_SMARTCARD_Abort_IT(SMARTCARD_HandleTypeDef *hsc)
HAL_StatusTypeDef HAL_SMARTCARD_Transmit(SMARTCARD_HandleTypeDef *hsc, const uint8_t *pData, uint16_t Size, uint32_t Timeout)
HAL_StatusTypeDef HAL_SMARTCARD_Abort(SMARTCARD_HandleTypeDef *hsc)
HAL_StatusTypeDef HAL_SMARTCARD_AbortReceive(SMARTCARD_HandleTypeDef *hsc)
void HAL_SMARTCARD_TxCpltCallback(SMARTCARD_HandleTypeDef *hsc)
uint32_t HAL_SMARTCARD_GetError(const SMARTCARD_HandleTypeDef *hsc)
HAL_SMARTCARD_StateTypeDef HAL_SMARTCARD_GetState(const SMARTCARD_HandleTypeDef *hsc)
#define __HAL_SMARTCARD_GET_FLAG(__HANDLE__, __FLAG__)
Check whether the specified Smartcard flag is set or not.
#define __HAL_SMARTCARD_CLEAR_OREFLAG(__HANDLE__)
Clear the SMARTCARD ORE pending flag.
#define __HAL_SMARTCARD_CLEAR_FLAG(__HANDLE__, __FLAG__)
Clear the specified Smartcard pending flags.
#define __HAL_SMARTCARD_ENABLE(__HANDLE__)
Enable the USART associated to the SMARTCARD Handle.
#define __HAL_SMARTCARD_DISABLE(__HANDLE__)
Disable the USART associated to the SMARTCARD Handle.
HAL_SMARTCARD_StateTypeDef
HAL SMARTCARD State structures definition.
struct __SMARTCARD_HandleTypeDef SMARTCARD_HandleTypeDef
SMARTCARD handle Structure definition.
@ HAL_SMARTCARD_STATE_BUSY
@ HAL_SMARTCARD_STATE_RESET
@ HAL_SMARTCARD_STATE_READY
@ HAL_SMARTCARD_STATE_BUSY_TX
@ HAL_SMARTCARD_STATE_BUSY_RX
#define IS_SMARTCARD_MODE(MODE)
#define IS_SMARTCARD_NACK_STATE(NACK)
#define IS_SMARTCARD_STOPBITS(STOPBITS)
#define SMARTCARD_BRR(__PCLK__, __BAUD__)
#define IS_SMARTCARD_LASTBIT(LASTBIT)
#define IS_SMARTCARD_BAUDRATE(BAUDRATE)
#define IS_SMARTCARD_PARITY(PARITY)
#define IS_SMARTCARD_WORD_LENGTH(LENGTH)
#define IS_SMARTCARD_POLARITY(CPOL)
#define IS_SMARTCARD_PHASE(CPHA)
#define SMARTCARD_FLAG_NE
#define SMARTCARD_FLAG_PE
#define SMARTCARD_FLAG_RXNE
#define SMARTCARD_FLAG_ORE
#define SMARTCARD_FLAG_TXE
#define SMARTCARD_FLAG_TC
#define SMARTCARD_FLAG_FE
#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 __HAL_UNLOCK(__HANDLE__)
#define HAL_MAX_DELAY
@ HAL_UNLOCKED
#define __HAL_LOCK(__HANDLE__)
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
void(* XferCpltCallback)(struct __DMA_HandleTypeDef *hdma)
void(* XferErrorCallback)(struct __DMA_HandleTypeDef *hdma)
volatile HAL_SMARTCARD_StateTypeDef RxState
volatile HAL_SMARTCARD_StateTypeDef gState