/** * @brief DeInitializes the USART SmartCard peripheral * @param hsc: pointer to a SMARTCARD_HandleTypeDef structure that contains * the configuration information for SMARTCARD module. * @retval HAL status */ HAL_StatusTypeDef HAL_SMARTCARD_DeInit(SMARTCARD_HandleTypeDef *hsc) { /* Check the SMARTCARD handle allocation */ if(hsc == NULL) { return HAL_ERROR; } /* Check the parameters */ assert_param(IS_SMARTCARD_INSTANCE(hsc->Instance)); hsc->State = HAL_SMARTCARD_STATE_BUSY; /* Disable the Peripheral */ __HAL_SMARTCARD_DISABLE(hsc); /* DeInit the low level hardware */ HAL_SMARTCARD_MspDeInit(hsc); hsc->ErrorCode = HAL_SMARTCARD_ERROR_NONE; hsc->State = HAL_SMARTCARD_STATE_RESET; /* Release Lock */ __HAL_UNLOCK(hsc); return HAL_OK; }
/** * @brief Set the RXFIFO threshold. * @param hsmartcard SMARTCARD handle. * @param Threshold RX FIFO threshold value * This parameter can be one of the following values: * @arg @ref SMARTCARD_RXFIFO_THRESHOLD_1_8 * @arg @ref SMARTCARD_RXFIFO_THRESHOLD_1_4 * @arg @ref SMARTCARD_RXFIFO_THRESHOLD_1_2 * @arg @ref SMARTCARD_RXFIFO_THRESHOLD_3_4 * @arg @ref SMARTCARD_RXFIFO_THRESHOLD_7_8 * @arg @ref SMARTCARD_RXFIFO_THRESHOLD_8_8 * @retval HAL status */ HAL_StatusTypeDef HAL_SMARTCARDEx_SetRxFifoThreshold(SMARTCARD_HandleTypeDef *hsmartcard, uint32_t Threshold) { uint32_t tmpcr1 = 0; /* Check parameters */ assert_param(IS_UART_FIFO_INSTANCE(hsmartcard->Instance)); assert_param(IS_SMARTCARD_RXFIFO_THRESHOLD(Threshold)); /* Process Locked */ __HAL_LOCK(hsmartcard); hsmartcard->gState = HAL_SMARTCARD_STATE_BUSY; /* Save actual SMARTCARD configuration */ tmpcr1 = READ_REG(hsmartcard->Instance->CR1); /* Disable SMARTCARD */ __HAL_SMARTCARD_DISABLE(hsmartcard); /* Update RX threshold configuration */ MODIFY_REG(hsmartcard->Instance->CR3, USART_CR3_RXFTCFG, Threshold); /* Determine the number of data to process during RX/TX ISR execution */ SMARTCARDEx_SetNbDataToProcess(hsmartcard); /* Restore SMARTCARD configuration */ MODIFY_REG(hsmartcard->Instance->CR1, USART_CR1_UE, tmpcr1); hsmartcard->gState = HAL_SMARTCARD_STATE_READY; /* Process Unlocked */ __HAL_UNLOCK(hsmartcard); return HAL_OK; }
/** * @brief Disable the FIFO mode. * @param hsmartcard SMARTCARD handle. * @retval HAL status */ HAL_StatusTypeDef HAL_SMARTCARDEx_DisableFifoMode(SMARTCARD_HandleTypeDef *hsmartcard) { uint32_t tmpcr1 = 0; /* Check parameters */ assert_param(IS_UART_FIFO_INSTANCE(hsmartcard->Instance)); /* Process Locked */ __HAL_LOCK(hsmartcard); hsmartcard->gState = HAL_SMARTCARD_STATE_BUSY; /* Save actual SMARTCARD configuration */ tmpcr1 = READ_REG(hsmartcard->Instance->CR1); /* Disable SMARTCARD */ __HAL_SMARTCARD_DISABLE(hsmartcard); /* Enable FIFO mode */ CLEAR_BIT(tmpcr1, USART_CR1_FIFOEN); hsmartcard->FifoMode = SMARTCARD_FIFOMODE_DISABLE; /* Restore SMARTCARD configuration */ WRITE_REG(hsmartcard->Instance->CR1, tmpcr1); hsmartcard->gState = HAL_SMARTCARD_STATE_READY; /* Process Unlocked */ __HAL_UNLOCK(hsmartcard); return HAL_OK; }
/** * @brief Initializes the SMARTCARD mode according to the specified * parameters in the SMARTCARD_InitTypeDef and creates the associated handle . * @param hsc: SMARTCARD handle * @retval HAL status */ HAL_StatusTypeDef HAL_SMARTCARD_Init(SMARTCARD_HandleTypeDef *hsc) { /* Check the SMARTCARD handle allocation */ if(hsc == NULL) { return HAL_ERROR; } /* Check the USART associated to the SmartCard */ assert_param(IS_SMARTCARD_INSTANCE(hsc->Instance)); if(hsc->State == HAL_SMARTCARD_STATE_RESET) { /* Allocate lock resource and initialize it */ hsc->Lock = HAL_UNLOCKED; /* Init the low level hardware : GPIO, CLOCK, CORTEX */ HAL_SMARTCARD_MspInit(hsc); } hsc->State = HAL_SMARTCARD_STATE_BUSY; /* Disable the Peripheral */ __HAL_SMARTCARD_DISABLE(hsc); /* Set the SMARTCARD Communication parameters */ SMARTCARD_SetConfig(hsc); if(hsc->AdvancedInit.AdvFeatureInit != SMARTCARD_ADVFEATURE_NO_INIT) { SMARTCARD_AdvFeatureConfig(hsc); } /* In SmartCard mode, the following bits must be kept cleared: - LINEN in the USART_CR2 register, - HDSEL and IREN bits in the USART_CR3 register.*/ hsc->Instance->CR2 &= ~(USART_CR2_LINEN); hsc->Instance->CR3 &= ~(USART_CR3_HDSEL | USART_CR3_IREN); /* set the USART in SMARTCARD mode */ hsc->Instance->CR3 |= USART_CR3_SCEN; /* Enable the Peripheral */ __HAL_SMARTCARD_ENABLE(hsc); /* TEACK and/or REACK to check before moving hsc->State to Ready */ return (SMARTCARD_CheckIdleState(hsc)); }
/** * @brief Initializes the SmartCard mode according to the specified * parameters in the SMARTCARD_HandleTypeDef and create the associated handle. * @param hsc: Pointer to a SMARTCARD_HandleTypeDef structure that contains * the configuration information for the specified SMARTCARD module. * @retval HAL status */ HAL_StatusTypeDef HAL_SMARTCARD_Init(SMARTCARD_HandleTypeDef *hsc) { /* Check the SMARTCARD handle allocation */ if(hsc == NULL) { return HAL_ERROR; } /* Check Wordlength, Parity and Stop bits parameters */ if ( (!(IS_SMARTCARD_WORD_LENGTH(hsc->Init.WordLength))) ||(!(IS_SMARTCARD_STOPBITS(hsc->Init.StopBits))) ||(!(IS_SMARTCARD_PARITY(hsc->Init.Parity))) ) { return HAL_ERROR; } /* Check the parameters */ assert_param(IS_SMARTCARD_INSTANCE(hsc->Instance)); assert_param(IS_SMARTCARD_NACK_STATE(hsc->Init.NACKState)); assert_param(IS_SMARTCARD_PRESCALER(hsc->Init.Prescaler)); if(hsc->State == HAL_SMARTCARD_STATE_RESET) { /* Allocate lock resource and initialize it */ hsc->Lock = HAL_UNLOCKED; /* Init the low level hardware */ HAL_SMARTCARD_MspInit(hsc); } hsc->State = HAL_SMARTCARD_STATE_BUSY; /* Disable the Peripheral */ __HAL_SMARTCARD_DISABLE(hsc); /* Set the Prescaler */ MODIFY_REG(hsc->Instance->GTPR, USART_GTPR_PSC, hsc->Init.Prescaler); /* Set the Guard Time */ MODIFY_REG(hsc->Instance->GTPR, USART_GTPR_GT, ((hsc->Init.GuardTime)<<8)); /* Set the Smartcard Communication parameters */ SMARTCARD_SetConfig(hsc); /* In SmartCard mode, the following bits must be kept cleared: - LINEN bit in the USART_CR2 register - HDSEL and IREN bits in the USART_CR3 register.*/ CLEAR_BIT(hsc->Instance->CR2, USART_CR2_LINEN); CLEAR_BIT(hsc->Instance->CR3, (USART_CR3_IREN | USART_CR3_HDSEL)); /* Enable the Peripharal */ __HAL_SMARTCARD_ENABLE(hsc); /* Configure the Smartcard NACK state */ MODIFY_REG(hsc->Instance->CR3, USART_CR3_NACK, hsc->Init.NACKState); /* Enable the SC mode by setting the SCEN bit in the CR3 register */ SET_BIT(hsc->Instance->CR3, USART_CR3_SCEN); /* Initialize the SMARTCARD state*/ hsc->ErrorCode = HAL_SMARTCARD_ERROR_NONE; hsc->State= HAL_SMARTCARD_STATE_READY; return HAL_OK; }