/** * @brief Set the RXFIFO threshold. * @param husart USART handle. * @param Threshold RX FIFO threshold value * This parameter can be one of the following values: * @arg @ref USART_RXFIFO_THRESHOLD_1_8 * @arg @ref USART_RXFIFO_THRESHOLD_1_4 * @arg @ref USART_RXFIFO_THRESHOLD_1_2 * @arg @ref USART_RXFIFO_THRESHOLD_3_4 * @arg @ref USART_RXFIFO_THRESHOLD_7_8 * @arg @ref USART_RXFIFO_THRESHOLD_8_8 * @retval HAL status */ HAL_StatusTypeDef HAL_USARTEx_SetRxFifoThreshold(USART_HandleTypeDef *husart, uint32_t Threshold) { uint32_t tmpcr1 = 0; /* Check the parameters */ assert_param(IS_UART_FIFO_INSTANCE(husart->Instance)); assert_param(IS_USART_RXFIFO_THRESHOLD(Threshold)); /* Process Locked */ __HAL_LOCK(husart); husart->State = HAL_USART_STATE_BUSY; /* Save actual USART configuration */ tmpcr1 = READ_REG(husart->Instance->CR1); /* Disable USART */ __HAL_USART_DISABLE(husart); /* Update RX threshold configuration */ MODIFY_REG(husart->Instance->CR3, USART_CR3_RXFTCFG, Threshold); /* Determine the number of data to process during RX/TX ISR execution */ USARTEx_SetNbDataToProcess(husart); /* Restore USART configuration */ WRITE_REG(husart->Instance->CR1, tmpcr1); husart->State = HAL_USART_STATE_READY; /* Process Unlocked */ __HAL_UNLOCK(husart); return HAL_OK; }
/** * @brief Disable the FIFO mode. * @param husart USART handle. * @retval HAL status */ HAL_StatusTypeDef HAL_USARTEx_DisableFifoMode(USART_HandleTypeDef *husart) { uint32_t tmpcr1 = 0; /* Check parameters */ assert_param(IS_UART_FIFO_INSTANCE(husart->Instance)); /* Process Locked */ __HAL_LOCK(husart); husart->State = HAL_USART_STATE_BUSY; /* Save actual USART configuration */ tmpcr1 = READ_REG(husart->Instance->CR1); /* Disable USART */ __HAL_USART_DISABLE(husart); /* Enable FIFO mode */ CLEAR_BIT(tmpcr1, USART_CR1_FIFOEN); husart->FifoMode = USART_FIFOMODE_DISABLE; /* Restore USART configuration */ WRITE_REG(husart->Instance->CR1, tmpcr1); husart->State = HAL_USART_STATE_READY; /* Process Unlocked */ __HAL_UNLOCK(husart); return HAL_OK; }
/** * @brief Enable the FIFO mode. * @param husart USART handle. * @retval HAL status */ HAL_StatusTypeDef HAL_USARTEx_EnableFifoMode(USART_HandleTypeDef *husart) { uint32_t tmpcr1 = 0; /* Check parameters */ assert_param(IS_UART_FIFO_INSTANCE(husart->Instance)); /* Process Locked */ __HAL_LOCK(husart); husart->State = HAL_USART_STATE_BUSY; /* Save actual USART configuration */ tmpcr1 = READ_REG(husart->Instance->CR1); /* Disable USART */ __HAL_USART_DISABLE(husart); /* Enable FIFO mode */ SET_BIT(tmpcr1, USART_CR1_FIFOEN); husart->FifoMode = USART_FIFOMODE_ENABLE; /* Restore USART configuration */ WRITE_REG(husart->Instance->CR1, tmpcr1); /* Determine the number of data to process during RX/TX ISR execution */ USARTEx_SetNbDataToProcess(husart); husart->State = HAL_USART_STATE_READY; /* Process Unlocked */ __HAL_UNLOCK(husart); return HAL_OK; }
/** * @brief Configure the Slave Select input pin (NSS). * @note Software NSS management: SPI slave will always be selected and NSS * input pin will be ignored. * @note Hardware NSS management: the SPI slave selection depends on NSS * input pin. The slave is selected when NSS is low and deselected when * NSS is high. * @param husart USART handle. * @param NSSConfig NSS configuration. * This parameter can be one of the following values: * @arg @ref USART_NSS_HARD * @arg @ref USART_NSS_SOFT * @retval HAL status */ HAL_StatusTypeDef HAL_USARTEx_ConfigNSS(USART_HandleTypeDef *husart, uint32_t NSSConfig) { uint32_t tmpcr1 = 0; /* Check parameters */ assert_param(IS_UART_SPI_SLAVE_INSTANCE(husart->Instance)); assert_param(IS_USART_NSS(NSSConfig)); /* Process Locked */ __HAL_LOCK(husart); husart->State = HAL_USART_STATE_BUSY; /* Save actual USART configuration */ tmpcr1 = READ_REG(husart->Instance->CR1); /* Disable USART */ __HAL_USART_DISABLE(husart); /* Program DIS_NSS bit in the USART_CR2 register */ MODIFY_REG(husart->Instance->CR2, USART_CR2_DIS_NSS, NSSConfig); /* Restore USART configuration */ WRITE_REG(husart->Instance->CR1, tmpcr1); husart->State = HAL_USART_STATE_READY; /* Process Unlocked */ __HAL_UNLOCK(husart); return HAL_OK; }
/** * @brief Disable the SPI slave mode. * @param husart USART handle. * @retval HAL status */ HAL_StatusTypeDef HAL_USARTEx_DisableSlaveMode(USART_HandleTypeDef *husart) { uint32_t tmpcr1; /* Check parameters */ assert_param(IS_UART_SPI_SLAVE_INSTANCE(husart->Instance)); /* Process Locked */ __HAL_LOCK(husart); husart->State = HAL_USART_STATE_BUSY; /* Save actual USART configuration */ tmpcr1 = READ_REG(husart->Instance->CR1); /* Disable USART */ __HAL_USART_DISABLE(husart); /* Disable SPI slave mode */ CLEAR_BIT(husart->Instance->CR2, USART_CR2_SLVEN); /* Restore USART configuration */ WRITE_REG(husart->Instance->CR1, tmpcr1); husart->SlaveMode = USART_SLAVEMODE_ENABLE; husart->State = HAL_USART_STATE_READY; /* Process Unlocked */ __HAL_UNLOCK(husart); return HAL_OK; }
/** * @brief Enable the SPI slave mode. * @note When the USART operates in SPI slave mode, it handles data flow using * the serial interface clock derived from the external SCLK signal * provided by the external master SPI device. * @note In SPI slave mode, the USART must be enabled before starting the master * communications (or between frames while the clock is stable). Otherwise, * if the USART slave is enabled while the master is in the middle of a * frame, it will become desynchronized with the master. * @note The data register of the slave needs to be ready before the first edge * of the communication clock or before the end of the ongoing communication, * otherwise the SPI slave will transmit zeros. * @param husart USART handle. * @retval HAL status */ HAL_StatusTypeDef HAL_USARTEx_EnableSlaveMode(USART_HandleTypeDef *husart) { uint32_t tmpcr1 = 0; /* Check parameters */ assert_param(IS_UART_SPI_SLAVE_INSTANCE(husart->Instance)); /* Process Locked */ __HAL_LOCK(husart); husart->State = HAL_USART_STATE_BUSY; /* Save actual USART configuration */ tmpcr1 = READ_REG(husart->Instance->CR1); /* Disable USART */ __HAL_USART_DISABLE(husart); /* In SPI slave mode mode, the following bits must be kept cleared: - LINEN and CLKEN bit in the USART_CR2 register - HDSEL, SCEN and IREN bits in the USART_CR3 register.*/ CLEAR_BIT(husart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); CLEAR_BIT(husart->Instance->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN)); /* Enable SPI slave mode */ SET_BIT(husart->Instance->CR2, USART_CR2_SLVEN); /* Restore USART configuration */ WRITE_REG(husart->Instance->CR1, tmpcr1); husart->SlaveMode = USART_SLAVEMODE_ENABLE; husart->State = HAL_USART_STATE_READY; /* Enable USART */ __HAL_USART_ENABLE(husart); /* Process Unlocked */ __HAL_UNLOCK(husart); return HAL_OK; }