1 /**
2   ******************************************************************************
3   * @file    stm32f1xx_hal_smartcard.c
4   * @author  MCD Application Team
5   * @brief   SMARTCARD HAL module driver.
6   *          This file provides firmware functions to manage the following
7   *          functionalities of the SMARTCARD peripheral:
8   *           + Initialization and de-initialization functions
9   *           + IO operation functions
10   *           + Peripheral Control functions
11   *           + Peripheral State and Error functions
12   *
13   @verbatim
14   ==============================================================================
15                      ##### How to use this driver #####
16   ==============================================================================
17     [..]
18       The SMARTCARD HAL driver can be used as follows:
19 
20     (#) Declare a SMARTCARD_HandleTypeDef handle structure.
21     (#) Initialize the SMARTCARD low level resources by implementing the HAL_SMARTCARD_MspInit() API:
22         (##) Enable the interface clock of the USARTx associated to the SMARTCARD.
23         (##) SMARTCARD pins configuration:
24             (+++) Enable the clock for the SMARTCARD GPIOs.
25             (+++) Configure SMARTCARD pins as alternate function pull-up.
26         (##) NVIC configuration if you need to use interrupt process (HAL_SMARTCARD_Transmit_IT()
27              and HAL_SMARTCARD_Receive_IT() APIs):
28             (+++) Configure the USARTx interrupt priority.
29             (+++) Enable the NVIC USART IRQ handle.
30         (##) DMA Configuration if you need to use DMA process (HAL_SMARTCARD_Transmit_DMA()
31              and HAL_SMARTCARD_Receive_DMA() APIs):
32             (+++) Declare a DMA handle structure for the Tx/Rx channel.
33             (+++) Enable the DMAx interface clock.
34             (+++) Configure the declared DMA handle structure with the required Tx/Rx parameters.
35             (+++) Configure the DMA Tx/Rx channel.
36             (+++) Associate the initialized DMA handle to the SMARTCARD DMA Tx/Rx handle.
37             (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on the DMA Tx/Rx channel.
38             (+++) Configure the USARTx interrupt priority and enable the NVIC USART IRQ handle
39                   (used for last byte sending completion detection in DMA non circular mode)
40 
41     (#) Program the Baud Rate, Word Length , Stop Bit, Parity, Hardware
42         flow control and Mode(Receiver/Transmitter) in the SMARTCARD Init structure.
43 
44     (#) Initialize the SMARTCARD registers by calling the HAL_SMARTCARD_Init() API:
45         (++) These APIs configure also the low level Hardware GPIO, CLOCK, CORTEX...etc)
46              by calling the customized HAL_SMARTCARD_MspInit() API.
47     [..]
48     (@) The specific SMARTCARD interrupts (Transmission complete interrupt,
49         RXNE interrupt and Error Interrupts) will be managed using the macros
50         __HAL_SMARTCARD_ENABLE_IT() and __HAL_SMARTCARD_DISABLE_IT() inside the transmit and receive process.
51 
52     [..]
53     Three operation modes are available within this driver :
54 
55     *** Polling mode IO operation ***
56     =================================
57     [..]
58       (+) Send an amount of data in blocking mode using HAL_SMARTCARD_Transmit()
59       (+) Receive an amount of data in blocking mode using HAL_SMARTCARD_Receive()
60 
61     *** Interrupt mode IO operation ***
62     ===================================
63     [..]
64       (+) Send an amount of data in non blocking mode using HAL_SMARTCARD_Transmit_IT()
65       (+) At transmission end of transfer HAL_SMARTCARD_TxCpltCallback is executed and user can
66           add his own code by customization of function pointer HAL_SMARTCARD_TxCpltCallback
67       (+) Receive an amount of data in non blocking mode using HAL_SMARTCARD_Receive_IT()
68       (+) At reception end of transfer HAL_SMARTCARD_RxCpltCallback is executed and user can
69           add his own code by customization of function pointer HAL_SMARTCARD_RxCpltCallback
70       (+) In case of transfer Error, HAL_SMARTCARD_ErrorCallback() function is executed and user can
71           add his own code by customization of function pointer HAL_SMARTCARD_ErrorCallback
72 
73     *** DMA mode IO operation ***
74     ==============================
75     [..]
76       (+) Send an amount of data in non blocking mode (DMA) using HAL_SMARTCARD_Transmit_DMA()
77       (+) At transmission end of transfer HAL_SMARTCARD_TxCpltCallback is executed and user can
78           add his own code by customization of function pointer HAL_SMARTCARD_TxCpltCallback
79       (+) Receive an amount of data in non blocking mode (DMA) using HAL_SMARTCARD_Receive_DMA()
80       (+) At reception end of transfer HAL_SMARTCARD_RxCpltCallback is executed and user can
81           add his own code by customization of function pointer HAL_SMARTCARD_RxCpltCallback
82       (+) In case of transfer Error, HAL_SMARTCARD_ErrorCallback() function is executed and user can
83           add his own code by customization of function pointer HAL_SMARTCARD_ErrorCallback
84 
85     *** SMARTCARD HAL driver macros list ***
86     ========================================
87     [..]
88       Below the list of most used macros in SMARTCARD HAL driver.
89 
90       (+) __HAL_SMARTCARD_ENABLE: Enable the SMARTCARD peripheral
91       (+) __HAL_SMARTCARD_DISABLE: Disable the SMARTCARD peripheral
92       (+) __HAL_SMARTCARD_GET_FLAG : Check whether the specified SMARTCARD flag is set or not
93       (+) __HAL_SMARTCARD_CLEAR_FLAG : Clear the specified SMARTCARD pending flag
94       (+) __HAL_SMARTCARD_ENABLE_IT: Enable the specified SMARTCARD interrupt
95       (+) __HAL_SMARTCARD_DISABLE_IT: Disable the specified SMARTCARD interrupt
96 
97     [..]
98       (@) You can refer to the SMARTCARD HAL driver header file for more useful macros
99 
100     ##### Callback registration #####
101     ==================================
102 
103     [..]
104     The compilation define USE_HAL_SMARTCARD_REGISTER_CALLBACKS when set to 1
105     allows the user to configure dynamically the driver callbacks.
106 
107     [..]
108     Use Function @ref HAL_SMARTCARD_RegisterCallback() to register a user callback.
109     Function @ref HAL_SMARTCARD_RegisterCallback() allows to register following callbacks:
110     (+) TxCpltCallback            : Tx Complete Callback.
111     (+) RxCpltCallback            : Rx Complete Callback.
112     (+) ErrorCallback             : Error Callback.
113     (+) AbortCpltCallback         : Abort Complete Callback.
114     (+) AbortTransmitCpltCallback : Abort Transmit Complete Callback.
115     (+) AbortReceiveCpltCallback  : Abort Receive Complete Callback.
116     (+) MspInitCallback           : SMARTCARD MspInit.
117     (+) MspDeInitCallback         : SMARTCARD MspDeInit.
118     This function takes as parameters the HAL peripheral handle, the Callback ID
119     and a pointer to the user callback function.
120 
121     [..]
122     Use function @ref HAL_SMARTCARD_UnRegisterCallback() to reset a callback to the default
123     weak (surcharged) function.
124     @ref HAL_SMARTCARD_UnRegisterCallback() takes as parameters the HAL peripheral handle,
125     and the Callback ID.
126     This function allows to reset following callbacks:
127     (+) TxCpltCallback            : Tx Complete Callback.
128     (+) RxCpltCallback            : Rx Complete Callback.
129     (+) ErrorCallback             : Error Callback.
130     (+) AbortCpltCallback         : Abort Complete Callback.
131     (+) AbortTransmitCpltCallback : Abort Transmit Complete Callback.
132     (+) AbortReceiveCpltCallback  : Abort Receive Complete Callback.
133     (+) MspInitCallback           : SMARTCARD MspInit.
134     (+) MspDeInitCallback         : SMARTCARD MspDeInit.
135 
136     [..]
137     By default, after the @ref HAL_SMARTCARD_Init() and when the state is HAL_SMARTCARD_STATE_RESET
138     all callbacks are set to the corresponding weak (surcharged) functions:
139     examples @ref HAL_SMARTCARD_TxCpltCallback(), @ref HAL_SMARTCARD_RxCpltCallback().
140     Exception done for MspInit and MspDeInit functions that are respectively
141     reset to the legacy weak (surcharged) functions in the @ref HAL_SMARTCARD_Init()
142     and @ref HAL_SMARTCARD_DeInit() only when these callbacks are null (not registered beforehand).
143     If not, MspInit or MspDeInit are not null, the @ref HAL_SMARTCARD_Init() and @ref HAL_SMARTCARD_DeInit()
144     keep and use the user MspInit/MspDeInit callbacks (registered beforehand).
145 
146     [..]
147     Callbacks can be registered/unregistered in HAL_SMARTCARD_STATE_READY state only.
148     Exception done MspInit/MspDeInit that can be registered/unregistered
149     in HAL_SMARTCARD_STATE_READY or HAL_SMARTCARD_STATE_RESET state, thus registered (user)
150     MspInit/DeInit callbacks can be used during the Init/DeInit.
151     In that case first register the MspInit/MspDeInit user callbacks
152     using @ref HAL_SMARTCARD_RegisterCallback() before calling @ref HAL_SMARTCARD_DeInit()
153     or @ref HAL_SMARTCARD_Init() function.
154 
155     [..]
156     When The compilation define USE_HAL_SMARTCARD_REGISTER_CALLBACKS is set to 0 or
157     not defined, the callback registration feature is not available
158     and weak (surcharged) callbacks are used.
159 
160   @endverbatim
161   ******************************************************************************
162   * @attention
163   *
164   * <h2><center>&copy; Copyright (c) 2016 STMicroelectronics.
165   * All rights reserved.</center></h2>
166   *
167   * This software component is licensed by ST under BSD 3-Clause license,
168   * the "License"; You may not use this file except in compliance with the
169   * License. You may obtain a copy of the License at:
170   *                        opensource.org/licenses/BSD-3-Clause
171   *
172   ******************************************************************************
173   */
174 
175 /* Includes ------------------------------------------------------------------*/
176 #include "stm32f1xx_hal.h"
177 
178 /** @addtogroup STM32F1xx_HAL_Driver
179   * @{
180   */
181 
182 /** @defgroup SMARTCARD SMARTCARD
183   * @brief HAL SMARTCARD module driver
184   * @{
185   */
186 #ifdef HAL_SMARTCARD_MODULE_ENABLED
187 /* Private typedef -----------------------------------------------------------*/
188 /* Private define ------------------------------------------------------------*/
189 /** @addtogroup SMARTCARD_Private_Constants
190   * @{
191   */
192 /**
193   * @}
194   */
195 
196 /* Private macro -------------------------------------------------------------*/
197 /* Private variables ---------------------------------------------------------*/
198 /* Private function prototypes -----------------------------------------------*/
199 /** @addtogroup SMARTCARD_Private_Functions
200   * @{
201   */
202 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
203 void SMARTCARD_InitCallbacksToDefault(SMARTCARD_HandleTypeDef *hsc);
204 #endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACKS */
205 static void SMARTCARD_EndTxTransfer(SMARTCARD_HandleTypeDef *hsc);
206 static void SMARTCARD_EndRxTransfer(SMARTCARD_HandleTypeDef *hsc);
207 static void SMARTCARD_SetConfig (SMARTCARD_HandleTypeDef *hsc);
208 static HAL_StatusTypeDef SMARTCARD_Transmit_IT(SMARTCARD_HandleTypeDef *hsc);
209 static HAL_StatusTypeDef SMARTCARD_EndTransmit_IT(SMARTCARD_HandleTypeDef *hsc);
210 static HAL_StatusTypeDef SMARTCARD_Receive_IT(SMARTCARD_HandleTypeDef *hsc);
211 static void SMARTCARD_DMATransmitCplt(DMA_HandleTypeDef *hdma);
212 static void SMARTCARD_DMAReceiveCplt(DMA_HandleTypeDef *hdma);
213 static void SMARTCARD_DMAError(DMA_HandleTypeDef *hdma);
214 static void SMARTCARD_DMAAbortOnError(DMA_HandleTypeDef *hdma);
215 static void SMARTCARD_DMATxAbortCallback(DMA_HandleTypeDef *hdma);
216 static void SMARTCARD_DMARxAbortCallback(DMA_HandleTypeDef *hdma);
217 static void SMARTCARD_DMATxOnlyAbortCallback(DMA_HandleTypeDef *hdma);
218 static void SMARTCARD_DMARxOnlyAbortCallback(DMA_HandleTypeDef *hdma);
219 static HAL_StatusTypeDef SMARTCARD_WaitOnFlagUntilTimeout(SMARTCARD_HandleTypeDef *hsc, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout);
220 /**
221   * @}
222   */
223 
224 /* Exported functions --------------------------------------------------------*/
225 /** @defgroup SMARTCARD_Exported_Functions SMARTCARD Exported Functions
226   * @{
227   */
228 
229 /** @defgroup SMARTCARD_Exported_Functions_Group1 SmartCard Initialization and de-initialization functions
230   *  @brief    Initialization and Configuration functions
231   *
232 @verbatim
233   ==============================================================================
234               ##### Initialization and Configuration functions #####
235   ==============================================================================
236   [..]
237   This subsection provides a set of functions allowing to initialize the USART
238   in Smartcard mode.
239   [..]
240   The Smartcard interface is designed to support asynchronous protocol Smartcards as
241   defined in the ISO 7816-3 standard.
242   [..]
243   The USART can provide a clock to the smartcard through the SCLK output.
244   In smartcard mode, SCLK is not associated to the communication but is simply derived
245   from the internal peripheral input clock through a 5-bit prescaler.
246   [..]
247   (+) For the Smartcard mode only these parameters can be configured:
248       (++) Baud Rate
249       (++) Word Length => Should be 9 bits (8 bits + parity)
250       (++) Stop Bit
251       (++) Parity: => Should be enabled
252       (++) USART polarity
253       (++) USART phase
254       (++) USART LastBit
255       (++) Receiver/transmitter modes
256       (++) Prescaler
257       (++) GuardTime
258       (++) NACKState: The Smartcard NACK state
259 
260      (+) Recommended SmartCard interface configuration to get the Answer to Reset from the Card:
261         (++) Word Length = 9 Bits
262         (++) 1.5 Stop Bit
263         (++) Even parity
264         (++) BaudRate = 12096 baud
265         (++) Tx and Rx enabled
266   [..]
267   Please refer to the ISO 7816-3 specification for more details.
268 
269   [..]
270    (@) It is also possible to choose 0.5 stop bit for receiving but it is recommended
271        to use 1.5 stop bits for both transmitting and receiving to avoid switching
272        between the two configurations.
273   [..]
274     The HAL_SMARTCARD_Init() function follows the USART  SmartCard configuration
275     procedures (details for the procedures are available in reference manuals
276     (RM0008 for STM32F10Xxx MCUs and RM0041 for STM32F100xx MCUs)).
277 
278 @endverbatim
279 
280   The SMARTCARD frame format is given in the following table:
281        +-------------------------------------------------------------+
282        |   M bit |  PCE bit  |        SMARTCARD frame                |
283        |---------------------|---------------------------------------|
284        |    1    |    1      |    | SB | 8 bit data | PB | STB |     |
285        +-------------------------------------------------------------+
286   * @{
287   */
288 
289 /**
290   * @brief  Initializes the SmartCard mode according to the specified
291   *         parameters in the SMARTCARD_InitTypeDef and create the associated handle.
292   * @param  hsc    Pointer to a SMARTCARD_HandleTypeDef structure that contains
293   *                the configuration information for SMARTCARD module.
294   * @retval HAL status
295   */
HAL_SMARTCARD_Init(SMARTCARD_HandleTypeDef * hsc)296 HAL_StatusTypeDef HAL_SMARTCARD_Init(SMARTCARD_HandleTypeDef *hsc)
297 {
298   /* Check the SMARTCARD handle allocation */
299   if(hsc == NULL)
300   {
301     return HAL_ERROR;
302   }
303 
304   /* Check the parameters */
305   assert_param(IS_SMARTCARD_INSTANCE(hsc->Instance));
306   assert_param(IS_SMARTCARD_NACK_STATE(hsc->Init.NACKState));
307 
308   if(hsc->gState == HAL_SMARTCARD_STATE_RESET)
309   {
310     /* Allocate lock resource and initialize it */
311     hsc->Lock = HAL_UNLOCKED;
312 
313 #if USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1
314     SMARTCARD_InitCallbacksToDefault(hsc);
315 
316     if (hsc->MspInitCallback == NULL)
317     {
318       hsc->MspInitCallback = HAL_SMARTCARD_MspInit;
319     }
320 
321     /* Init the low level hardware */
322     hsc->MspInitCallback(hsc);
323 #else
324     /* Init the low level hardware : GPIO, CLOCK */
325     HAL_SMARTCARD_MspInit(hsc);
326 #endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACKS */
327   }
328 
329   hsc->gState = HAL_SMARTCARD_STATE_BUSY;
330 
331   /* Set the Prescaler */
332   MODIFY_REG(hsc->Instance->GTPR, USART_GTPR_PSC, hsc->Init.Prescaler);
333 
334   /* Set the Guard Time */
335   MODIFY_REG(hsc->Instance->GTPR, USART_GTPR_GT, ((hsc->Init.GuardTime)<<8U));
336 
337   /* Set the Smartcard Communication parameters */
338   SMARTCARD_SetConfig(hsc);
339 
340   /* In SmartCard mode, the following bits must be kept cleared:
341   - LINEN bit in the USART_CR2 register
342   - HDSEL and IREN bits in the USART_CR3 register.*/
343   CLEAR_BIT(hsc->Instance->CR2, USART_CR2_LINEN);
344   CLEAR_BIT(hsc->Instance->CR3, (USART_CR3_IREN | USART_CR3_HDSEL));
345 
346   /* Enable the SMARTCARD Parity Error Interrupt */
347   SET_BIT(hsc->Instance->CR1, USART_CR1_PEIE);
348 
349   /* Enable the SMARTCARD Framing Error Interrupt */
350   SET_BIT(hsc->Instance->CR3, USART_CR3_EIE);
351 
352   /* Enable the Peripheral */
353   __HAL_SMARTCARD_ENABLE(hsc);
354 
355   /* Configure the Smartcard NACK state */
356   MODIFY_REG(hsc->Instance->CR3, USART_CR3_NACK, hsc->Init.NACKState);
357 
358   /* Enable the SC mode by setting the SCEN bit in the CR3 register */
359   hsc->Instance->CR3 |= (USART_CR3_SCEN);
360 
361   /* Initialize the SMARTCARD state*/
362   hsc->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
363   hsc->gState= HAL_SMARTCARD_STATE_READY;
364   hsc->RxState= HAL_SMARTCARD_STATE_READY;
365 
366   return HAL_OK;
367 }
368 
369 /**
370   * @brief DeInitializes the USART SmartCard peripheral
371   * @param  hsc    Pointer to a SMARTCARD_HandleTypeDef structure that contains
372   *                the configuration information for SMARTCARD module.
373   * @retval HAL status
374   */
HAL_SMARTCARD_DeInit(SMARTCARD_HandleTypeDef * hsc)375 HAL_StatusTypeDef HAL_SMARTCARD_DeInit(SMARTCARD_HandleTypeDef *hsc)
376 {
377   /* Check the SMARTCARD handle allocation */
378   if(hsc == NULL)
379   {
380     return HAL_ERROR;
381   }
382 
383   /* Check the parameters */
384   assert_param(IS_SMARTCARD_INSTANCE(hsc->Instance));
385 
386   hsc->gState = HAL_SMARTCARD_STATE_BUSY;
387 
388   /* Disable the Peripheral */
389   __HAL_SMARTCARD_DISABLE(hsc);
390 
391   /* DeInit the low level hardware */
392 #if USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1
393   if (hsc->MspDeInitCallback == NULL)
394   {
395     hsc->MspDeInitCallback = HAL_SMARTCARD_MspDeInit;
396   }
397   /* DeInit the low level hardware */
398   hsc->MspDeInitCallback(hsc);
399 #else
400   HAL_SMARTCARD_MspDeInit(hsc);
401 #endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACKS */
402 
403   hsc->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
404   hsc->gState = HAL_SMARTCARD_STATE_RESET;
405   hsc->RxState = HAL_SMARTCARD_STATE_RESET;
406 
407   /* Release Lock */
408   __HAL_UNLOCK(hsc);
409 
410   return HAL_OK;
411 }
412 
413 /**
414   * @brief  SMARTCARD MSP Init
415   * @param  hsc    Pointer to a SMARTCARD_HandleTypeDef structure that contains
416   *                the configuration information for SMARTCARD module.
417   * @retval None
418   */
HAL_SMARTCARD_MspInit(SMARTCARD_HandleTypeDef * hsc)419 __weak void HAL_SMARTCARD_MspInit(SMARTCARD_HandleTypeDef *hsc)
420 {
421   /* Prevent unused argument(s) compilation warning */
422   UNUSED(hsc);
423 
424   /* NOTE : This function should not be modified, when the callback is needed,
425             the HAL_SMARTCARD_MspInit can be implemented in the user file
426    */
427 }
428 
429 /**
430   * @brief SMARTCARD MSP DeInit
431   * @param  hsc    Pointer to a SMARTCARD_HandleTypeDef structure that contains
432   *                the configuration information for SMARTCARD module.
433   * @retval None
434   */
HAL_SMARTCARD_MspDeInit(SMARTCARD_HandleTypeDef * hsc)435 __weak void HAL_SMARTCARD_MspDeInit(SMARTCARD_HandleTypeDef *hsc)
436 {
437   /* Prevent unused argument(s) compilation warning */
438   UNUSED(hsc);
439 
440   /* NOTE : This function should not be modified, when the callback is needed,
441             the HAL_SMARTCARD_MspDeInit can be implemented in the user file
442    */
443 }
444 
445 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
446 /**
447   * @brief  Register a User SMARTCARD Callback
448   *         To be used instead of the weak predefined callback
449   * @param  hsc smartcard handle
450   * @param  CallbackID ID of the callback to be registered
451   *         This parameter can be one of the following values:
452   *           @arg @ref HAL_SMARTCARD_TX_COMPLETE_CB_ID Tx Complete Callback ID
453   *           @arg @ref HAL_SMARTCARD_RX_COMPLETE_CB_ID Rx Complete Callback ID
454   *           @arg @ref HAL_SMARTCARD_ERROR_CB_ID Error Callback ID
455   *           @arg @ref HAL_SMARTCARD_ABORT_COMPLETE_CB_ID Abort Complete Callback ID
456   *           @arg @ref HAL_SMARTCARD_ABORT_TRANSMIT_COMPLETE_CB_ID Abort Transmit Complete Callback ID
457   *           @arg @ref HAL_SMARTCARD_ABORT_RECEIVE_COMPLETE_CB_ID Abort Receive Complete Callback ID
458   *           @arg @ref HAL_SMARTCARD_MSPINIT_CB_ID MspInit Callback ID
459   *           @arg @ref HAL_SMARTCARD_MSPDEINIT_CB_ID MspDeInit Callback ID
460   * @param  pCallback pointer to the Callback function
461   * @retval HAL status
462   */
HAL_SMARTCARD_RegisterCallback(SMARTCARD_HandleTypeDef * hsc,HAL_SMARTCARD_CallbackIDTypeDef CallbackID,pSMARTCARD_CallbackTypeDef pCallback)463 HAL_StatusTypeDef HAL_SMARTCARD_RegisterCallback(SMARTCARD_HandleTypeDef *hsc, HAL_SMARTCARD_CallbackIDTypeDef CallbackID, pSMARTCARD_CallbackTypeDef pCallback)
464 {
465   HAL_StatusTypeDef status = HAL_OK;
466 
467   if (pCallback == NULL)
468   {
469     /* Update the error code */
470     hsc->ErrorCode |= HAL_SMARTCARD_ERROR_INVALID_CALLBACK;
471 
472     return HAL_ERROR;
473   }
474   /* Process locked */
475   __HAL_LOCK(hsc);
476 
477   if (hsc->gState == HAL_SMARTCARD_STATE_READY)
478   {
479     switch (CallbackID)
480     {
481 
482       case HAL_SMARTCARD_TX_COMPLETE_CB_ID :
483         hsc->TxCpltCallback = pCallback;
484         break;
485 
486       case HAL_SMARTCARD_RX_COMPLETE_CB_ID :
487         hsc->RxCpltCallback = pCallback;
488         break;
489 
490       case HAL_SMARTCARD_ERROR_CB_ID :
491         hsc->ErrorCallback = pCallback;
492         break;
493 
494       case HAL_SMARTCARD_ABORT_COMPLETE_CB_ID :
495         hsc->AbortCpltCallback = pCallback;
496         break;
497 
498       case HAL_SMARTCARD_ABORT_TRANSMIT_COMPLETE_CB_ID :
499         hsc->AbortTransmitCpltCallback = pCallback;
500         break;
501 
502       case HAL_SMARTCARD_ABORT_RECEIVE_COMPLETE_CB_ID :
503         hsc->AbortReceiveCpltCallback = pCallback;
504         break;
505 
506 
507       case HAL_SMARTCARD_MSPINIT_CB_ID :
508         hsc->MspInitCallback = pCallback;
509         break;
510 
511       case HAL_SMARTCARD_MSPDEINIT_CB_ID :
512         hsc->MspDeInitCallback = pCallback;
513         break;
514 
515       default :
516         /* Update the error code */
517         hsc->ErrorCode |= HAL_SMARTCARD_ERROR_INVALID_CALLBACK;
518 
519         /* Return error status */
520         status =  HAL_ERROR;
521         break;
522     }
523   }
524   else if (hsc->gState == HAL_SMARTCARD_STATE_RESET)
525   {
526     switch (CallbackID)
527     {
528       case HAL_SMARTCARD_MSPINIT_CB_ID :
529         hsc->MspInitCallback = pCallback;
530         break;
531 
532       case HAL_SMARTCARD_MSPDEINIT_CB_ID :
533         hsc->MspDeInitCallback = pCallback;
534         break;
535 
536       default :
537         /* Update the error code */
538         hsc->ErrorCode |= HAL_SMARTCARD_ERROR_INVALID_CALLBACK;
539 
540         /* Return error status */
541         status =  HAL_ERROR;
542         break;
543     }
544   }
545   else
546   {
547     /* Update the error code */
548     hsc->ErrorCode |= HAL_SMARTCARD_ERROR_INVALID_CALLBACK;
549 
550     /* Return error status */
551     status =  HAL_ERROR;
552   }
553 
554   /* Release Lock */
555   __HAL_UNLOCK(hsc);
556 
557   return status;
558 }
559 
560 /**
561   * @brief  Unregister an SMARTCARD callback
562   *         SMARTCARD callback is redirected to the weak predefined callback
563   * @param  hsc smartcard handle
564   * @param  CallbackID ID of the callback to be unregistered
565   *         This parameter can be one of the following values:
566   *           @arg @ref HAL_SMARTCARD_TX_COMPLETE_CB_ID Tx Complete Callback ID
567   *           @arg @ref HAL_SMARTCARD_RX_COMPLETE_CB_ID Rx Complete Callback ID
568   *           @arg @ref HAL_SMARTCARD_ERROR_CB_ID Error Callback ID
569   *           @arg @ref HAL_SMARTCARD_ABORT_COMPLETE_CB_ID Abort Complete Callback ID
570   *           @arg @ref HAL_SMARTCARD_ABORT_TRANSMIT_COMPLETE_CB_ID Abort Transmit Complete Callback ID
571   *           @arg @ref HAL_SMARTCARD_ABORT_RECEIVE_COMPLETE_CB_ID Abort Receive Complete Callback ID
572   *           @arg @ref HAL_SMARTCARD_MSPINIT_CB_ID MspInit Callback ID
573   *           @arg @ref HAL_SMARTCARD_MSPDEINIT_CB_ID MspDeInit Callback ID
574   * @retval HAL status
575   */
HAL_SMARTCARD_UnRegisterCallback(SMARTCARD_HandleTypeDef * hsc,HAL_SMARTCARD_CallbackIDTypeDef CallbackID)576 HAL_StatusTypeDef HAL_SMARTCARD_UnRegisterCallback(SMARTCARD_HandleTypeDef *hsc, HAL_SMARTCARD_CallbackIDTypeDef CallbackID)
577 {
578   HAL_StatusTypeDef status = HAL_OK;
579 
580   /* Process locked */
581   __HAL_LOCK(hsc);
582 
583   if (HAL_SMARTCARD_STATE_READY == hsc->gState)
584   {
585     switch (CallbackID)
586     {
587       case HAL_SMARTCARD_TX_COMPLETE_CB_ID :
588         hsc->TxCpltCallback = HAL_SMARTCARD_TxCpltCallback;                       /* Legacy weak TxCpltCallback            */
589         break;
590 
591       case HAL_SMARTCARD_RX_COMPLETE_CB_ID :
592         hsc->RxCpltCallback = HAL_SMARTCARD_RxCpltCallback;                       /* Legacy weak RxCpltCallback            */
593         break;
594 
595       case HAL_SMARTCARD_ERROR_CB_ID :
596         hsc->ErrorCallback = HAL_SMARTCARD_ErrorCallback;                         /* Legacy weak ErrorCallback             */
597         break;
598 
599       case HAL_SMARTCARD_ABORT_COMPLETE_CB_ID :
600         hsc->AbortCpltCallback = HAL_SMARTCARD_AbortCpltCallback;                 /* Legacy weak AbortCpltCallback         */
601         break;
602 
603       case HAL_SMARTCARD_ABORT_TRANSMIT_COMPLETE_CB_ID :
604         hsc->AbortTransmitCpltCallback = HAL_SMARTCARD_AbortTransmitCpltCallback; /* Legacy weak AbortTransmitCpltCallback */
605         break;
606 
607       case HAL_SMARTCARD_ABORT_RECEIVE_COMPLETE_CB_ID :
608         hsc->AbortReceiveCpltCallback = HAL_SMARTCARD_AbortReceiveCpltCallback;   /* Legacy weak AbortReceiveCpltCallback  */
609         break;
610 
611 
612       case HAL_SMARTCARD_MSPINIT_CB_ID :
613         hsc->MspInitCallback = HAL_SMARTCARD_MspInit;                             /* Legacy weak MspInitCallback           */
614         break;
615 
616       case HAL_SMARTCARD_MSPDEINIT_CB_ID :
617         hsc->MspDeInitCallback = HAL_SMARTCARD_MspDeInit;                         /* Legacy weak MspDeInitCallback         */
618         break;
619 
620       default :
621         /* Update the error code */
622         hsc->ErrorCode |= HAL_SMARTCARD_ERROR_INVALID_CALLBACK;
623 
624         /* Return error status */
625         status =  HAL_ERROR;
626         break;
627     }
628   }
629   else if (HAL_SMARTCARD_STATE_RESET == hsc->gState)
630   {
631     switch (CallbackID)
632     {
633       case HAL_SMARTCARD_MSPINIT_CB_ID :
634         hsc->MspInitCallback = HAL_SMARTCARD_MspInit;
635         break;
636 
637       case HAL_SMARTCARD_MSPDEINIT_CB_ID :
638         hsc->MspDeInitCallback = HAL_SMARTCARD_MspDeInit;
639         break;
640 
641       default :
642         /* Update the error code */
643         hsc->ErrorCode |= HAL_SMARTCARD_ERROR_INVALID_CALLBACK;
644 
645         /* Return error status */
646         status =  HAL_ERROR;
647         break;
648     }
649   }
650   else
651   {
652     /* Update the error code */
653     hsc->ErrorCode |= HAL_SMARTCARD_ERROR_INVALID_CALLBACK;
654 
655     /* Return error status */
656     status =  HAL_ERROR;
657   }
658 
659   /* Release Lock */
660   __HAL_UNLOCK(hsc);
661 
662   return status;
663 }
664 #endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACKS */
665 
666 /**
667   * @}
668   */
669 
670 /** @defgroup SMARTCARD_Exported_Functions_Group2 IO operation functions
671   * @brief    SMARTCARD Transmit and Receive functions
672   *
673 @verbatim
674  ===============================================================================
675                       ##### IO operation functions #####
676  ===============================================================================
677  [..]
678    This subsection provides a set of functions allowing to manage the SMARTCARD data transfers.
679 
680  [..]
681     (#) Smartcard is a single wire half duplex communication protocol.
682     The Smartcard interface is designed to support asynchronous protocol Smartcards as
683     defined in the ISO 7816-3 standard.
684     (#) The USART should be configured as:
685        (++) 8 bits plus parity: where M=1 and PCE=1 in the USART_CR1 register
686        (++) 1.5 stop bits when transmitting and receiving: where STOP=11 in the USART_CR2 register.
687 
688     (#) There are two modes of transfer:
689        (++) Blocking mode: The communication is performed in polling mode.
690             The HAL status of all data processing is returned by the same function
691             after finishing transfer.
692        (++) Non Blocking mode: The communication is performed using Interrupts
693            or DMA, These APIs return the HAL status.
694            The end of the data processing will be indicated through the
695            dedicated SMARTCARD IRQ when using Interrupt mode or the DMA IRQ when
696            using DMA mode.
697            The HAL_SMARTCARD_TxCpltCallback(), HAL_SMARTCARD_RxCpltCallback() user callbacks
698            will be executed respectively at the end of the Transmit or Receive process
699            The HAL_SMARTCARD_ErrorCallback() user callback will be executed when a communication error is detected
700 
701     (#) Blocking mode APIs are :
702         (++) HAL_SMARTCARD_Transmit()
703         (++) HAL_SMARTCARD_Receive()
704 
705     (#) Non Blocking mode APIs with Interrupt are :
706         (++) HAL_SMARTCARD_Transmit_IT()
707         (++) HAL_SMARTCARD_Receive_IT()
708         (++) HAL_SMARTCARD_IRQHandler()
709 
710     (#) Non Blocking mode functions with DMA are :
711         (++) HAL_SMARTCARD_Transmit_DMA()
712         (++) HAL_SMARTCARD_Receive_DMA()
713 
714     (#) A set of Transfer Complete Callbacks are provided in non Blocking mode:
715         (++) HAL_SMARTCARD_TxCpltCallback()
716         (++) HAL_SMARTCARD_RxCpltCallback()
717         (++) HAL_SMARTCARD_ErrorCallback()
718 
719     (#) Non-Blocking mode transfers could be aborted using Abort API's :
720         (+) HAL_SMARTCARD_Abort()
721         (+) HAL_SMARTCARD_AbortTransmit()
722         (+) HAL_SMARTCARD_AbortReceive()
723         (+) HAL_SMARTCARD_Abort_IT()
724         (+) HAL_SMARTCARD_AbortTransmit_IT()
725         (+) HAL_SMARTCARD_AbortReceive_IT()
726 
727     (#) For Abort services based on interrupts (HAL_SMARTCARD_Abortxxx_IT), a set of Abort Complete Callbacks are provided:
728         (+) HAL_SMARTCARD_AbortCpltCallback()
729         (+) HAL_SMARTCARD_AbortTransmitCpltCallback()
730         (+) HAL_SMARTCARD_AbortReceiveCpltCallback()
731 
732     (#) In Non-Blocking mode transfers, possible errors are split into 2 categories.
733         Errors are handled as follows :
734        (+) Error is considered as Recoverable and non blocking : Transfer could go till end, but error severity is
735            to be evaluated by user : this concerns Frame Error, Parity Error or Noise Error in Interrupt mode reception .
736            Received character is then retrieved and stored in Rx buffer, Error code is set to allow user to identify error type,
737            and HAL_SMARTCARD_ErrorCallback() user callback is executed. Transfer is kept ongoing on SMARTCARD side.
738            If user wants to abort it, Abort services should be called by user.
739        (+) Error is considered as Blocking : Transfer could not be completed properly and is aborted.
740            This concerns Frame Error in Interrupt mode transmission, Overrun Error in Interrupt mode reception and all errors in DMA mode.
741            Error code is set to allow user to identify error type, and HAL_SMARTCARD_ErrorCallback() user callback is executed.
742 
743 @endverbatim
744   * @{
745   */
746 
747 /**
748   * @brief Send an amount of data in blocking mode
749   * @param  hsc    Pointer to a SMARTCARD_HandleTypeDef structure that contains
750   *                the configuration information for SMARTCARD module.
751   * @param  pData  Pointer to data buffer
752   * @param  Size   Amount of data to be sent
753   * @param  Timeout Timeout duration
754   * @retval HAL status
755   */
HAL_SMARTCARD_Transmit(SMARTCARD_HandleTypeDef * hsc,uint8_t * pData,uint16_t Size,uint32_t Timeout)756 HAL_StatusTypeDef HAL_SMARTCARD_Transmit(SMARTCARD_HandleTypeDef *hsc, uint8_t *pData, uint16_t Size, uint32_t Timeout)
757 {
758   uint8_t *tmp = pData;
759   uint32_t tickstart = 0U;
760 
761   if(hsc->gState == HAL_SMARTCARD_STATE_READY)
762   {
763     if((pData == NULL) || (Size == 0U))
764     {
765       return  HAL_ERROR;
766     }
767 
768     /* Process Locked */
769     __HAL_LOCK(hsc);
770 
771     hsc->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
772     hsc->gState = HAL_SMARTCARD_STATE_BUSY_TX;
773 
774     /* Init tickstart for timeout management */
775     tickstart = HAL_GetTick();
776 
777     hsc->TxXferSize = Size;
778     hsc->TxXferCount = Size;
779     while(hsc->TxXferCount > 0U)
780     {
781       hsc->TxXferCount--;
782       if(SMARTCARD_WaitOnFlagUntilTimeout(hsc, SMARTCARD_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
783       {
784         return HAL_TIMEOUT;
785       }
786       hsc->Instance->DR = (uint8_t)(*tmp & 0xFFU);
787       tmp++;
788     }
789 
790     if(SMARTCARD_WaitOnFlagUntilTimeout(hsc, SMARTCARD_FLAG_TC, RESET, tickstart, Timeout) != HAL_OK)
791     {
792       return HAL_TIMEOUT;
793     }
794 
795 	/* At end of Tx process, restore hsc->gState to Ready */
796     hsc->gState = HAL_SMARTCARD_STATE_READY;
797 
798     /* Process Unlocked */
799     __HAL_UNLOCK(hsc);
800 
801     return HAL_OK;
802   }
803   else
804   {
805     return HAL_BUSY;
806   }
807 }
808 
809 /**
810   * @brief Receive an amount of data in blocking mode
811   * @param  hsc    Pointer to a SMARTCARD_HandleTypeDef structure that contains
812   *                the configuration information for SMARTCARD module.
813   * @param  pData  Pointer to data buffer
814   * @param  Size   Amount of data to be received
815   * @param  Timeout Timeout duration
816   * @retval HAL status
817   */
HAL_SMARTCARD_Receive(SMARTCARD_HandleTypeDef * hsc,uint8_t * pData,uint16_t Size,uint32_t Timeout)818 HAL_StatusTypeDef HAL_SMARTCARD_Receive(SMARTCARD_HandleTypeDef *hsc, uint8_t *pData, uint16_t Size, uint32_t Timeout)
819 {
820   uint8_t  *tmp = pData;
821   uint32_t tickstart = 0U;
822 
823   if(hsc->RxState == HAL_SMARTCARD_STATE_READY)
824   {
825     if((pData == NULL) || (Size == 0U))
826     {
827       return  HAL_ERROR;
828     }
829 
830     /* Process Locked */
831     __HAL_LOCK(hsc);
832 
833     hsc->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
834     hsc->RxState = HAL_SMARTCARD_STATE_BUSY_RX;
835 
836     /* Init tickstart for timeout management */
837     tickstart = HAL_GetTick();
838 
839     hsc->RxXferSize = Size;
840     hsc->RxXferCount = Size;
841 
842     /* Check the remain data to be received */
843     while(hsc->RxXferCount > 0U)
844     {
845       hsc->RxXferCount--;
846       if(SMARTCARD_WaitOnFlagUntilTimeout(hsc, SMARTCARD_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK)
847       {
848         return HAL_TIMEOUT;
849       }
850       *tmp = (uint8_t)(hsc->Instance->DR & (uint8_t)0xFFU);
851       tmp++;
852     }
853 
854     /* At end of Rx process, restore hsc->RxState to Ready */
855     hsc->RxState = HAL_SMARTCARD_STATE_READY;
856 
857     /* Process Unlocked */
858     __HAL_UNLOCK(hsc);
859 
860     return HAL_OK;
861   }
862   else
863   {
864     return HAL_BUSY;
865   }
866 }
867 
868 /**
869   * @brief Send an amount of data in non blocking mode
870   * @param  hsc    Pointer to a SMARTCARD_HandleTypeDef structure that contains
871   *                the configuration information for SMARTCARD module.
872   * @param  pData  Pointer to data buffer
873   * @param  Size   Amount of data to be sent
874   * @retval HAL status
875   */
HAL_SMARTCARD_Transmit_IT(SMARTCARD_HandleTypeDef * hsc,uint8_t * pData,uint16_t Size)876 HAL_StatusTypeDef HAL_SMARTCARD_Transmit_IT(SMARTCARD_HandleTypeDef *hsc, uint8_t *pData, uint16_t Size)
877 {
878   /* Check that a Tx process is not already ongoing */
879   if(hsc->gState == HAL_SMARTCARD_STATE_READY)
880   {
881     if((pData == NULL) || (Size == 0U))
882     {
883       return HAL_ERROR;
884     }
885 
886     /* Process Locked */
887     __HAL_LOCK(hsc);
888 
889     hsc->pTxBuffPtr = pData;
890     hsc->TxXferSize = Size;
891     hsc->TxXferCount = Size;
892 
893     hsc->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
894     hsc->gState = HAL_SMARTCARD_STATE_BUSY_TX;
895 
896     /* Process Unlocked */
897     __HAL_UNLOCK(hsc);
898 
899     /* Enable the SMARTCARD Parity Error Interrupt */
900     SET_BIT(hsc->Instance->CR1, USART_CR1_PEIE);
901 
902     /* Disable the SMARTCARD Error Interrupt: (Frame error, noise error, overrun error) */
903     CLEAR_BIT(hsc->Instance->CR3, USART_CR3_EIE);
904 
905     /* Enable the SMARTCARD Transmit data register empty Interrupt */
906     SET_BIT(hsc->Instance->CR1, USART_CR1_TXEIE);
907 
908     return HAL_OK;
909   }
910   else
911   {
912     return HAL_BUSY;
913   }
914 }
915 
916 /**
917   * @brief Receive an amount of data in non blocking mode
918   * @param  hsc    Pointer to a SMARTCARD_HandleTypeDef structure that contains
919   *                the configuration information for SMARTCARD module.
920   * @param  pData  Pointer to data buffer
921   * @param  Size   Amount of data to be received
922   * @retval HAL status
923   */
HAL_SMARTCARD_Receive_IT(SMARTCARD_HandleTypeDef * hsc,uint8_t * pData,uint16_t Size)924 HAL_StatusTypeDef HAL_SMARTCARD_Receive_IT(SMARTCARD_HandleTypeDef *hsc, uint8_t *pData, uint16_t Size)
925 {
926   /* Check that a Rx process is not already ongoing */
927   if(hsc->RxState == HAL_SMARTCARD_STATE_READY)
928   {
929     if((pData == NULL) || (Size == 0U))
930     {
931       return HAL_ERROR;
932     }
933 
934     /* Process Locked */
935     __HAL_LOCK(hsc);
936 
937     hsc->pRxBuffPtr = pData;
938     hsc->RxXferSize = Size;
939     hsc->RxXferCount = Size;
940 
941     hsc->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
942     hsc->RxState = HAL_SMARTCARD_STATE_BUSY_RX;
943 
944     /* Process Unlocked */
945     __HAL_UNLOCK(hsc);
946 
947     /* Enable the SMARTCARD Parity Error and Data Register not empty Interrupts */
948     SET_BIT(hsc->Instance->CR1, USART_CR1_PEIE| USART_CR1_RXNEIE);
949 
950     /* Enable the SMARTCARD Error Interrupt: (Frame error, noise error, overrun error) */
951     SET_BIT(hsc->Instance->CR3, USART_CR3_EIE);
952 
953     return HAL_OK;
954   }
955   else
956   {
957     return HAL_BUSY;
958   }
959 }
960 
961 /**
962   * @brief Send an amount of data in non blocking mode
963   * @param  hsc    Pointer to a SMARTCARD_HandleTypeDef structure that contains
964   *                the configuration information for SMARTCARD module.
965   * @param  pData  Pointer to data buffer
966   * @param  Size   Amount of data to be sent
967   * @retval HAL status
968   */
HAL_SMARTCARD_Transmit_DMA(SMARTCARD_HandleTypeDef * hsc,uint8_t * pData,uint16_t Size)969 HAL_StatusTypeDef HAL_SMARTCARD_Transmit_DMA(SMARTCARD_HandleTypeDef *hsc, uint8_t *pData, uint16_t Size)
970 {
971   uint32_t *tmp;
972 
973   /* Check that a Tx process is not already ongoing */
974   if(hsc->gState == HAL_SMARTCARD_STATE_READY)
975   {
976     if((pData == NULL) || (Size == 0U))
977     {
978       return HAL_ERROR;
979     }
980 
981     /* Process Locked */
982     __HAL_LOCK(hsc);
983 
984     hsc->pTxBuffPtr = pData;
985     hsc->TxXferSize = Size;
986     hsc->TxXferCount = Size;
987 
988     hsc->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
989     hsc->gState = HAL_SMARTCARD_STATE_BUSY_TX;
990 
991     /* Set the SMARTCARD DMA transfer complete callback */
992     hsc->hdmatx->XferCpltCallback = SMARTCARD_DMATransmitCplt;
993 
994     /* Set the DMA error callback */
995     hsc->hdmatx->XferErrorCallback = SMARTCARD_DMAError;
996 
997     /* Set the DMA abort callback */
998     hsc->hdmatx->XferAbortCallback = NULL;
999 
1000     /* Enable the SMARTCARD transmit DMA channel */
1001     tmp = (uint32_t*)&pData;
1002     HAL_DMA_Start_IT(hsc->hdmatx, *(uint32_t*)tmp, (uint32_t)&hsc->Instance->DR, Size);
1003 
1004      /* Clear the TC flag in the SR register by writing 0 to it */
1005     __HAL_SMARTCARD_CLEAR_FLAG(hsc, SMARTCARD_FLAG_TC);
1006 
1007     /* Process Unlocked */
1008     __HAL_UNLOCK(hsc);
1009 
1010     /* Enable the DMA transfer for transmit request by setting the DMAT bit
1011     in the SMARTCARD CR3 register */
1012     SET_BIT(hsc->Instance->CR3, USART_CR3_DMAT);
1013 
1014     return HAL_OK;
1015   }
1016   else
1017   {
1018     return HAL_BUSY;
1019   }
1020 }
1021 
1022 /**
1023   * @brief Receive an amount of data in non blocking mode
1024   * @param  hsc    Pointer to a SMARTCARD_HandleTypeDef structure that contains
1025   *                the configuration information for SMARTCARD module.
1026   * @param  pData  Pointer to data buffer
1027   * @param  Size   Amount of data to be received
1028   * @note   When the SMARTCARD parity is enabled (PCE = 1) the data received contain the parity bit.s
1029   * @retval HAL status
1030   */
HAL_SMARTCARD_Receive_DMA(SMARTCARD_HandleTypeDef * hsc,uint8_t * pData,uint16_t Size)1031 HAL_StatusTypeDef HAL_SMARTCARD_Receive_DMA(SMARTCARD_HandleTypeDef *hsc, uint8_t *pData, uint16_t Size)
1032 {
1033   uint32_t *tmp;
1034 
1035   /* Check that a Rx process is not already ongoing */
1036   if(hsc->RxState == HAL_SMARTCARD_STATE_READY)
1037   {
1038     if((pData == NULL) || (Size == 0U))
1039     {
1040       return HAL_ERROR;
1041     }
1042 
1043     /* Process Locked */
1044     __HAL_LOCK(hsc);
1045 
1046     hsc->pRxBuffPtr = pData;
1047     hsc->RxXferSize = Size;
1048 
1049     hsc->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
1050     hsc->RxState = HAL_SMARTCARD_STATE_BUSY_RX;
1051 
1052     /* Set the SMARTCARD DMA transfer complete callback */
1053     hsc->hdmarx->XferCpltCallback = SMARTCARD_DMAReceiveCplt;
1054 
1055     /* Set the DMA error callback */
1056     hsc->hdmarx->XferErrorCallback = SMARTCARD_DMAError;
1057 
1058     /* Set the DMA abort callback */
1059     hsc->hdmatx->XferAbortCallback = NULL;
1060 
1061     /* Enable the DMA channel */
1062     tmp = (uint32_t*)&pData;
1063     HAL_DMA_Start_IT(hsc->hdmarx, (uint32_t)&hsc->Instance->DR, *(uint32_t*)tmp, Size);
1064 
1065     /* Clear the Overrun flag just before enabling the DMA Rx request: can be mandatory for the second transfer */
1066     __HAL_SMARTCARD_CLEAR_OREFLAG(hsc);
1067 
1068     /* Process Unlocked */
1069     __HAL_UNLOCK(hsc);
1070 
1071     /* Enable the SMARTCARD Parity Error Interrupt */
1072     SET_BIT(hsc->Instance->CR1, USART_CR1_PEIE);
1073 
1074     /* Enable the SMARTCARD Error Interrupt: (Frame error, noise error, overrun error) */
1075     SET_BIT(hsc->Instance->CR3, USART_CR3_EIE);
1076 
1077     /* Enable the DMA transfer for the receiver request by setting the DMAR bit
1078     in the SMARTCARD CR3 register */
1079     SET_BIT(hsc->Instance->CR3, USART_CR3_DMAR);
1080 
1081     return HAL_OK;
1082   }
1083   else
1084   {
1085     return HAL_BUSY;
1086   }
1087 }
1088 
1089 /**
1090   * @brief  Abort ongoing transfers (blocking mode).
1091   * @param  hsc SMARTCARD handle.
1092   * @note   This procedure could be used for aborting any ongoing transfer started in Interrupt or DMA mode.
1093   *         This procedure performs following operations :
1094   *           - Disable PPP Interrupts
1095   *           - Disable the DMA transfer in the peripheral register (if enabled)
1096   *           - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode)
1097   *           - Set handle State to READY
1098   * @note   This procedure is executed in blocking mode : when exiting function, Abort is considered as completed.
1099   * @retval HAL status
1100 */
HAL_SMARTCARD_Abort(SMARTCARD_HandleTypeDef * hsc)1101 HAL_StatusTypeDef HAL_SMARTCARD_Abort(SMARTCARD_HandleTypeDef *hsc)
1102 {
1103   /* Disable TXEIE, TCIE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
1104   CLEAR_BIT(hsc->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE | USART_CR1_TCIE));
1105   CLEAR_BIT(hsc->Instance->CR3, USART_CR3_EIE);
1106 
1107   /* Disable the SMARTCARD DMA Tx request if enabled */
1108   if(HAL_IS_BIT_SET(hsc->Instance->CR3, USART_CR3_DMAT))
1109   {
1110     CLEAR_BIT(hsc->Instance->CR3, USART_CR3_DMAT);
1111 
1112     /* Abort the SMARTCARD DMA Tx channel : use blocking DMA Abort API (no callback) */
1113     if(hsc->hdmatx != NULL)
1114     {
1115       /* Set the SMARTCARD DMA Abort callback to Null.
1116          No call back execution at end of DMA abort procedure */
1117       hsc->hdmatx->XferAbortCallback = NULL;
1118 
1119       HAL_DMA_Abort(hsc->hdmatx);
1120     }
1121   }
1122 
1123   /* Disable the SMARTCARD DMA Rx request if enabled */
1124   if(HAL_IS_BIT_SET(hsc->Instance->CR3, USART_CR3_DMAR))
1125   {
1126     CLEAR_BIT(hsc->Instance->CR3, USART_CR3_DMAR);
1127 
1128     /* Abort the SMARTCARD DMA Rx channel : use blocking DMA Abort API (no callback) */
1129     if(hsc->hdmarx != NULL)
1130     {
1131       /* Set the SMARTCARD DMA Abort callback to Null.
1132          No call back execution at end of DMA abort procedure */
1133       hsc->hdmarx->XferAbortCallback = NULL;
1134 
1135       HAL_DMA_Abort(hsc->hdmarx);
1136     }
1137   }
1138 
1139   /* Reset Tx and Rx transfer counters */
1140   hsc->TxXferCount = 0x00U;
1141   hsc->RxXferCount = 0x00U;
1142 
1143   /* Reset ErrorCode */
1144   hsc->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
1145 
1146   /* Restore hsc->RxState and hsc->gState to Ready */
1147   hsc->RxState = HAL_SMARTCARD_STATE_READY;
1148   hsc->gState = HAL_SMARTCARD_STATE_READY;
1149 
1150   return HAL_OK;
1151 }
1152 
1153 /**
1154   * @brief  Abort ongoing Transmit transfer (blocking mode).
1155   * @param  hsc SMARTCARD handle.
1156   * @note   This procedure could be used for aborting any ongoing transfer started in Interrupt or DMA mode.
1157   *         This procedure performs following operations :
1158   *           - Disable SMARTCARD Interrupts (Tx)
1159   *           - Disable the DMA transfer in the peripheral register (if enabled)
1160   *           - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode)
1161   *           - Set handle State to READY
1162   * @note   This procedure is executed in blocking mode : when exiting function, Abort is considered as completed.
1163   * @retval HAL status
1164 */
HAL_SMARTCARD_AbortTransmit(SMARTCARD_HandleTypeDef * hsc)1165 HAL_StatusTypeDef HAL_SMARTCARD_AbortTransmit(SMARTCARD_HandleTypeDef *hsc)
1166 {
1167   /* Disable TXEIE and TCIE interrupts */
1168   CLEAR_BIT(hsc->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE));
1169 
1170   /* Disable the SMARTCARD DMA Tx request if enabled */
1171   if(HAL_IS_BIT_SET(hsc->Instance->CR3, USART_CR3_DMAT))
1172   {
1173     CLEAR_BIT(hsc->Instance->CR3, USART_CR3_DMAT);
1174 
1175     /* Abort the SMARTCARD DMA Tx channel : use blocking DMA Abort API (no callback) */
1176     if(hsc->hdmatx != NULL)
1177     {
1178       /* Set the SMARTCARD DMA Abort callback to Null.
1179          No call back execution at end of DMA abort procedure */
1180       hsc->hdmatx->XferAbortCallback = NULL;
1181 
1182       HAL_DMA_Abort(hsc->hdmatx);
1183     }
1184   }
1185 
1186   /* Reset Tx transfer counter */
1187   hsc->TxXferCount = 0x00U;
1188 
1189   /* Restore hsc->gState to Ready */
1190   hsc->gState = HAL_SMARTCARD_STATE_READY;
1191 
1192   return HAL_OK;
1193 }
1194 
1195 /**
1196   * @brief  Abort ongoing Receive transfer (blocking mode).
1197   * @param  hsc SMARTCARD handle.
1198   * @note   This procedure could be used for aborting any ongoing transfer started in Interrupt or DMA mode.
1199   *         This procedure performs following operations :
1200   *           - Disable PPP Interrupts
1201   *           - Disable the DMA transfer in the peripheral register (if enabled)
1202   *           - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode)
1203   *           - Set handle State to READY
1204   * @note   This procedure is executed in blocking mode : when exiting function, Abort is considered as completed.
1205   * @retval HAL status
1206 */
HAL_SMARTCARD_AbortReceive(SMARTCARD_HandleTypeDef * hsc)1207 HAL_StatusTypeDef HAL_SMARTCARD_AbortReceive(SMARTCARD_HandleTypeDef *hsc)
1208 {
1209   /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
1210   CLEAR_BIT(hsc->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
1211   CLEAR_BIT(hsc->Instance->CR3, USART_CR3_EIE);
1212 
1213   /* Disable the SMARTCARD DMA Rx request if enabled */
1214   if(HAL_IS_BIT_SET(hsc->Instance->CR3, USART_CR3_DMAR))
1215   {
1216     CLEAR_BIT(hsc->Instance->CR3, USART_CR3_DMAR);
1217 
1218     /* Abort the SMARTCARD DMA Rx channel : use blocking DMA Abort API (no callback) */
1219     if(hsc->hdmarx != NULL)
1220     {
1221       /* Set the SMARTCARD DMA Abort callback to Null.
1222          No call back execution at end of DMA abort procedure */
1223       hsc->hdmarx->XferAbortCallback = NULL;
1224 
1225       HAL_DMA_Abort(hsc->hdmarx);
1226     }
1227   }
1228 
1229   /* Reset Rx transfer counter */
1230   hsc->RxXferCount = 0x00U;
1231 
1232   /* Restore hsc->RxState to Ready */
1233   hsc->RxState = HAL_SMARTCARD_STATE_READY;
1234 
1235   return HAL_OK;
1236 }
1237 
1238 /**
1239   * @brief  Abort ongoing transfers (Interrupt mode).
1240   * @param  hsc SMARTCARD handle.
1241   * @note   This procedure could be used for aborting any ongoing transfer started in Interrupt or DMA mode.
1242   *         This procedure performs following operations :
1243   *           - Disable PPP Interrupts
1244   *           - Disable the DMA transfer in the peripheral register (if enabled)
1245   *           - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode)
1246   *           - Set handle State to READY
1247   *           - At abort completion, call user abort complete callback
1248   * @note   This procedure is executed in Interrupt mode, meaning that abort procedure could be
1249   *         considered as completed only when user abort complete callback is executed (not when exiting function).
1250   * @retval HAL status
1251 */
HAL_SMARTCARD_Abort_IT(SMARTCARD_HandleTypeDef * hsc)1252 HAL_StatusTypeDef HAL_SMARTCARD_Abort_IT(SMARTCARD_HandleTypeDef *hsc)
1253 {
1254   uint32_t AbortCplt = 0x01U;
1255 
1256   /* Disable TXEIE, TCIE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
1257   CLEAR_BIT(hsc->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE | USART_CR1_TCIE));
1258   CLEAR_BIT(hsc->Instance->CR3, USART_CR3_EIE);
1259 
1260   /* If DMA Tx and/or DMA Rx Handles are associated to SMARTCARD Handle, DMA Abort complete callbacks should be initialised
1261      before any call to DMA Abort functions */
1262   /* DMA Tx Handle is valid */
1263   if(hsc->hdmatx != NULL)
1264   {
1265     /* Set DMA Abort Complete callback if SMARTCARD DMA Tx request if enabled.
1266        Otherwise, set it to NULL */
1267     if(HAL_IS_BIT_SET(hsc->Instance->CR3, USART_CR3_DMAT))
1268     {
1269       hsc->hdmatx->XferAbortCallback = SMARTCARD_DMATxAbortCallback;
1270     }
1271     else
1272     {
1273       hsc->hdmatx->XferAbortCallback = NULL;
1274     }
1275   }
1276   /* DMA Rx Handle is valid */
1277   if(hsc->hdmarx != NULL)
1278   {
1279     /* Set DMA Abort Complete callback if SMARTCARD DMA Rx request if enabled.
1280        Otherwise, set it to NULL */
1281     if(HAL_IS_BIT_SET(hsc->Instance->CR3, USART_CR3_DMAR))
1282     {
1283       hsc->hdmarx->XferAbortCallback = SMARTCARD_DMARxAbortCallback;
1284     }
1285     else
1286     {
1287       hsc->hdmarx->XferAbortCallback = NULL;
1288     }
1289   }
1290 
1291   /* Disable the SMARTCARD DMA Tx request if enabled */
1292   if(HAL_IS_BIT_SET(hsc->Instance->CR3, USART_CR3_DMAT))
1293   {
1294     /* Disable DMA Tx at SMARTCARD level */
1295     CLEAR_BIT(hsc->Instance->CR3, USART_CR3_DMAT);
1296 
1297     /* Abort the SMARTCARD DMA Tx channel : use non blocking DMA Abort API (callback) */
1298     if(hsc->hdmatx != NULL)
1299     {
1300       /* SMARTCARD Tx DMA Abort callback has already been initialised :
1301          will lead to call HAL_SMARTCARD_AbortCpltCallback() at end of DMA abort procedure */
1302 
1303       /* Abort DMA TX */
1304       if(HAL_DMA_Abort_IT(hsc->hdmatx) != HAL_OK)
1305       {
1306         hsc->hdmatx->XferAbortCallback = NULL;
1307       }
1308       else
1309       {
1310         AbortCplt = 0x00U;
1311       }
1312     }
1313   }
1314 
1315   /* Disable the SMARTCARD DMA Rx request if enabled */
1316   if(HAL_IS_BIT_SET(hsc->Instance->CR3, USART_CR3_DMAR))
1317   {
1318     CLEAR_BIT(hsc->Instance->CR3, USART_CR3_DMAR);
1319 
1320     /* Abort the SMARTCARD DMA Rx channel : use non blocking DMA Abort API (callback) */
1321     if(hsc->hdmarx != NULL)
1322     {
1323       /* SMARTCARD Rx DMA Abort callback has already been initialised :
1324          will lead to call HAL_SMARTCARD_AbortCpltCallback() at end of DMA abort procedure */
1325 
1326       /* Abort DMA RX */
1327       if(HAL_DMA_Abort_IT(hsc->hdmarx) != HAL_OK)
1328       {
1329         hsc->hdmarx->XferAbortCallback = NULL;
1330         AbortCplt = 0x01U;
1331       }
1332       else
1333       {
1334         AbortCplt = 0x00U;
1335       }
1336     }
1337   }
1338 
1339   /* if no DMA abort complete callback execution is required => call user Abort Complete callback */
1340   if(AbortCplt == 0x01U)
1341   {
1342     /* Reset Tx and Rx transfer counters */
1343     hsc->TxXferCount = 0x00U;
1344     hsc->RxXferCount = 0x00U;
1345 
1346     /* Reset ErrorCode */
1347     hsc->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
1348 
1349     /* Restore hsc->gState and hsc->RxState to Ready */
1350     hsc->gState  = HAL_SMARTCARD_STATE_READY;
1351     hsc->RxState = HAL_SMARTCARD_STATE_READY;
1352 
1353     /* As no DMA to be aborted, call directly user Abort complete callback */
1354 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
1355     /* Call registered Abort complete callback */
1356     hsc->AbortCpltCallback(hsc);
1357 #else
1358     /* Call legacy weak Abort complete callback */
1359     HAL_SMARTCARD_AbortCpltCallback(hsc);
1360 #endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */
1361   }
1362   return HAL_OK;
1363 }
1364 
1365 /**
1366   * @brief  Abort ongoing Transmit transfer (Interrupt mode).
1367   * @param  hsc SMARTCARD handle.
1368   * @note   This procedure could be used for aborting any ongoing transfer started in Interrupt or DMA mode.
1369   *         This procedure performs following operations :
1370   *           - Disable SMARTCARD Interrupts (Tx)
1371   *           - Disable the DMA transfer in the peripheral register (if enabled)
1372   *           - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode)
1373   *           - Set handle State to READY
1374   *           - At abort completion, call user abort complete callback
1375   * @note   This procedure is executed in Interrupt mode, meaning that abort procedure could be
1376   *         considered as completed only when user abort complete callback is executed (not when exiting function).
1377   * @retval HAL status
1378 */
HAL_SMARTCARD_AbortTransmit_IT(SMARTCARD_HandleTypeDef * hsc)1379 HAL_StatusTypeDef HAL_SMARTCARD_AbortTransmit_IT(SMARTCARD_HandleTypeDef *hsc)
1380 {
1381   /* Disable TXEIE and TCIE interrupts */
1382   CLEAR_BIT(hsc->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE));
1383 
1384   /* Disable the SMARTCARD DMA Tx request if enabled */
1385   if(HAL_IS_BIT_SET(hsc->Instance->CR3, USART_CR3_DMAT))
1386   {
1387     CLEAR_BIT(hsc->Instance->CR3, USART_CR3_DMAT);
1388 
1389     /* Abort the SMARTCARD DMA Tx channel : use blocking DMA Abort API (no callback) */
1390     if(hsc->hdmatx != NULL)
1391     {
1392       /* Set the SMARTCARD DMA Abort callback :
1393          will lead to call HAL_SMARTCARD_AbortCpltCallback() at end of DMA abort procedure */
1394       hsc->hdmatx->XferAbortCallback = SMARTCARD_DMATxOnlyAbortCallback;
1395 
1396       /* Abort DMA TX */
1397       if(HAL_DMA_Abort_IT(hsc->hdmatx) != HAL_OK)
1398       {
1399         /* Call Directly hsc->hdmatx->XferAbortCallback function in case of error */
1400         hsc->hdmatx->XferAbortCallback(hsc->hdmatx);
1401       }
1402     }
1403     else
1404     {
1405       /* Reset Tx transfer counter */
1406       hsc->TxXferCount = 0x00U;
1407 
1408       /* Restore hsc->gState to Ready */
1409       hsc->gState = HAL_SMARTCARD_STATE_READY;
1410 
1411       /* As no DMA to be aborted, call directly user Abort complete callback */
1412 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
1413       /* Call registered Abort Transmit Complete Callback */
1414       hsc->AbortTransmitCpltCallback(hsc);
1415 #else
1416       /* Call legacy weak Abort Transmit Complete Callback */
1417       HAL_SMARTCARD_AbortTransmitCpltCallback(hsc);
1418 #endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */
1419     }
1420   }
1421   else
1422   {
1423     /* Reset Tx transfer counter */
1424     hsc->TxXferCount = 0x00U;
1425 
1426     /* Restore hsc->gState to Ready */
1427     hsc->gState = HAL_SMARTCARD_STATE_READY;
1428 
1429     /* As no DMA to be aborted, call directly user Abort complete callback */
1430 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
1431     /* Call registered Abort Transmit Complete Callback */
1432     hsc->AbortTransmitCpltCallback(hsc);
1433 #else
1434     /* Call legacy weak Abort Transmit Complete Callback */
1435     HAL_SMARTCARD_AbortTransmitCpltCallback(hsc);
1436 #endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */
1437   }
1438 
1439   return HAL_OK;
1440 }
1441 
1442 /**
1443   * @brief  Abort ongoing Receive transfer (Interrupt mode).
1444   * @param  hsc SMARTCARD handle.
1445   * @note   This procedure could be used for aborting any ongoing transfer started in Interrupt or DMA mode.
1446   *         This procedure performs following operations :
1447   *           - Disable SMARTCARD Interrupts (Rx)
1448   *           - Disable the DMA transfer in the peripheral register (if enabled)
1449   *           - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode)
1450   *           - Set handle State to READY
1451   *           - At abort completion, call user abort complete callback
1452   * @note   This procedure is executed in Interrupt mode, meaning that abort procedure could be
1453   *         considered as completed only when user abort complete callback is executed (not when exiting function).
1454   * @retval HAL status
1455 */
HAL_SMARTCARD_AbortReceive_IT(SMARTCARD_HandleTypeDef * hsc)1456 HAL_StatusTypeDef HAL_SMARTCARD_AbortReceive_IT(SMARTCARD_HandleTypeDef *hsc)
1457 {
1458   /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
1459   CLEAR_BIT(hsc->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
1460   CLEAR_BIT(hsc->Instance->CR3, USART_CR3_EIE);
1461 
1462   /* Disable the SMARTCARD DMA Rx request if enabled */
1463   if(HAL_IS_BIT_SET(hsc->Instance->CR3, USART_CR3_DMAR))
1464   {
1465     CLEAR_BIT(hsc->Instance->CR3, USART_CR3_DMAR);
1466 
1467     /* Abort the SMARTCARD DMA Rx channel : use blocking DMA Abort API (no callback) */
1468     if(hsc->hdmarx != NULL)
1469     {
1470       /* Set the SMARTCARD DMA Abort callback :
1471          will lead to call HAL_SMARTCARD_AbortCpltCallback() at end of DMA abort procedure */
1472       hsc->hdmarx->XferAbortCallback = SMARTCARD_DMARxOnlyAbortCallback;
1473 
1474       /* Abort DMA RX */
1475       if(HAL_DMA_Abort_IT(hsc->hdmarx) != HAL_OK)
1476       {
1477         /* Call Directly hsc->hdmarx->XferAbortCallback function in case of error */
1478         hsc->hdmarx->XferAbortCallback(hsc->hdmarx);
1479       }
1480     }
1481     else
1482     {
1483       /* Reset Rx transfer counter */
1484       hsc->RxXferCount = 0x00U;
1485 
1486       /* Restore hsc->RxState to Ready */
1487       hsc->RxState = HAL_SMARTCARD_STATE_READY;
1488 
1489       /* As no DMA to be aborted, call directly user Abort complete callback */
1490 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
1491       /* Call registered Abort Receive Complete Callback */
1492       hsc->AbortReceiveCpltCallback(hsc);
1493 #else
1494       /* Call legacy weak Abort Receive Complete Callback */
1495       HAL_SMARTCARD_AbortReceiveCpltCallback(hsc);
1496 #endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */
1497     }
1498   }
1499   else
1500   {
1501     /* Reset Rx transfer counter */
1502     hsc->RxXferCount = 0x00U;
1503 
1504     /* Restore hsc->RxState to Ready */
1505     hsc->RxState = HAL_SMARTCARD_STATE_READY;
1506 
1507     /* As no DMA to be aborted, call directly user Abort complete callback */
1508 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
1509     /* Call registered Abort Receive Complete Callback */
1510     hsc->AbortReceiveCpltCallback(hsc);
1511 #else
1512     /* Call legacy weak Abort Receive Complete Callback */
1513     HAL_SMARTCARD_AbortReceiveCpltCallback(hsc);
1514 #endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */
1515   }
1516 
1517   return HAL_OK;
1518 }
1519 
1520 /**
1521   * @brief This function handles SMARTCARD interrupt request.
1522   * @param  hsc    Pointer to a SMARTCARD_HandleTypeDef structure that contains
1523   *                the configuration information for SMARTCARD module.
1524   * @retval None
1525   */
HAL_SMARTCARD_IRQHandler(SMARTCARD_HandleTypeDef * hsc)1526 void HAL_SMARTCARD_IRQHandler(SMARTCARD_HandleTypeDef *hsc)
1527 {
1528   uint32_t isrflags   = READ_REG(hsc->Instance->SR);
1529   uint32_t cr1its     = READ_REG(hsc->Instance->CR1);
1530   uint32_t cr3its     = READ_REG(hsc->Instance->CR3);
1531   uint32_t dmarequest = 0x00U;
1532   uint32_t errorflags = 0x00U;
1533 
1534   /* If no error occurs */
1535   errorflags = (isrflags & (uint32_t)(USART_SR_PE | USART_SR_FE | USART_SR_ORE | USART_SR_NE));
1536   if(errorflags == RESET)
1537   {
1538     /* SMARTCARD in mode Receiver -------------------------------------------------*/
1539     if(((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
1540     {
1541       SMARTCARD_Receive_IT(hsc);
1542       return;
1543     }
1544   }
1545 
1546   /* If some errors occur */
1547   if((errorflags != RESET) && (((cr3its & USART_CR3_EIE) != RESET) || ((cr1its & (USART_CR1_RXNEIE | USART_CR1_PEIE)) != RESET)))
1548   {
1549     /* SMARTCARD parity error interrupt occurred ---------------------------*/
1550     if(((isrflags & SMARTCARD_FLAG_PE) != RESET) && ((cr1its & USART_CR1_PEIE) != RESET))
1551     {
1552       hsc->ErrorCode |= HAL_SMARTCARD_ERROR_PE;
1553     }
1554 
1555     /* SMARTCARD frame error interrupt occurred ----------------------------*/
1556     if(((isrflags & SMARTCARD_FLAG_FE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET))
1557     {
1558       hsc->ErrorCode |= HAL_SMARTCARD_ERROR_FE;
1559     }
1560 
1561     /* SMARTCARD noise error interrupt occurred ----------------------------*/
1562     if(((isrflags & SMARTCARD_FLAG_NE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET))
1563     {
1564       hsc->ErrorCode |= HAL_SMARTCARD_ERROR_NE;
1565     }
1566 
1567     /* SMARTCARD Over-Run interrupt occurred -------------------------------*/
1568     if(((isrflags & SMARTCARD_FLAG_ORE) != RESET) && (((cr1its & USART_CR1_RXNEIE) != RESET) || ((cr3its & USART_CR3_EIE) != RESET)))
1569     {
1570       hsc->ErrorCode |= HAL_SMARTCARD_ERROR_ORE;
1571     }
1572     /* Call the Error call Back in case of Errors --------------------------*/
1573     if(hsc->ErrorCode != HAL_SMARTCARD_ERROR_NONE)
1574     {
1575       /* SMARTCARD in mode Receiver ----------------------------------------*/
1576       if(((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
1577       {
1578         SMARTCARD_Receive_IT(hsc);
1579       }
1580 
1581       /* If Overrun error occurs, or if any error occurs in DMA mode reception,
1582          consider error as blocking */
1583       dmarequest = HAL_IS_BIT_SET(hsc->Instance->CR3, USART_CR3_DMAR);
1584       if(((hsc->ErrorCode & HAL_SMARTCARD_ERROR_ORE) != RESET) || dmarequest)
1585       {
1586         /* Blocking error : transfer is aborted
1587           Set the SMARTCARD state ready to be able to start again the process,
1588           Disable Rx Interrupts, and disable Rx DMA request, if ongoing */
1589         SMARTCARD_EndRxTransfer(hsc);
1590         /* Disable the SMARTCARD DMA Rx request if enabled */
1591         if(HAL_IS_BIT_SET(hsc->Instance->CR3, USART_CR3_DMAR))
1592         {
1593           CLEAR_BIT(hsc->Instance->CR3, USART_CR3_DMAR);
1594 
1595           /* Abort the SMARTCARD DMA Rx channel */
1596           if(hsc->hdmarx != NULL)
1597           {
1598             /* Set the SMARTCARD DMA Abort callback :
1599               will lead to call HAL_SMARTCARD_ErrorCallback() at end of DMA abort procedure */
1600             hsc->hdmarx->XferAbortCallback = SMARTCARD_DMAAbortOnError;
1601 
1602            if(HAL_DMA_Abort_IT(hsc->hdmarx) != HAL_OK)
1603             {
1604               /* Call Directly XferAbortCallback function in case of error */
1605               hsc->hdmarx->XferAbortCallback(hsc->hdmarx);
1606             }
1607           }
1608           else
1609           {
1610 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
1611             /* Call registered user error callback */
1612             hsc->ErrorCallback(hsc);
1613 #else
1614             /* Call legacy weak user error callback */
1615             HAL_SMARTCARD_ErrorCallback(hsc);
1616 #endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */
1617           }
1618         }
1619         else
1620         {
1621 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
1622           /* Call registered user error callback */
1623           hsc->ErrorCallback(hsc);
1624 #else
1625           /* Call legacy weak user error callback */
1626           HAL_SMARTCARD_ErrorCallback(hsc);
1627 #endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */
1628         }
1629       }
1630       else
1631       {
1632         /* Non Blocking error : transfer could go on.
1633            Error is notified to user through user error callback */
1634 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
1635         /* Call registered user error callback */
1636         hsc->ErrorCallback(hsc);
1637 #else
1638         /* Call legacy weak user error callback */
1639         HAL_SMARTCARD_ErrorCallback(hsc);
1640 #endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */
1641         hsc->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
1642       }
1643     }
1644     return;
1645   } /* End if some error occurs */
1646 
1647   /* SMARTCARD in mode Transmitter ------------------------------------------*/
1648   if(((isrflags & SMARTCARD_FLAG_TXE) != RESET) && ((cr1its & USART_CR1_TXEIE) != RESET))
1649   {
1650     SMARTCARD_Transmit_IT(hsc);
1651     return;
1652   }
1653 
1654   /* SMARTCARD in mode Transmitter (transmission end) -----------------------*/
1655   if(((isrflags & SMARTCARD_FLAG_TC) != RESET) && ((cr1its & USART_CR1_TCIE) != RESET))
1656   {
1657     SMARTCARD_EndTransmit_IT(hsc);
1658     return;
1659   }
1660 }
1661 
1662 /**
1663   * @brief Tx Transfer completed callbacks
1664   * @param  hsc    Pointer to a SMARTCARD_HandleTypeDef structure that contains
1665   *                the configuration information for SMARTCARD module.
1666   * @retval None
1667   */
HAL_SMARTCARD_TxCpltCallback(SMARTCARD_HandleTypeDef * hsc)1668 __weak void HAL_SMARTCARD_TxCpltCallback(SMARTCARD_HandleTypeDef *hsc)
1669 {
1670   /* Prevent unused argument(s) compilation warning */
1671   UNUSED(hsc);
1672 
1673   /* NOTE : This function should not be modified, when the callback is needed,
1674             the HAL_SMARTCARD_TxCpltCallback can be implemented in the user file.
1675    */
1676 }
1677 
1678 /**
1679   * @brief Rx Transfer completed callback
1680   * @param  hsc    Pointer to a SMARTCARD_HandleTypeDef structure that contains
1681   *                the configuration information for SMARTCARD module.
1682   * @retval None
1683   */
HAL_SMARTCARD_RxCpltCallback(SMARTCARD_HandleTypeDef * hsc)1684 __weak void HAL_SMARTCARD_RxCpltCallback(SMARTCARD_HandleTypeDef *hsc)
1685 {
1686   /* Prevent unused argument(s) compilation warning */
1687   UNUSED(hsc);
1688 
1689   /* NOTE : This function should not be modified, when the callback is needed,
1690             the HAL_SMARTCARD_RxCpltCallback can be implemented in the user file.
1691    */
1692 }
1693 
1694 /**
1695   * @brief SMARTCARD error callback
1696   * @param  hsc    Pointer to a SMARTCARD_HandleTypeDef structure that contains
1697   *                the configuration information for SMARTCARD module.
1698   * @retval None
1699   */
HAL_SMARTCARD_ErrorCallback(SMARTCARD_HandleTypeDef * hsc)1700 __weak void HAL_SMARTCARD_ErrorCallback(SMARTCARD_HandleTypeDef *hsc)
1701 {
1702   /* Prevent unused argument(s) compilation warning */
1703   UNUSED(hsc);
1704 
1705   /* NOTE : This function should not be modified, when the callback is needed,
1706             the HAL_SMARTCARD_ErrorCallback can be implemented in the user file.
1707    */
1708 }
1709 
1710 /**
1711   * @brief  SMARTCARD Abort Complete callback.
1712   * @param  hsc SMARTCARD handle.
1713   * @retval None
1714   */
HAL_SMARTCARD_AbortCpltCallback(SMARTCARD_HandleTypeDef * hsc)1715 __weak void HAL_SMARTCARD_AbortCpltCallback (SMARTCARD_HandleTypeDef *hsc)
1716 {
1717   /* Prevent unused argument(s) compilation warning */
1718   UNUSED(hsc);
1719 
1720   /* NOTE : This function should not be modified, when the callback is needed,
1721             the HAL_SMARTCARD_AbortCpltCallback can be implemented in the user file.
1722    */
1723 }
1724 
1725 /**
1726   * @brief  SMARTCARD Abort Transmit Complete callback.
1727   * @param  hsc SMARTCARD handle.
1728   * @retval None
1729   */
HAL_SMARTCARD_AbortTransmitCpltCallback(SMARTCARD_HandleTypeDef * hsc)1730 __weak void HAL_SMARTCARD_AbortTransmitCpltCallback (SMARTCARD_HandleTypeDef *hsc)
1731 {
1732     /* Prevent unused argument(s) compilation warning */
1733     UNUSED(hsc);
1734 
1735   /* NOTE : This function should not be modified, when the callback is needed,
1736             the HAL_SMARTCARD_AbortTransmitCpltCallback can be implemented in the user file.
1737    */
1738 }
1739 
1740 /**
1741   * @brief  SMARTCARD Abort Receive Complete callback.
1742   * @param  hsc SMARTCARD handle.
1743   * @retval None
1744   */
HAL_SMARTCARD_AbortReceiveCpltCallback(SMARTCARD_HandleTypeDef * hsc)1745 __weak void HAL_SMARTCARD_AbortReceiveCpltCallback (SMARTCARD_HandleTypeDef *hsc)
1746 {
1747     /* Prevent unused argument(s) compilation warning */
1748     UNUSED(hsc);
1749 
1750   /* NOTE : This function should not be modified, when the callback is needed,
1751             the HAL_SMARTCARD_AbortReceiveCpltCallback can be implemented in the user file.
1752    */
1753 }
1754 
1755 /**
1756   * @}
1757   */
1758 
1759 /** @defgroup SMARTCARD_Exported_Functions_Group3 Peripheral State and Errors functions
1760   *  @brief   SMARTCARD State and Errors functions
1761   *
1762 @verbatim
1763  ===============================================================================
1764                 ##### Peripheral State and Errors functions #####
1765  ===============================================================================
1766     [..]
1767     This subsection provides a set of functions allowing to control the SmartCard.
1768      (+) HAL_SMARTCARD_GetState() API can be helpful to check in run-time the state of the SmartCard peripheral.
1769      (+) HAL_SMARTCARD_GetError() check in run-time errors that could be occurred during communication.
1770 @endverbatim
1771   * @{
1772   */
1773 
1774 /**
1775   * @brief Return the SMARTCARD handle state
1776   * @param  hsc    Pointer to a SMARTCARD_HandleTypeDef structure that contains
1777   *                the configuration information for SMARTCARD module.
1778   * @retval HAL state
1779   */
HAL_SMARTCARD_GetState(SMARTCARD_HandleTypeDef * hsc)1780 HAL_SMARTCARD_StateTypeDef HAL_SMARTCARD_GetState(SMARTCARD_HandleTypeDef *hsc)
1781 {
1782   uint32_t temp1= 0x00U, temp2 = 0x00U;
1783   temp1 = hsc->gState;
1784   temp2 = hsc->RxState;
1785 
1786   return (HAL_SMARTCARD_StateTypeDef)(temp1 | temp2);
1787 }
1788 
1789 /**
1790   * @brief  Return the SMARTCARD error code
1791   * @param  hsc  Pointer to a SMARTCARD_HandleTypeDef structure that contains
1792   *              the configuration information for the specified SMARTCARD.
1793   * @retval SMARTCARD Error Code
1794   */
HAL_SMARTCARD_GetError(SMARTCARD_HandleTypeDef * hsc)1795 uint32_t HAL_SMARTCARD_GetError(SMARTCARD_HandleTypeDef *hsc)
1796 {
1797   return hsc->ErrorCode;
1798 }
1799 
1800 /**
1801   * @}
1802   */
1803 
1804 /**
1805   * @}
1806   */
1807 
1808 /** @defgroup SMARTCARD_Private_Functions SMARTCARD Private Functions
1809   * @{
1810   */
1811 
1812 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
1813 /**
1814   * @brief  Initialize the callbacks to their default values.
1815   * @param  hsc SMARTCARD handle.
1816   * @retval none
1817   */
SMARTCARD_InitCallbacksToDefault(SMARTCARD_HandleTypeDef * hsc)1818 void SMARTCARD_InitCallbacksToDefault(SMARTCARD_HandleTypeDef *hsc)
1819 {
1820   /* Init the SMARTCARD Callback settings */
1821   hsc->TxCpltCallback            = HAL_SMARTCARD_TxCpltCallback;            /* Legacy weak TxCpltCallback            */
1822   hsc->RxCpltCallback            = HAL_SMARTCARD_RxCpltCallback;            /* Legacy weak RxCpltCallback            */
1823   hsc->ErrorCallback             = HAL_SMARTCARD_ErrorCallback;             /* Legacy weak ErrorCallback             */
1824   hsc->AbortCpltCallback         = HAL_SMARTCARD_AbortCpltCallback;         /* Legacy weak AbortCpltCallback         */
1825   hsc->AbortTransmitCpltCallback = HAL_SMARTCARD_AbortTransmitCpltCallback; /* Legacy weak AbortTransmitCpltCallback */
1826   hsc->AbortReceiveCpltCallback  = HAL_SMARTCARD_AbortReceiveCpltCallback;  /* Legacy weak AbortReceiveCpltCallback  */
1827 
1828 }
1829 #endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACKS */
1830 
1831 /**
1832   * @brief DMA SMARTCARD transmit process complete callback
1833   * @param  hdma   Pointer to a DMA_HandleTypeDef structure that contains
1834   *                the configuration information for the specified DMA module.
1835   * @retval None
1836   */
SMARTCARD_DMATransmitCplt(DMA_HandleTypeDef * hdma)1837 static void SMARTCARD_DMATransmitCplt(DMA_HandleTypeDef *hdma)
1838 {
1839   SMARTCARD_HandleTypeDef* hsc = ( SMARTCARD_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
1840 
1841   hsc->TxXferCount = 0U;
1842 
1843   /* Disable the DMA transfer for transmit request by setting the DMAT bit
1844      in the USART CR3 register */
1845   CLEAR_BIT(hsc->Instance->CR3, USART_CR3_DMAT);
1846 
1847   /* Enable the SMARTCARD Transmit Complete Interrupt */
1848   SET_BIT(hsc->Instance->CR1, USART_CR1_TCIE);
1849 }
1850 
1851 /**
1852   * @brief DMA SMARTCARD receive process complete callback
1853   * @param  hdma   Pointer to a DMA_HandleTypeDef structure that contains
1854   *                the configuration information for the specified DMA module.
1855   * @retval None
1856   */
SMARTCARD_DMAReceiveCplt(DMA_HandleTypeDef * hdma)1857 static void SMARTCARD_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
1858 {
1859   SMARTCARD_HandleTypeDef* hsc = ( SMARTCARD_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
1860 
1861   hsc->RxXferCount = 0U;
1862 
1863   /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
1864   CLEAR_BIT(hsc->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
1865   CLEAR_BIT(hsc->Instance->CR3, USART_CR3_EIE);
1866 
1867   /* Disable the DMA transfer for the receiver request by setting the DMAR bit
1868      in the USART CR3 register */
1869   CLEAR_BIT(hsc->Instance->CR3, USART_CR3_DMAR);
1870 
1871   /* At end of Rx process, restore hsc->RxState to Ready */
1872   hsc->RxState = HAL_SMARTCARD_STATE_READY;
1873 
1874 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
1875   /* Call registered Rx complete callback */
1876   hsc->RxCpltCallback(hsc);
1877 #else
1878   /* Call legacy weak Rx complete callback */
1879   HAL_SMARTCARD_RxCpltCallback(hsc);
1880 #endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */
1881 }
1882 
1883 /**
1884   * @brief DMA SMARTCARD communication error callback
1885   * @param  hdma   Pointer to a DMA_HandleTypeDef structure that contains
1886   *                the configuration information for the specified DMA module.
1887   * @retval None
1888   */
SMARTCARD_DMAError(DMA_HandleTypeDef * hdma)1889 static void SMARTCARD_DMAError(DMA_HandleTypeDef *hdma)
1890 {
1891   uint32_t dmarequest = 0x00U;
1892   SMARTCARD_HandleTypeDef* hsc = ( SMARTCARD_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
1893   hsc->RxXferCount = 0U;
1894   hsc->TxXferCount = 0U;
1895   hsc->ErrorCode = HAL_SMARTCARD_ERROR_DMA;
1896 
1897   /* Stop SMARTCARD DMA Tx request if ongoing */
1898   dmarequest = HAL_IS_BIT_SET(hsc->Instance->CR3, USART_CR3_DMAT);
1899   if((hsc->gState == HAL_SMARTCARD_STATE_BUSY_TX) && dmarequest)
1900   {
1901     SMARTCARD_EndTxTransfer(hsc);
1902   }
1903 
1904   /* Stop SMARTCARD DMA Rx request if ongoing */
1905   dmarequest = HAL_IS_BIT_SET(hsc->Instance->CR3, USART_CR3_DMAR);
1906   if((hsc->RxState == HAL_SMARTCARD_STATE_BUSY_RX) && dmarequest)
1907   {
1908     SMARTCARD_EndRxTransfer(hsc);
1909   }
1910 
1911 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
1912   /* Call registered user error callback */
1913   hsc->ErrorCallback(hsc);
1914 #else
1915   /* Call legacy weak user error callback */
1916   HAL_SMARTCARD_ErrorCallback(hsc);
1917 #endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */
1918 }
1919 
1920 /**
1921   * @brief  This function handles SMARTCARD Communication Timeout.
1922   * @param  hsc    Pointer to a SMARTCARD_HandleTypeDef structure that contains
1923   *                the configuration information for SMARTCARD module.
1924   * @param  Flag   Specifies the SMARTCARD flag to check.
1925   * @param  Status The new Flag status (SET or RESET).
1926   * @param  Timeout Timeout duration
1927   * @param  Tickstart Tick start value
1928   * @retval HAL status
1929   */
SMARTCARD_WaitOnFlagUntilTimeout(SMARTCARD_HandleTypeDef * hsc,uint32_t Flag,FlagStatus Status,uint32_t Tickstart,uint32_t Timeout)1930 static HAL_StatusTypeDef SMARTCARD_WaitOnFlagUntilTimeout(SMARTCARD_HandleTypeDef *hsc, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout)
1931 {
1932   /* Wait until flag is set */
1933   while((__HAL_SMARTCARD_GET_FLAG(hsc, Flag) ? SET : RESET) == Status)
1934   {
1935     /* Check for the Timeout */
1936     if(Timeout != HAL_MAX_DELAY)
1937     {
1938       if((Timeout == 0U)||((HAL_GetTick() - Tickstart ) > Timeout))
1939       {
1940         /* Disable TXE and RXNE interrupts for the interrupt process */
1941         CLEAR_BIT(hsc->Instance->CR1, USART_CR1_TXEIE);
1942         CLEAR_BIT(hsc->Instance->CR1, USART_CR1_RXNEIE);
1943 
1944         hsc->gState= HAL_SMARTCARD_STATE_READY;
1945         hsc->RxState= HAL_SMARTCARD_STATE_READY;
1946 
1947         /* Process Unlocked */
1948         __HAL_UNLOCK(hsc);
1949 
1950         return HAL_TIMEOUT;
1951       }
1952     }
1953   }
1954   return HAL_OK;
1955 }
1956 
1957 /**
1958   * @brief  End ongoing Tx transfer on SMARTCARD peripheral (following error detection or Transmit completion).
1959   * @param  hsc    Pointer to a SMARTCARD_HandleTypeDef structure that contains
1960   *                the configuration information for SMARTCARD module.
1961   * @retval None
1962   */
SMARTCARD_EndTxTransfer(SMARTCARD_HandleTypeDef * hsc)1963 static void SMARTCARD_EndTxTransfer(SMARTCARD_HandleTypeDef *hsc)
1964 {
1965   /* At end of Tx process, restore hsc->gState to Ready */
1966   hsc->gState = HAL_SMARTCARD_STATE_READY;
1967 
1968   /* Disable TXEIE and TCIE interrupts */
1969   CLEAR_BIT(hsc->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE));
1970 }
1971 
1972 
1973 /**
1974   * @brief  End ongoing Rx transfer on SMARTCARD peripheral (following error detection or Reception completion).
1975   * @param  hsc    Pointer to a SMARTCARD_HandleTypeDef structure that contains
1976   *                the configuration information for SMARTCARD module.
1977   * @retval None
1978   */
SMARTCARD_EndRxTransfer(SMARTCARD_HandleTypeDef * hsc)1979 static void SMARTCARD_EndRxTransfer(SMARTCARD_HandleTypeDef *hsc)
1980 {
1981   /* At end of Rx process, restore hsc->RxState to Ready */
1982   hsc->RxState = HAL_SMARTCARD_STATE_READY;
1983 
1984   /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
1985   CLEAR_BIT(hsc->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
1986   CLEAR_BIT(hsc->Instance->CR3, USART_CR3_EIE);
1987 }
1988 
1989 /**
1990   * @brief Send an amount of data in non blocking mode
1991   * @param  hsc    Pointer to a SMARTCARD_HandleTypeDef structure that contains
1992   *                the configuration information for SMARTCARD module.
1993   * @retval HAL status
1994   */
SMARTCARD_Transmit_IT(SMARTCARD_HandleTypeDef * hsc)1995 static HAL_StatusTypeDef SMARTCARD_Transmit_IT(SMARTCARD_HandleTypeDef *hsc)
1996 {
1997 
1998   /* Check that a Tx process is ongoing */
1999   if(hsc->gState == HAL_SMARTCARD_STATE_BUSY_TX)
2000   {
2001     hsc->Instance->DR = (uint8_t)(*hsc->pTxBuffPtr & 0xFFU);
2002     hsc->pTxBuffPtr++;
2003 
2004     if(--hsc->TxXferCount == 0U)
2005     {
2006       /* Disable the SMARTCARD Transmit data register empty Interrupt */
2007       CLEAR_BIT(hsc->Instance->CR1, USART_CR1_TXEIE);
2008 
2009       /* Enable the SMARTCARD Transmit Complete Interrupt */
2010       SET_BIT(hsc->Instance->CR1, USART_CR1_TCIE);
2011     }
2012 
2013     return HAL_OK;
2014   }
2015   else
2016   {
2017     return HAL_BUSY;
2018   }
2019 }
2020 
2021 /**
2022   * @brief  Wraps up transmission in non blocking mode.
2023   * @param  hsc    Pointer to a SMARTCARD_HandleTypeDef structure that contains
2024   *                the configuration information for the specified SMARTCARD module.
2025   * @retval HAL status
2026   */
SMARTCARD_EndTransmit_IT(SMARTCARD_HandleTypeDef * hsc)2027 static HAL_StatusTypeDef SMARTCARD_EndTransmit_IT(SMARTCARD_HandleTypeDef *hsc)
2028 {
2029   /* Disable the SMARTCARD Transmit Complete Interrupt */
2030   CLEAR_BIT(hsc->Instance->CR1, USART_CR1_TCIE);
2031 
2032   /* Disable the SMARTCARD Error Interrupt: (Frame error, noise error, overrun error) */
2033   CLEAR_BIT(hsc->Instance->CR3, USART_CR3_EIE);
2034 
2035   /* Tx process is ended, restore hsc->gState to Ready */
2036   hsc->gState = HAL_SMARTCARD_STATE_READY;
2037 
2038 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
2039   /* Call registered Tx complete callback */
2040   hsc->TxCpltCallback(hsc);
2041 #else
2042   /* Call legacy weak Tx complete callback */
2043   HAL_SMARTCARD_TxCpltCallback(hsc);
2044 #endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */
2045 
2046   return HAL_OK;
2047 }
2048 
2049 /**
2050   * @brief Receive an amount of data in non blocking mode
2051   * @param  hsc    Pointer to a SMARTCARD_HandleTypeDef structure that contains
2052   *                the configuration information for SMARTCARD module.
2053   * @retval HAL status
2054   */
SMARTCARD_Receive_IT(SMARTCARD_HandleTypeDef * hsc)2055 static HAL_StatusTypeDef SMARTCARD_Receive_IT(SMARTCARD_HandleTypeDef *hsc)
2056 {
2057 
2058   /* Check that a Rx process is ongoing */
2059   if(hsc->RxState == HAL_SMARTCARD_STATE_BUSY_RX)
2060   {
2061     *hsc->pRxBuffPtr = (uint8_t)(hsc->Instance->DR & (uint8_t)0xFFU);
2062     hsc->pRxBuffPtr++;
2063 
2064     if(--hsc->RxXferCount == 0U)
2065     {
2066       CLEAR_BIT(hsc->Instance->CR1, USART_CR1_RXNEIE);
2067 
2068       /* Disable the SMARTCARD Parity Error Interrupt */
2069       CLEAR_BIT(hsc->Instance->CR1, USART_CR1_PEIE);
2070 
2071       /* Disable the SMARTCARD Error Interrupt: (Frame error, noise error, overrun error) */
2072       CLEAR_BIT(hsc->Instance->CR3, USART_CR3_EIE);
2073 
2074       /* Rx process is completed, restore hsc->RxState to Ready */
2075       hsc->RxState = HAL_SMARTCARD_STATE_READY;
2076 
2077 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
2078       /* Call registered Rx complete callback */
2079       hsc->RxCpltCallback(hsc);
2080 #else
2081       /* Call legacy weak Rx complete callback */
2082       HAL_SMARTCARD_RxCpltCallback(hsc);
2083 #endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */
2084 
2085       return HAL_OK;
2086     }
2087     return HAL_OK;
2088   }
2089   else
2090   {
2091     return HAL_BUSY;
2092   }
2093 }
2094 
2095 /**
2096   * @brief  DMA SMARTCARD communication abort callback, when initiated by HAL services on Error
2097   *         (To be called at end of DMA Abort procedure following error occurrence).
2098   * @param  hdma DMA handle.
2099   * @retval None
2100   */
SMARTCARD_DMAAbortOnError(DMA_HandleTypeDef * hdma)2101 static void SMARTCARD_DMAAbortOnError(DMA_HandleTypeDef *hdma)
2102 {
2103   SMARTCARD_HandleTypeDef* hsc = (SMARTCARD_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
2104   hsc->RxXferCount = 0x00U;
2105   hsc->TxXferCount = 0x00U;
2106 
2107 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
2108   /* Call registered user error callback */
2109   hsc->ErrorCallback(hsc);
2110 #else
2111   /* Call legacy weak user error callback */
2112   HAL_SMARTCARD_ErrorCallback(hsc);
2113 #endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */
2114 }
2115 
2116 /**
2117   * @brief  DMA SMARTCARD Tx communication abort callback, when initiated by user
2118   *         (To be called at end of DMA Tx Abort procedure following user abort request).
2119   * @note   When this callback is executed, User Abort complete call back is called only if no
2120   *         Abort still ongoing for Rx DMA Handle.
2121   * @param  hdma DMA handle.
2122   * @retval None
2123   */
SMARTCARD_DMATxAbortCallback(DMA_HandleTypeDef * hdma)2124 static void SMARTCARD_DMATxAbortCallback(DMA_HandleTypeDef *hdma)
2125 {
2126   SMARTCARD_HandleTypeDef* hsc = ( SMARTCARD_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
2127 
2128   hsc->hdmatx->XferAbortCallback = NULL;
2129 
2130   /* Check if an Abort process is still ongoing */
2131   if(hsc->hdmarx != NULL)
2132   {
2133     if(hsc->hdmarx->XferAbortCallback != NULL)
2134     {
2135       return;
2136     }
2137   }
2138 
2139   /* No Abort process still ongoing : All DMA channels are aborted, call user Abort Complete callback */
2140   hsc->TxXferCount = 0x00U;
2141   hsc->RxXferCount = 0x00U;
2142 
2143   /* Reset ErrorCode */
2144   hsc->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
2145 
2146   /* Restore hsc->gState and hsc->RxState to Ready */
2147   hsc->gState  = HAL_SMARTCARD_STATE_READY;
2148   hsc->RxState = HAL_SMARTCARD_STATE_READY;
2149 
2150 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
2151   /* Call registered Abort complete callback */
2152   hsc->AbortCpltCallback(hsc);
2153 #else
2154   /* Call legacy weak Abort complete callback */
2155   HAL_SMARTCARD_AbortCpltCallback(hsc);
2156 #endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */
2157 }
2158 
2159 /**
2160   * @brief  DMA SMARTCARD Rx communication abort callback, when initiated by user
2161   *         (To be called at end of DMA Rx Abort procedure following user abort request).
2162   * @note   When this callback is executed, User Abort complete call back is called only if no
2163   *         Abort still ongoing for Tx DMA Handle.
2164   * @param  hdma DMA handle.
2165   * @retval None
2166   */
SMARTCARD_DMARxAbortCallback(DMA_HandleTypeDef * hdma)2167 static void SMARTCARD_DMARxAbortCallback(DMA_HandleTypeDef *hdma)
2168 {
2169   SMARTCARD_HandleTypeDef* hsc = ( SMARTCARD_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
2170 
2171   hsc->hdmarx->XferAbortCallback = NULL;
2172 
2173   /* Check if an Abort process is still ongoing */
2174   if(hsc->hdmatx != NULL)
2175   {
2176     if(hsc->hdmatx->XferAbortCallback != NULL)
2177     {
2178       return;
2179     }
2180   }
2181 
2182   /* No Abort process still ongoing : All DMA channels are aborted, call user Abort Complete callback */
2183   hsc->TxXferCount = 0x00U;
2184   hsc->RxXferCount = 0x00U;
2185 
2186   /* Reset ErrorCode */
2187   hsc->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
2188 
2189   /* Restore hsc->gState and hsc->RxState to Ready */
2190   hsc->gState  = HAL_SMARTCARD_STATE_READY;
2191   hsc->RxState = HAL_SMARTCARD_STATE_READY;
2192 
2193 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
2194   /* Call registered Abort complete callback */
2195   hsc->AbortCpltCallback(hsc);
2196 #else
2197   /* Call legacy weak Abort complete callback */
2198   HAL_SMARTCARD_AbortCpltCallback(hsc);
2199 #endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */
2200 }
2201 
2202 /**
2203   * @brief  DMA SMARTCARD Tx communication abort callback, when initiated by user by a call to
2204   *         HAL_SMARTCARD_AbortTransmit_IT API (Abort only Tx transfer)
2205   *         (This callback is executed at end of DMA Tx Abort procedure following user abort request,
2206   *         and leads to user Tx Abort Complete callback execution).
2207   * @param  hdma DMA handle.
2208   * @retval None
2209   */
SMARTCARD_DMATxOnlyAbortCallback(DMA_HandleTypeDef * hdma)2210 static void SMARTCARD_DMATxOnlyAbortCallback(DMA_HandleTypeDef *hdma)
2211 {
2212   SMARTCARD_HandleTypeDef* hsc = ( SMARTCARD_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
2213 
2214   hsc->TxXferCount = 0x00U;
2215 
2216   /* Restore hsc->gState to Ready */
2217   hsc->gState = HAL_SMARTCARD_STATE_READY;
2218 
2219 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
2220   /* Call registered Abort Transmit Complete Callback */
2221   hsc->AbortTransmitCpltCallback(hsc);
2222 #else
2223   /* Call legacy weak Abort Transmit Complete Callback */
2224   HAL_SMARTCARD_AbortTransmitCpltCallback(hsc);
2225 #endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */
2226 }
2227 
2228 /**
2229   * @brief  DMA SMARTCARD Rx communication abort callback, when initiated by user by a call to
2230   *         HAL_SMARTCARD_AbortReceive_IT API (Abort only Rx transfer)
2231   *         (This callback is executed at end of DMA Rx Abort procedure following user abort request,
2232   *         and leads to user Rx Abort Complete callback execution).
2233   * @param  hdma DMA handle.
2234   * @retval None
2235   */
SMARTCARD_DMARxOnlyAbortCallback(DMA_HandleTypeDef * hdma)2236 static void SMARTCARD_DMARxOnlyAbortCallback(DMA_HandleTypeDef *hdma)
2237 {
2238   SMARTCARD_HandleTypeDef* hsc = ( SMARTCARD_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
2239 
2240   hsc->RxXferCount = 0x00U;
2241 
2242   /* Restore hsc->RxState to Ready */
2243   hsc->RxState = HAL_SMARTCARD_STATE_READY;
2244 
2245 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
2246   /* Call registered Abort Receive Complete Callback */
2247   hsc->AbortReceiveCpltCallback(hsc);
2248 #else
2249   /* Call legacy weak Abort Receive Complete Callback */
2250   HAL_SMARTCARD_AbortReceiveCpltCallback(hsc);
2251 #endif /* USE_HAL_SMARTCARD_REGISTER_CALLBACK */
2252 }
2253 
2254 /**
2255   * @brief Configure the SMARTCARD peripheral
2256   * @param  hsc    Pointer to a SMARTCARD_HandleTypeDef structure that contains
2257   *                the configuration information for SMARTCARD module.
2258   * @retval None
2259   */
SMARTCARD_SetConfig(SMARTCARD_HandleTypeDef * hsc)2260 static void SMARTCARD_SetConfig(SMARTCARD_HandleTypeDef *hsc)
2261 {
2262   uint32_t tmpreg = 0x00U;
2263   uint32_t pclk;
2264 
2265   /* Check the parameters */
2266   assert_param(IS_SMARTCARD_INSTANCE(hsc->Instance));
2267   assert_param(IS_SMARTCARD_POLARITY(hsc->Init.CLKPolarity));
2268   assert_param(IS_SMARTCARD_PHASE(hsc->Init.CLKPhase));
2269   assert_param(IS_SMARTCARD_LASTBIT(hsc->Init.CLKLastBit));
2270   assert_param(IS_SMARTCARD_BAUDRATE(hsc->Init.BaudRate));
2271   assert_param(IS_SMARTCARD_WORD_LENGTH(hsc->Init.WordLength));
2272   assert_param(IS_SMARTCARD_STOPBITS(hsc->Init.StopBits));
2273   assert_param(IS_SMARTCARD_PARITY(hsc->Init.Parity));
2274   assert_param(IS_SMARTCARD_MODE(hsc->Init.Mode));
2275   assert_param(IS_SMARTCARD_NACK_STATE(hsc->Init.NACKState));
2276 
2277   /* The LBCL, CPOL and CPHA bits have to be selected when both the transmitter and the
2278      receiver are disabled (TE=RE=0) to ensure that the clock pulses function correctly. */
2279   CLEAR_BIT(hsc->Instance->CR1, (USART_CR1_TE | USART_CR1_RE));
2280 
2281   /*---------------------------- USART CR2 Configuration ---------------------*/
2282   tmpreg = hsc->Instance->CR2;
2283   /* Clear CLKEN, CPOL, CPHA and LBCL bits */
2284   tmpreg &= (uint32_t)~((uint32_t)(USART_CR2_CPHA | USART_CR2_CPOL | USART_CR2_CLKEN | USART_CR2_LBCL));
2285   /* Configure the SMARTCARD Clock, CPOL, CPHA and LastBit -----------------------*/
2286   /* Set CPOL bit according to hsc->Init.CLKPolarity value */
2287   /* Set CPHA bit according to hsc->Init.CLKPhase value */
2288   /* Set LBCL bit according to hsc->Init.CLKLastBit value */
2289   /* Set Stop Bits: Set STOP[13:12] bits according to hsc->Init.StopBits value */
2290   tmpreg |= (uint32_t)(USART_CR2_CLKEN | hsc->Init.CLKPolarity |
2291                       hsc->Init.CLKPhase| hsc->Init.CLKLastBit | hsc->Init.StopBits);
2292   /* Write to USART CR2 */
2293   WRITE_REG(hsc->Instance->CR2, (uint32_t)tmpreg);
2294 
2295   tmpreg = hsc->Instance->CR2;
2296 
2297   /* Clear STOP[13:12] bits */
2298   tmpreg &= (uint32_t)~((uint32_t)USART_CR2_STOP);
2299 
2300   /* Set Stop Bits: Set STOP[13:12] bits according to hsc->Init.StopBits value */
2301   tmpreg |= (uint32_t)(hsc->Init.StopBits);
2302 
2303   /* Write to USART CR2 */
2304   WRITE_REG(hsc->Instance->CR2, (uint32_t)tmpreg);
2305 
2306   /*-------------------------- USART CR1 Configuration -----------------------*/
2307   tmpreg = hsc->Instance->CR1;
2308 
2309   /* Clear M, PCE, PS, TE and RE bits */
2310   tmpreg &= (uint32_t)~((uint32_t)(USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | USART_CR1_TE | \
2311                                    USART_CR1_RE));
2312 
2313   /* Configure the SMARTCARD Word Length, Parity and mode:
2314      Set the M bits according to hsc->Init.WordLength value
2315      Set PCE and PS bits according to hsc->Init.Parity value
2316      Set TE and RE bits according to hsc->Init.Mode value */
2317   tmpreg |= (uint32_t)hsc->Init.WordLength | hsc->Init.Parity | hsc->Init.Mode;
2318 
2319   /* Write to USART CR1 */
2320   WRITE_REG(hsc->Instance->CR1, (uint32_t)tmpreg);
2321 
2322   /*-------------------------- USART CR3 Configuration -----------------------*/
2323   /* Clear CTSE and RTSE bits */
2324   CLEAR_BIT(hsc->Instance->CR3, (USART_CR3_RTSE | USART_CR3_CTSE));
2325 
2326   /*-------------------------- USART BRR Configuration -----------------------*/
2327   if(hsc->Instance == USART1)
2328   {
2329     pclk = HAL_RCC_GetPCLK2Freq();
2330     hsc->Instance->BRR = SMARTCARD_BRR(pclk, hsc->Init.BaudRate);
2331   }
2332   else
2333   {
2334     pclk = HAL_RCC_GetPCLK1Freq();
2335     hsc->Instance->BRR = SMARTCARD_BRR(pclk, hsc->Init.BaudRate);
2336   }
2337 }
2338 
2339 /**
2340   * @}
2341   */
2342 
2343 #endif /* HAL_SMARTCARD_MODULE_ENABLED */
2344 /**
2345   * @}
2346   */
2347 
2348 /**
2349   * @}
2350   */
2351 
2352 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
2353