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