STM32F769IDiscovery  1.00
uDANTE Audio Networking with STM32F7 DISCO board
stm32f7xx_hal_smartcard.c
Go to the documentation of this file.
1 
89 /* Includes ------------------------------------------------------------------*/
90 #include "stm32f7xx_hal.h"
91 
100 #ifdef HAL_SMARTCARD_MODULE_ENABLED
101 /* Private typedef -----------------------------------------------------------*/
102 /* Private define ------------------------------------------------------------*/
106 #define TEACK_REACK_TIMEOUT 1000U
107 #define HAL_SMARTCARD_TXDMA_TIMEOUTVALUE 22000U
108 #define USART_CR1_FIELDS ((uint32_t)(USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | \
109  USART_CR1_TE | USART_CR1_RE | USART_CR1_OVER8))
110 #define USART_CR2_CLK_FIELDS ((uint32_t)(USART_CR2_CLKEN|USART_CR2_CPOL|USART_CR2_CPHA|USART_CR2_LBCL))
111 #define USART_CR2_FIELDS ((uint32_t)(USART_CR2_RTOEN|USART_CR2_CLK_FIELDS|USART_CR2_STOP))
112 #define USART_CR3_FIELDS ((uint32_t)(USART_CR3_ONEBIT|USART_CR3_NACK|USART_CR3_SCARCNT))
113 
116 /* Private macros -------------------------------------------------------------*/
117 /* Private variables ---------------------------------------------------------*/
118 /* Private function prototypes -----------------------------------------------*/
122 static void SMARTCARD_DMATransmitCplt(DMA_HandleTypeDef *hdma);
123 static void SMARTCARD_DMAReceiveCplt(DMA_HandleTypeDef *hdma);
124 static void SMARTCARD_DMAError(DMA_HandleTypeDef *hdma);
125 static void SMARTCARD_DMAAbortOnError(DMA_HandleTypeDef *hdma);
126 static void SMARTCARD_SetConfig(SMARTCARD_HandleTypeDef *hsc);
127 static HAL_StatusTypeDef SMARTCARD_WaitOnFlagUntilTimeout(SMARTCARD_HandleTypeDef *hsc, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout);
128 static HAL_StatusTypeDef SMARTCARD_CheckIdleState(SMARTCARD_HandleTypeDef *hsc);
129 static HAL_StatusTypeDef SMARTCARD_Transmit_IT(SMARTCARD_HandleTypeDef *hsc);
130 static HAL_StatusTypeDef SMARTCARD_Receive_IT(SMARTCARD_HandleTypeDef *hsc);
131 static void SMARTCARD_EndTxTransfer(SMARTCARD_HandleTypeDef *hsc);
132 static void SMARTCARD_EndRxTransfer(SMARTCARD_HandleTypeDef *hsc);
133 static void SMARTCARD_AdvFeatureConfig(SMARTCARD_HandleTypeDef *hsc);
137 /* Exported functions --------------------------------------------------------*/
197 {
198  /* Check the SMARTCARD handle allocation */
199  if(hsc == NULL)
200  {
201  return HAL_ERROR;
202  }
203 
204  /* Check the parameters */
206 
208  {
209  /* Allocate lock resource and initialize it */
210  hsc->Lock = HAL_UNLOCKED;
211  /* Init the low level hardware : GPIO, CLOCK, CORTEX */
213  }
214 
216 
217  /* Disable the Peripheral */
219 
220  /* Set the SMARTCARD Communication parameters */
221  SMARTCARD_SetConfig(hsc);
222 
224  {
225  SMARTCARD_AdvFeatureConfig(hsc);
226  }
227 
228  /* In SmartCard mode, the following bits must be kept cleared:
229  - LINEN in the USART_CR2 register,
230  - HDSEL and IREN bits in the USART_CR3 register.*/
233 
234  /* set the USART in SMARTCARD mode */
236 
237  /* Enable the Peripheral */
239 
240  /* TEACK and/or REACK to check before moving hsc->State to Ready */
241  return (SMARTCARD_CheckIdleState(hsc));
242 }
243 
250 {
251  /* Check the SMARTCARD handle allocation */
252  if(hsc == NULL)
253  {
254  return HAL_ERROR;
255  }
256 
257  /* Check the parameters */
259 
261 
262  /* DeInit the low level hardware */
264 
268 
269  /* Release Lock */
270  __HAL_UNLOCK(hsc);
271 
272  return HAL_OK;
273 }
274 
281 {
282  /* Prevent unused argument(s) compilation warning */
283  UNUSED(hsc);
284 
285  /* NOTE : This function Should not be modified, when the callback is needed,
286  the HAL_SMARTCARD_MspInit could be implemented in the user file
287  */
288 }
289 
296 {
297  /* Prevent unused argument(s) compilation warning */
298  UNUSED(hsc);
299 
300  /* NOTE : This function Should not be modified, when the callback is needed,
301  the HAL_SMARTCARD_MspDeInit could be implemented in the user file
302  */
303 }
304 
363 HAL_StatusTypeDef HAL_SMARTCARD_Transmit(SMARTCARD_HandleTypeDef *hsc, uint8_t *pData, uint16_t Size, uint32_t Timeout)
364 {
365  uint32_t tickstart = 0U;
366 
368  {
369  if((pData == NULL) || (Size == 0U))
370  {
371  return HAL_ERROR;
372  }
373 
374  /* Process Locked */
375  __HAL_LOCK(hsc);
378 
379  /* Init tickstart for timeout managment*/
380  tickstart = HAL_GetTick();
381 
382  hsc->TxXferSize = Size;
383  hsc->TxXferCount = Size;
384  while(hsc->TxXferCount > 0U)
385  {
386  hsc->TxXferCount--;
387  if(SMARTCARD_WaitOnFlagUntilTimeout(hsc, SMARTCARD_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
388  {
389  return HAL_TIMEOUT;
390  }
391  hsc->Instance->TDR = (*pData++ & (uint8_t)0xFFU);
392  }
393  if(SMARTCARD_WaitOnFlagUntilTimeout(hsc, SMARTCARD_FLAG_TC, RESET, tickstart, Timeout) != HAL_OK)
394  {
395  return HAL_TIMEOUT;
396  }
397 
398  /* At end of Tx process, restore hsc->gState to Ready */
400 
401  /* Process Unlocked */
402  __HAL_UNLOCK(hsc);
403 
404  return HAL_OK;
405  }
406  else
407  {
408  return HAL_BUSY;
409  }
410 }
411 
420 HAL_StatusTypeDef HAL_SMARTCARD_Receive(SMARTCARD_HandleTypeDef *hsc, uint8_t *pData, uint16_t Size, uint32_t Timeout)
421 {
422  uint32_t tickstart = 0U;
423 
425  {
426  if((pData == NULL) || (Size == 0U))
427  {
428  return HAL_ERROR;
429  }
430 
431  /* Process Locked */
432  __HAL_LOCK(hsc);
433 
436 
437  /* Init tickstart for timeout managment*/
438  tickstart = HAL_GetTick();
439 
440  hsc->RxXferSize = Size;
441  hsc->RxXferCount = Size;
442  /* Check the remain data to be received */
443  while(hsc->RxXferCount > 0U)
444  {
445  hsc->RxXferCount--;
446  if(SMARTCARD_WaitOnFlagUntilTimeout(hsc, SMARTCARD_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK)
447  {
448  return HAL_TIMEOUT;
449  }
450  *pData++ = (uint8_t)(hsc->Instance->RDR & (uint8_t)0x00FFU);
451  }
452 
453  /* At end of Rx process, restore hsc->RxState to Ready */
455 
456  /* Process Unlocked */
457  __HAL_UNLOCK(hsc);
458 
459  return HAL_OK;
460  }
461  else
462  {
463  return HAL_BUSY;
464  }
465 }
466 
474 HAL_StatusTypeDef HAL_SMARTCARD_Transmit_IT(SMARTCARD_HandleTypeDef *hsc, uint8_t *pData, uint16_t Size)
475 {
476  /* Check that a Tx process is not already ongoing */
478  {
479  if((pData == NULL) || (Size == 0U))
480  {
481  return HAL_ERROR;
482  }
483 
484  /* Process Locked */
485  __HAL_LOCK(hsc);
486 
487  hsc->pTxBuffPtr = pData;
488  hsc->TxXferSize = Size;
489  hsc->TxXferCount = Size;
490 
493 
494  /* Process Unlocked */
495  __HAL_UNLOCK(hsc);
496 
497  /* Enable the SMARTCARD Error Interrupt: (Frame error, noise error, overrun error) */
499 
500  /* Enable the SMARTCARD Transmit Complete Interrupt */
502 
503  return HAL_OK;
504  }
505  else
506  {
507  return HAL_BUSY;
508  }
509 }
510 
518 HAL_StatusTypeDef HAL_SMARTCARD_Receive_IT(SMARTCARD_HandleTypeDef *hsc, uint8_t *pData, uint16_t Size)
519 {
520  /* Check that a Rx process is not already ongoing */
522  {
523  if((pData == NULL) || (Size == 0U))
524  {
525  return HAL_ERROR;
526  }
527 
528  /* Process Locked */
529  __HAL_LOCK(hsc);
530 
531  hsc->pRxBuffPtr = pData;
532  hsc->RxXferSize = Size;
533  hsc->RxXferCount = Size;
534 
537 
538  /* Process Unlocked */
539  __HAL_UNLOCK(hsc);
540 
541  /* Enable the SMARTCARD Parity Error Interrupt */
543 
544  /* Enable the SMARTCARD Error Interrupt: (Frame error, noise error, overrun error) */
546 
547  /* Enable the SMARTCARD Data Register not empty Interrupt */
549 
550  return HAL_OK;
551  }
552  else
553  {
554  return HAL_BUSY;
555  }
556 }
557 
565 HAL_StatusTypeDef HAL_SMARTCARD_Transmit_DMA(SMARTCARD_HandleTypeDef *hsc, uint8_t *pData, uint16_t Size)
566 {
567  uint32_t *tmp;
568 
569  /* Check that a Tx process is not already ongoing */
571  {
572  if((pData == NULL) || (Size == 0U))
573  {
574  return HAL_ERROR;
575  }
576 
577  /* Process Locked */
578  __HAL_LOCK(hsc);
579 
580  hsc->pTxBuffPtr = pData;
581  hsc->TxXferSize = Size;
582  hsc->TxXferCount = Size;
583 
586 
587  /* Set the SMARTCARD DMA transfer complete callback */
588  hsc->hdmatx->XferCpltCallback = SMARTCARD_DMATransmitCplt;
589 
590  /* Set the SMARTCARD error callback */
591  hsc->hdmatx->XferErrorCallback = SMARTCARD_DMAError;
592 
593  /* Set the DMA abort callback */
594  hsc->hdmatx->XferAbortCallback = NULL;
595 
596  /* Enable the SMARTCARD transmit DMA Stream */
597  tmp = (uint32_t*)&pData;
598  HAL_DMA_Start_IT(hsc->hdmatx, *(uint32_t*)tmp, (uint32_t)&hsc->Instance->TDR, Size);
599 
600  /* Clear the TC flag in the SR register by writing 0 to it */
602 
603  /* Process Unlocked */
604  __HAL_UNLOCK(hsc);
605 
606  /* Enable the DMA transfer for transmit request by setting the DMAT bit
607  in the SMARTCARD associated USART CR3 register */
609 
610  return HAL_OK;
611  }
612  else
613  {
614  return HAL_BUSY;
615  }
616 }
617 
627 HAL_StatusTypeDef HAL_SMARTCARD_Receive_DMA(SMARTCARD_HandleTypeDef *hsc, uint8_t *pData, uint16_t Size)
628 {
629  uint32_t *tmp;
630 
631  /* Check that a Rx process is not already ongoing */
633  {
634  if((pData == NULL) || (Size == 0U))
635  {
636  return HAL_ERROR;
637  }
638 
639  /* Process Locked */
640  __HAL_LOCK(hsc);
641 
642  hsc->pRxBuffPtr = pData;
643  hsc->RxXferSize = Size;
644 
647 
648  /* Set the SMARTCARD DMA transfer complete callback */
649  hsc->hdmarx->XferCpltCallback = SMARTCARD_DMAReceiveCplt;
650 
651  /* Set the SMARTCARD DMA error callback */
652  hsc->hdmarx->XferErrorCallback = SMARTCARD_DMAError;
653 
654  /* Set the DMA abort callback */
655  hsc->hdmatx->XferAbortCallback = NULL;
656 
657  /* Enable the DMA Stream */
658  tmp = (uint32_t*)&pData;
659  HAL_DMA_Start_IT(hsc->hdmarx, (uint32_t)&hsc->Instance->RDR, *(uint32_t*)tmp, Size);
660 
661  /* Process Unlocked */
662  __HAL_UNLOCK(hsc);
663 
664  /* Enable the SMARTCARD Parity Error Interrupt */
666 
667  /* Enable the SMARTCARD Error Interrupt: (Frame error, noise error, overrun error) */
669 
670  /* Enable the DMA transfer for the receiver request by setting the DMAR bit
671  in the SMARTCARD associated USART CR3 register */
673 
674  return HAL_OK;
675  }
676  else
677  {
678  return HAL_BUSY;
679  }
680 }
681 
688 {
689  uint32_t isrflags = READ_REG(hsc->Instance->ISR);
690  uint32_t cr1its = READ_REG(hsc->Instance->CR1);
691  uint32_t cr3its = READ_REG(hsc->Instance->CR3);
692  uint32_t dmarequest = 0x00U;
693  uint32_t errorflags = 0x00U;
694 
695  /* If no error occurs */
696  errorflags = (isrflags & (uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_ORE | USART_ISR_NE));
697  if(errorflags == RESET)
698  {
699  /* SMARTCARD in mode Receiver -------------------------------------------------*/
700  if(((isrflags & USART_ISR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
701  {
702  SMARTCARD_Receive_IT(hsc);
703  return;
704  }
705  }
706 
707  /* If some errors occur */
708  if((errorflags != RESET) && ((cr3its & (USART_CR3_EIE | USART_CR1_PEIE)) != RESET))
709  {
710  /* SMARTCARD parity error interrupt occurred ---------------------------*/
711  if(((isrflags & SMARTCARD_FLAG_PE) != RESET) && ((cr1its & USART_CR1_PEIE) != RESET))
712  {
714  }
715 
716  /* SMARTCARD frame error interrupt occurred ----------------------------*/
717  if(((isrflags & SMARTCARD_FLAG_FE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET))
718  {
720  }
721 
722  /* SMARTCARD noise error interrupt occurred ----------------------------*/
723  if(((isrflags & SMARTCARD_FLAG_NE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET))
724  {
726  }
727 
728  /* SMARTCARD Over-Run interrupt occurred -------------------------------*/
729  if(((isrflags & SMARTCARD_FLAG_ORE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET))
730  {
732  }
733  /* Call the Error call Back in case of Errors */
735  {
736  /* SMARTCARD in mode Receiver -----------------------------------------------*/
737  if(((isrflags & USART_ISR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
738  {
739  SMARTCARD_Receive_IT(hsc);
740  }
741 
742  /* If Overrun error occurs, or if any error occurs in DMA mode reception,
743  consider error as blocking */
744  dmarequest = HAL_IS_BIT_SET(hsc->Instance->CR3, USART_CR3_DMAR);
745  if(((hsc->ErrorCode & HAL_SMARTCARD_ERROR_ORE) != RESET) || dmarequest)
746  {
747  /* Blocking error : transfer is aborted
748  Set the SMARTCARD state ready to be able to start again the process,
749  Disable Rx Interrupts, and disable Rx DMA request, if ongoing */
750  SMARTCARD_EndRxTransfer(hsc);
751  /* Disable the SMARTCARD DMA Rx request if enabled */
753  {
755 
756  /* Abort the SMARTCARD DMA Rx channel */
757  if(hsc->hdmarx != NULL)
758  {
759  /* Set the SMARTCARD DMA Abort callback :
760  will lead to call HAL_SMARTCARD_ErrorCallback() at end of DMA abort procedure */
761  hsc->hdmarx->XferAbortCallback = SMARTCARD_DMAAbortOnError;
762 
763  if(HAL_DMA_Abort_IT(hsc->hdmarx) != HAL_OK)
764  {
765  /* Call Directly XferAbortCallback function in case of error */
766  hsc->hdmarx->XferAbortCallback(hsc->hdmarx);
767  }
768  }
769  else
770  {
771  /* Call user error callback */
773  }
774  }
775  else
776  {
777  /* Call user error callback */
779  }
780  }
781  else
782  {
783  /* Call user error callback */
786  }
787  }
788  return;
789  } /* End if some error occurs */
790 
791  /* SMARTCARD in mode Transmitter -------------------------------------------*/
792  if(((isrflags & SMARTCARD_FLAG_TXE) != RESET) && ((cr1its & USART_CR1_TXEIE) != RESET))
793  {
794  SMARTCARD_Transmit_IT(hsc);
795  return;
796  }
797 
798  /* SMARTCARD in mode Transmitter (transmission end) ------------------------*/
799  if(((isrflags & SMARTCARD_FLAG_TC) != RESET) && ((cr1its & USART_CR1_TCIE) != RESET))
800  {
801  /* Disable the SMARTCARD Transmit Complete Interrupt */
802  CLEAR_BIT(hsc->Instance->CR1, USART_CR1_TCIE);
803 
804  /* Disable the SMARTCARD Error Interrupt: (Frame error, noise error, overrun error) */
805  CLEAR_BIT(hsc->Instance->CR3, USART_CR3_EIE);
806 
807  /* Tx process is ended, restore hsmartcard->gState to Ready */
809 
811 
812  return;
813  }
814 }
815 
822 {
823  /* Prevent unused argument(s) compilation warning */
824  UNUSED(hsc);
825 
826  /* NOTE : This function Should not be modified, when the callback is needed,
827  the HAL_SMARTCARD_TxCpltCallback could be implemented in the user file
828  */
829 }
830 
837 {
838  /* Prevent unused argument(s) compilation warning */
839  UNUSED(hsc);
840 
841  /* NOTE : This function Should not be modified, when the callback is needed,
842  the HAL_SMARTCARD_TxCpltCallback could be implemented in the user file
843  */
844 }
845 
852 {
853  /* Prevent unused argument(s) compilation warning */
854  UNUSED(hsc);
855 
856  /* NOTE : This function Should not be modified, when the callback is needed,
857  the HAL_SMARTCARD_ErrorCallback could be implemented in the user file
858  */
859 }
860 
889 {
890  uint32_t temp1= 0x00U, temp2 = 0x00U;
891  temp1 = hsc->gState;
892  temp2 = hsc->RxState;
893 
894  return (HAL_SMARTCARD_StateTypeDef)(temp1 | temp2);
895 }
896 
904 {
905  return hsc->ErrorCode;
906 }
907 
919 static HAL_StatusTypeDef SMARTCARD_Transmit_IT(SMARTCARD_HandleTypeDef *hsc)
920 {
922  {
923  if(hsc->TxXferCount == 0)
924  {
925  /* Disable the SMARTCARD Transmit Complete Interrupt */
926  CLEAR_BIT(hsc->Instance->CR1, USART_CR1_TXEIE);
927 
928  /* Disable the SMARTCARD Error Interrupt: (Frame error, noise error, overrun error) */
929  CLEAR_BIT(hsc->Instance->CR3, USART_CR3_EIE);
930 
931  /* Tx process is ended, restore hsmartcard->gState to Ready */
933  }
934 
936 
937  return HAL_OK;
938  }
939  else
940  {
941  hsc->Instance->TDR = (*hsc->pTxBuffPtr++ & (uint8_t)0xFFU);
942  hsc->TxXferCount--;
943 
944  return HAL_OK;
945  }
946 }
947 
955 static HAL_StatusTypeDef SMARTCARD_Receive_IT(SMARTCARD_HandleTypeDef *hsc)
956 {
957  /* Check that a Rx process is ongoing */
959  {
960  *hsc->pRxBuffPtr++ = (uint8_t)(hsc->Instance->RDR & (uint8_t)0xFFU);
961 
962  if(--hsc->RxXferCount == 0)
963  {
964  CLEAR_BIT(hsc->Instance->CR1, USART_CR1_RXNEIE);
965 
966  /* Disable the SMARTCARD Parity Error Interrupt */
967  CLEAR_BIT(hsc->Instance->CR1, USART_CR1_PEIE);
968 
969  /* Disable the SMARTCARD Error Interrupt: (Frame error, noise error, overrun error) */
970  CLEAR_BIT(hsc->Instance->CR3, USART_CR3_EIE);
971 
973 
975 
976  return HAL_OK;
977  }
978 
979  return HAL_OK;
980  }
981  else
982  {
983  return HAL_BUSY;
984  }
985 }
986 
992 static void SMARTCARD_SetConfig(SMARTCARD_HandleTypeDef *hsc)
993 {
994  uint32_t tmpreg = 0x00000000U;
995  uint32_t clocksource = 0x00000000U;
996 
997  /* Check the parameters */
1011 
1012  /*-------------------------- USART CR1 Configuration -----------------------*/
1013  /* In SmartCard mode, M and PCE are forced to 1 (8 bits + parity).
1014  * Oversampling is forced to 16 (OVER8 = 0).
1015  * Configure the Parity and Mode:
1016  * set PS bit according to hsc->Init.Parity value
1017  * set TE and RE bits according to hsc->Init.Mode value */
1018  tmpreg = (uint32_t) hsc->Init.Parity | hsc->Init.Mode;
1019  /* in case of TX-only mode, if NACK is enabled, the USART must be able to monitor
1020  the bidirectional line to detect a NACK signal in case of parity error.
1021  Therefore, the receiver block must be enabled as well (RE bit must be set). */
1022  if((hsc->Init.Mode == SMARTCARD_MODE_TX) && (hsc->Init.NACKState == SMARTCARD_NACK_ENABLE))
1023  {
1024  tmpreg |= USART_CR1_RE;
1025  }
1026  tmpreg |= (uint32_t) hsc->Init.WordLength;
1027  MODIFY_REG(hsc->Instance->CR1, USART_CR1_FIELDS, tmpreg);
1028 
1029  /*-------------------------- USART CR2 Configuration -----------------------*/
1030  /* Stop bits are forced to 1.5 (STOP = 11) */
1031  tmpreg = hsc->Init.StopBits;
1032  /* Synchronous mode is activated by default */
1033  tmpreg |= (uint32_t) USART_CR2_CLKEN | hsc->Init.CLKPolarity;
1034  tmpreg |= (uint32_t) hsc->Init.CLKPhase | hsc->Init.CLKLastBit;
1035  tmpreg |= (uint32_t) hsc->Init.TimeOutEnable;
1036  MODIFY_REG(hsc->Instance->CR2, USART_CR2_FIELDS, tmpreg);
1037 
1038  /*-------------------------- USART CR3 Configuration -----------------------*/
1039  /* Configure
1040  * - one-bit sampling method versus three samples' majority rule
1041  * according to hsc->Init.OneBitSampling
1042  * - NACK transmission in case of parity error according
1043  * to hsc->Init.NACKEnable
1044  * - autoretry counter according to hsc->Init.AutoRetryCount */
1045  tmpreg = (uint32_t) hsc->Init.OneBitSampling | hsc->Init.NACKState;
1046  tmpreg |= (uint32_t) (hsc->Init.AutoRetryCount << SMARTCARD_CR3_SCARCNT_LSB_POS);
1047  MODIFY_REG(hsc->Instance-> CR3,USART_CR3_FIELDS, tmpreg);
1048 
1049  /*-------------------------- USART GTPR Configuration ----------------------*/
1050  tmpreg = (uint32_t) (hsc->Init.Prescaler | (hsc->Init.GuardTime << SMARTCARD_GTPR_GT_LSB_POS));
1051  MODIFY_REG(hsc->Instance->GTPR, (uint32_t)(USART_GTPR_GT|USART_GTPR_PSC), tmpreg);
1052 
1053  /*-------------------------- USART RTOR Configuration ----------------------*/
1054  tmpreg = (uint32_t) (hsc->Init.BlockLength << SMARTCARD_RTOR_BLEN_LSB_POS);
1056  {
1058  tmpreg |= (uint32_t) hsc->Init.TimeOutValue;
1059  }
1061 
1062  /*-------------------------- USART BRR Configuration -----------------------*/
1063  SMARTCARD_GETCLOCKSOURCE(hsc, clocksource);
1064  switch (clocksource)
1065  {
1067  hsc->Instance->BRR = (uint16_t)((HAL_RCC_GetPCLK1Freq() + (hsc->Init.BaudRate/2))/ hsc->Init.BaudRate);
1068  break;
1070  hsc->Instance->BRR = (uint16_t)((HAL_RCC_GetPCLK2Freq() + (hsc->Init.BaudRate/2))/ hsc->Init.BaudRate);
1071  break;
1073  hsc->Instance->BRR = (uint16_t)((HSI_VALUE + (hsc->Init.BaudRate/2))/ hsc->Init.BaudRate);
1074  break;
1076  hsc->Instance->BRR = (uint16_t)((HAL_RCC_GetSysClockFreq() + (hsc->Init.BaudRate/2))/ hsc->Init.BaudRate);
1077  break;
1079  hsc->Instance->BRR = (uint16_t)((LSE_VALUE + (hsc->Init.BaudRate/2))/ hsc->Init.BaudRate);
1080  break;
1081  default:
1082  break;
1083  }
1084 }
1085 
1091 static HAL_StatusTypeDef SMARTCARD_CheckIdleState(SMARTCARD_HandleTypeDef *hsc)
1092 {
1093  uint32_t tickstart = 0U;
1094 
1095  /* Initialize the SMARTCARD ErrorCode */
1097 
1098  /* Init tickstart for timeout managment*/
1099  tickstart = HAL_GetTick();
1100 
1101  /* Check if the Transmitter is enabled */
1102  if((hsc->Instance->CR1 & USART_CR1_TE) == USART_CR1_TE)
1103  {
1104  /* Wait until TEACK flag is set */
1105  if(SMARTCARD_WaitOnFlagUntilTimeout(hsc, USART_ISR_TEACK, RESET, tickstart, TEACK_REACK_TIMEOUT) != HAL_OK)
1106  {
1107  return HAL_TIMEOUT;
1108  }
1109  }
1110  /* Check if the Receiver is enabled */
1111  if((hsc->Instance->CR1 & USART_CR1_RE) == USART_CR1_RE)
1112  {
1113  /* Wait until REACK flag is set */
1114  if(SMARTCARD_WaitOnFlagUntilTimeout(hsc, USART_ISR_REACK, RESET, tickstart, TEACK_REACK_TIMEOUT) != HAL_OK)
1115  {
1116  return HAL_TIMEOUT;
1117  }
1118  }
1119 
1120  /* Process Unlocked */
1121  __HAL_UNLOCK(hsc);
1122 
1123  /* Initialize the SMARTCARD state*/
1126 
1127  return HAL_OK;
1128 }
1129 
1135 static void SMARTCARD_AdvFeatureConfig(SMARTCARD_HandleTypeDef *hsc)
1136 {
1137  /* Check whether the set of advanced features to configure is properly set */
1139 
1140  /* if required, configure TX pin active level inversion */
1142  {
1145  }
1146 
1147  /* if required, configure RX pin active level inversion */
1149  {
1152  }
1153 
1154  /* if required, configure data inversion */
1156  {
1159  }
1160 
1161  /* if required, configure RX/TX pins swap */
1163  {
1166  }
1167 
1168  /* if required, configure RX overrun detection disabling */
1170  {
1173  }
1174 
1175  /* if required, configure DMA disabling on reception error */
1177  {
1180  }
1181 
1182  /* if required, configure MSB first on communication line */
1184  {
1187  }
1188 }
1189 
1199 static HAL_StatusTypeDef SMARTCARD_WaitOnFlagUntilTimeout(SMARTCARD_HandleTypeDef *hsc, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout)
1200 {
1201  /* Wait until flag is set */
1202  while((__HAL_SMARTCARD_GET_FLAG(hsc, Flag) ? SET : RESET) == Status)
1203  {
1204  /* Check for the Timeout */
1205  if(Timeout != HAL_MAX_DELAY)
1206  {
1207  if((Timeout == 0U)||((HAL_GetTick() - Tickstart ) > Timeout))
1208  {
1209  /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */
1210  CLEAR_BIT(hsc->Instance->CR1, USART_CR1_TXEIE);
1211  CLEAR_BIT(hsc->Instance->CR1, USART_CR1_RXNEIE);
1214  CLEAR_BIT(hsc->Instance->CR1, USART_CR1_PEIE);
1215  CLEAR_BIT(hsc->Instance->CR3, USART_CR3_EIE);
1216 
1219 
1220  /* Process Unlocked */
1221  __HAL_UNLOCK(hsc);
1222 
1223  return HAL_TIMEOUT;
1224  }
1225  }
1226  }
1227  return HAL_OK;
1228 }
1229 
1230 /*
1231  * @brief End ongoing Tx transfer on SMARTCARD peripheral (following error detection or Transmit completion).
1232  * @param hsc: SMARTCARD handle.
1233  * @retval None
1234  */
1235 static void SMARTCARD_EndTxTransfer(SMARTCARD_HandleTypeDef *hsc)
1236 {
1237  /* Disable TXEIE and TCIE interrupts */
1238  CLEAR_BIT(hsc->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE));
1239 
1240  /* At end of Tx process, restore hsc->gState to Ready */
1242 }
1243 
1244 
1250 static void SMARTCARD_EndRxTransfer(SMARTCARD_HandleTypeDef *hsc)
1251 {
1252  /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
1253  CLEAR_BIT(hsc->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
1254  CLEAR_BIT(hsc->Instance->CR3, USART_CR3_EIE);
1255 
1256  /* At end of Rx process, restore hsc->RxState to Ready */
1258 }
1259 
1265 static void SMARTCARD_DMATransmitCplt(DMA_HandleTypeDef *hdma)
1266 {
1268  hsc->TxXferCount = 0;
1269 
1270  /* Disable the DMA transfer for transmit request by setting the DMAT bit
1271  in the USART CR3 register */
1273 
1274  /* Enable the SMARTCARD Transmit Complete Interrupt */
1276 }
1277 
1283 static void SMARTCARD_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
1284 {
1286  hsc->RxXferCount = 0;
1287 
1288  /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
1289  CLEAR_BIT(hsc->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
1290  CLEAR_BIT(hsc->Instance->CR3, USART_CR3_EIE);
1291 
1292  /* Disable the DMA transfer for the receiver request by setting the DMAR bit
1293  in the SMARTCARD associated USART CR3 register */
1295 
1296  /* At end of Rx process, restore hsc->RxState to Ready */
1298 
1300 }
1301 
1307 static void SMARTCARD_DMAError(DMA_HandleTypeDef *hdma)
1308 {
1310  hsc->RxXferCount = 0U;
1311  hsc->TxXferCount = 0U;
1313 
1314  /* Stop SMARTCARD DMA Tx request if ongoing */
1315  if ( (hsc->gState == HAL_SMARTCARD_STATE_BUSY_TX)
1317  {
1318  SMARTCARD_EndTxTransfer(hsc);
1319  }
1320 
1321  /* Stop SMARTCARD DMA Rx request if ongoing */
1322  if ( (hsc->RxState == HAL_SMARTCARD_STATE_BUSY_RX)
1324  {
1325  SMARTCARD_EndRxTransfer(hsc);
1326  }
1327 
1329 }
1330 
1337 static void SMARTCARD_DMAAbortOnError(DMA_HandleTypeDef *hdma)
1338 {
1340  hsc->RxXferCount = 0U;
1341  hsc->TxXferCount = 0U;
1342 
1344 }
1345 
1350 #endif /* HAL_SMARTCARD_MODULE_ENABLED */
1351 
1359 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
__IO uint32_t GTPR
Definition: stm32f745xx.h:934
#define CLEAR_BIT(REG, BIT)
Definition: stm32f7xx.h:180
#define MODIFY_REG(REG, CLEARMASK, SETMASK)
Definition: stm32f7xx.h:190
#define IS_SMARTCARD_ONE_BIT_SAMPLE(__ONEBIT__)
#define SMARTCARD_FLAG_TXE
#define SMARTCARD_GTPR_GT_LSB_POS
HAL_StatusTypeDef HAL_SMARTCARD_Receive(SMARTCARD_HandleTypeDef *hsc, uint8_t *pData, uint16_t Size, uint32_t Timeout)
#define SMARTCARD_ADVFEATURE_NO_INIT
#define USART_CR1_PEIE
Definition: stm32f745xx.h:7414
#define USART_CR1_TCIE
Definition: stm32f745xx.h:7412
#define SMARTCARD_IT_PE
#define IS_SMARTCARD_ADVFEATURE_INIT(INIT)
#define assert_param(expr)
Include module&#39;s header file.
#define USART_CR2_DATAINV
Definition: stm32f745xx.h:7454
#define __HAL_SMARTCARD_CLEAR_IT(__HANDLE__, __IT_CLEAR__)
Clears the specified SMARTCARD ISR flag, in setting the proper ICR register flag. ...
#define USART_CR2_CLKEN
Definition: stm32f745xx.h:7446
#define HSI_VALUE
Internal High Speed oscillator (HSI) value. This value is used by the RCC HAL module to compute the s...
#define IS_SMARTCARD_ADVFEATURE_SWAP(SWAP)
Definition: stm32f7xx.h:155
#define USART_RTOR_RTO
Definition: stm32f745xx.h:7496
#define USART_ISR_REACK
Definition: stm32f745xx.h:7528
#define __HAL_UNLOCK(__HANDLE__)
#define IS_SMARTCARD_TIMEOUT_VALUE(__TIMEOUTVALUE__)
#define USART_CR3_OVRDIS
Definition: stm32f745xx.h:7476
#define USART_RTOR_BLEN
Definition: stm32f745xx.h:7497
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
__IO uint32_t TDR
Definition: stm32f745xx.h:940
#define USART_CR1_TXEIE
Definition: stm32f745xx.h:7413
#define SMARTCARD_ADVFEATURE_SWAP_INIT
__IO uint32_t BRR
Definition: stm32f745xx.h:933
#define USART_CR3_HDSEL
Definition: stm32f745xx.h:7467
#define IS_SMARTCARD_WORD_LENGTH(__LENGTH__)
SMARTCARD_AdvFeatureInitTypeDef AdvancedInit
HAL_StatusTypeDef HAL_SMARTCARD_Transmit(SMARTCARD_HandleTypeDef *hsc, uint8_t *pData, uint16_t Size, uint32_t Timeout)
#define SMARTCARD_FLAG_RXNE
#define SMARTCARD_FLAG_PE
#define USART_ISR_TEACK
Definition: stm32f745xx.h:7527
#define USART_CR1_TE
Definition: stm32f745xx.h:7409
#define SMARTCARD_ADVFEATURE_MSBFIRST_INIT
#define USART_ISR_FE
Definition: stm32f745xx.h:7508
#define USART_CR1_RXNEIE
Definition: stm32f745xx.h:7411
void(* XferCpltCallback)(struct __DMA_HandleTypeDef *hdma)
#define __HAL_LOCK(__HANDLE__)
#define IS_SMARTCARD_ADVFEATURE_RXINV(RXINV)
#define HAL_SMARTCARD_ERROR_PE
void HAL_SMARTCARD_TxCpltCallback(SMARTCARD_HandleTypeDef *hsc)
#define NULL
Definition: usbd_def.h:53
uint32_t HAL_RCC_GetPCLK1Freq(void)
#define HAL_MAX_DELAY
HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma)
HAL_StatusTypeDef HAL_SMARTCARD_Init(SMARTCARD_HandleTypeDef *hsc)
HAL_StatusTypeDef HAL_SMARTCARD_Transmit_IT(SMARTCARD_HandleTypeDef *hsc, uint8_t *pData, uint16_t Size)
#define USART_CR2_SWAP
Definition: stm32f745xx.h:7451
FlagStatus
Definition: stm32f7xx.h:152
#define IS_SMARTCARD_MODE(__MODE__)
#define SMARTCARD_CR3_SCARCNT_LSB_POS
HAL_StatusTypeDef HAL_SMARTCARD_Receive_DMA(SMARTCARD_HandleTypeDef *hsc, uint8_t *pData, uint16_t Size)
#define SMARTCARD_ADVFEATURE_DATAINVERT_INIT
#define __HAL_SMARTCARD_GET_FLAG(__HANDLE__, __FLAG__)
Checks whether the specified Smartcard flag is set or not.
This file contains all the functions prototypes for the HAL module driver.
#define IS_SMARTCARD_INSTANCE(__INSTANCE__)
Definition: stm32f745xx.h:9207
void HAL_SMARTCARD_ErrorCallback(SMARTCARD_HandleTypeDef *hsc)
#define USART_ISR_PE
Definition: stm32f745xx.h:7507
__IO uint32_t CR1
Definition: stm32f745xx.h:930
#define SMARTCARD_ADVFEATURE_TXINVERT_INIT
#define IS_SMARTCARD_LASTBIT(__LASTBIT__)
#define HAL_SMARTCARD_ERROR_FE
#define USART_CR2_MSBFIRST
Definition: stm32f745xx.h:7455
#define HAL_SMARTCARD_ERROR_ORE
uint32_t HAL_RCC_GetSysClockFreq(void)
#define IS_SMARTCARD_PHASE(__CPHA__)
#define USART_ISR_RXNE
Definition: stm32f745xx.h:7512
#define LSE_VALUE
External Low Speed oscillator (LSE) value.
SMARTCARD handle Structure definition.
#define USART_CR2_TXINV
Definition: stm32f745xx.h:7453
#define IS_SMARTCARD_STOPBITS(__STOPBITS__)
#define HAL_SMARTCARD_ERROR_NE
#define SMARTCARD_FLAG_ORE
#define HAL_SMARTCARD_ERROR_DMA
#define IS_SMARTCARD_ADVFEATURE_TXINV(TXINV)
#define SMARTCARD_NACK_ENABLE
__IO HAL_SMARTCARD_StateTypeDef RxState
#define UNUSED(x)
#define USART_CR3_DMAT
Definition: stm32f745xx.h:7471
#define USART_GTPR_PSC
Definition: stm32f745xx.h:7491
void(* XferAbortCallback)(struct __DMA_HandleTypeDef *hdma)
uint32_t HAL_SMARTCARD_GetError(SMARTCARD_HandleTypeDef *hsc)
HAL_SMARTCARD_StateTypeDef
HAL State structures definition.
#define SMARTCARD_ADVFEATURE_RXINVERT_INIT
__IO uint32_t RTOR
Definition: stm32f745xx.h:935
HAL_StatusTypeDef HAL_SMARTCARD_Transmit_DMA(SMARTCARD_HandleTypeDef *hsc, uint8_t *pData, uint16_t Size)
#define __HAL_SMARTCARD_ENABLE(__HANDLE__)
Enable the USART associated to the SMARTCARD Handle.
#define SET_BIT(REG, BIT)
Definition: stm32f7xx.h:178
#define SMARTCARD_ADVFEATURE_RXOVERRUNDISABLE_INIT
#define HAL_IS_BIT_SET(REG, BIT)
#define __HAL_SMARTCARD_DISABLE(__HANDLE__)
Disable the USART associated to the SMARTCARD Handle.
#define IS_SMARTCARD_TIMEOUT(__TIMEOUT__)
#define READ_REG(REG)
Definition: stm32f7xx.h:188
HAL_StatusTypeDef HAL_SMARTCARD_Receive_IT(SMARTCARD_HandleTypeDef *hsc, uint8_t *pData, uint16_t Size)
#define USART_ISR_ORE
Definition: stm32f745xx.h:7510
#define IS_SMARTCARD_OVERRUN(OVERRUN)
DMA handle Structure definition.
#define SMARTCARD_GETCLOCKSOURCE(__HANDLE__, __CLOCKSOURCE__)
Reports the SMARTCARD clock source.
__IO uint32_t RDR
Definition: stm32f745xx.h:939
#define SMARTCARD_MODE_TX
#define USART_GTPR_GT
Definition: stm32f745xx.h:7492
#define IS_SMARTCARD_POLARITY(__CPOL__)
#define IS_SMARTCARD_ADVFEATURE_DMAONRXERROR(DMA)
#define USART_CR2_RXINV
Definition: stm32f745xx.h:7452
#define SMARTCARD_FLAG_TC
#define IS_SMARTCARD_PARITY(__PARITY__)
#define IS_SMARTCARD_ADVFEATURE_DATAINV(DATAINV)
__IO uint32_t CR2
Definition: stm32f745xx.h:931
#define HAL_SMARTCARD_ERROR_NONE
#define SMARTCARD_RTOR_BLEN_LSB_POS
HAL_StatusTypeDef HAL_SMARTCARD_DeInit(SMARTCARD_HandleTypeDef *hsc)
__IO uint32_t CR3
Definition: stm32f745xx.h:932
void HAL_SMARTCARD_MspInit(SMARTCARD_HandleTypeDef *hsc)
#define SMARTCARD_IT_ERR
__IO uint32_t ISR
Definition: stm32f745xx.h:937
__IO HAL_SMARTCARD_StateTypeDef gState
#define IS_SMARTCARD_AUTORETRY_COUNT(__COUNT__)
#define USART_CR1_RE
Definition: stm32f745xx.h:7408
HAL_StatusTypeDef
HAL Status structures definition.
#define SMARTCARD_FLAG_NE
#define USART_CR3_IREN
Definition: stm32f745xx.h:7465
#define SMARTCARD_ADVFEATURE_DMADISABLEONERROR_INIT
void(* XferErrorCallback)(struct __DMA_HandleTypeDef *hdma)
uint32_t HAL_GetTick(void)
Provides a tick value in millisecond.
#define SMARTCARD_TIMEOUT_ENABLE
#define IS_SMARTCARD_ADVFEATURE_MSBFIRST(MSBFIRST)
void HAL_SMARTCARD_IRQHandler(SMARTCARD_HandleTypeDef *hsc)
void HAL_SMARTCARD_MspDeInit(SMARTCARD_HandleTypeDef *hsc)
HAL_SMARTCARD_StateTypeDef HAL_SMARTCARD_GetState(SMARTCARD_HandleTypeDef *hsc)
#define IS_SMARTCARD_BAUDRATE(__BAUDRATE__)
#define SMARTCARD_FLAG_FE
uint32_t HAL_RCC_GetPCLK2Freq(void)
#define USART_CR3_EIE
Definition: stm32f745xx.h:7464
#define __HAL_SMARTCARD_DISABLE_IT(__HANDLE__, __INTERRUPT__)
Disables the specified SmartCard interrupt.
#define USART_CR3_SCEN
Definition: stm32f745xx.h:7469
#define USART_CR3_DDRE
Definition: stm32f745xx.h:7477
#define USART_ISR_NE
Definition: stm32f745xx.h:7509
void HAL_SMARTCARD_RxCpltCallback(SMARTCARD_HandleTypeDef *hsc)
#define IS_SMARTCARD_NACK(__NACK__)
#define USART_CR2_LINEN
Definition: stm32f745xx.h:7450
#define USART_CR3_DMAR
Definition: stm32f745xx.h:7470