Esempio n. 1
0
/**
  * @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;
}
Esempio n. 2
0
/**
  * @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;
}
Esempio n. 3
0
/**
  * @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;
}
Esempio n. 4
0
/**
  * @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;
}
Esempio n. 6
0
/**
  * @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;  
}