コード例 #1
0
/**
  * @brief DMA IRDA Tx transfer completed callback 
  * @param hdma: DMA handle
  * @retval None
  */
static void IRDA_DMATransmitCplt(DMA_HandleTypeDef *hdma)     
{
  IRDA_HandleTypeDef* hirda = ( IRDA_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
  hirda->TxXferCount = 0;
  
  /* Disable the DMA transfer for transmit request by setting the DMAT bit
  in the IRDA CR3 register */
  hirda->Instance->CR3 &= (uint16_t)~((uint16_t)USART_CR3_DMAT);
  
  /* Wait for IRDA TC Flag */
  if(IRDA_WaitOnFlagUntilTimeout(hirda, IRDA_FLAG_TC, RESET, IRDA_TXDMA_TIMEOUTVALUE) != HAL_OK)
  {
    /* Timeout Occured */ 
    HAL_IRDA_ErrorCallback(hirda);
  }
  else
  {
    /* No Timeout */
    if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX)
    {
      hirda->State = HAL_IRDA_STATE_BUSY_RX;
    }
    else
    {
      hirda->State = HAL_IRDA_STATE_READY;
    }
    HAL_IRDA_TxCpltCallback(hirda);
  }
}
コード例 #2
0
/**
  * @brief  Wraps up transmission in non blocking mode.
  * @param  hirda: pointer to a IRDA_HandleTypeDef structure that contains
  *                the configuration information for the specified IRDA module.
  * @retval HAL status
  */
static HAL_StatusTypeDef IRDA_EndTransmit_IT(IRDA_HandleTypeDef *hirda)
{
  /* Disable the IRDA Transmit Complete Interrupt */    
  __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_TC);
  
  /* Check if a receive process is ongoing or not */
  if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX) 
  {
    hirda->State = HAL_IRDA_STATE_BUSY_RX;
  }
  else
  {
    /* Disable the IRDA Error Interrupt: (Frame error, noise error, overrun error) */
    __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_ERR);

    /* Disable the IRDA Parity Error Interrupt */
    __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_PE);

    hirda->State = HAL_IRDA_STATE_READY;
  }
  
  HAL_IRDA_TxCpltCallback(hirda);
  
  return HAL_OK;
}
コード例 #3
0
/**
 * @brief  DMA IRDA transmit process complete callback. 
 * @param  hdma : DMA handle
 * @retval None
 */
static void IRDA_DMATransmitCplt(DMA_HandleTypeDef *hdma)
{
	IRDA_HandleTypeDef* hirda = ( IRDA_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;

	hirda->TxXferCount = 0;

	/* Wait for IRDA TC Flag */
	if(IRDA_WaitOnFlagUntilTimeout(hirda, IRDA_FLAG_TC, RESET, IRDA_TIMEOUT_VALUE) != HAL_OK)
	{
		/* Timeout Occured */
		hirda->State = HAL_IRDA_STATE_TIMEOUT;
		HAL_IRDA_ErrorCallback(hirda);
	}
	else
	{
		/* No Timeout */
		/* Check if a receive process is ongoing or not */
		if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX)
		{
			hirda->State = HAL_IRDA_STATE_BUSY_RX;
		}
		else
		{
			hirda->State = HAL_IRDA_STATE_READY;
		}
		HAL_IRDA_TxCpltCallback(hirda);
	}
}
コード例 #4
0
ファイル: stm32f0xx_hal_irda.c プロジェクト: 23chrischen/mbed
/**
  * @brief Receive an amount of data in non blocking mode. 
  *         Function called under interruption only, once
  *         interruptions have been enabled by HAL_IRDA_Transmit_IT()      
  * @param hirda: IRDA handle
  * @retval HAL status
  */
static HAL_StatusTypeDef IRDA_Transmit_IT(IRDA_HandleTypeDef *hirda)
{
  uint16_t* tmp;
    
  if((hirda->State == HAL_IRDA_STATE_BUSY_TX) || (hirda->State == HAL_IRDA_STATE_BUSY_TX_RX))
  {
    __HAL_LOCK(hirda);
 
    if(hirda->TxXferCount == 0)
    {
      /* Disable the IRDA Transmit Complete Interrupt */
      __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_TC);
     
      if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX) 
      {
        hirda->State = HAL_IRDA_STATE_BUSY_RX;
      }
      else
      {
        /* Disable the IRDA Error Interrupt: (Frame error, noise error, overrun error) */
        __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_ERR);
      
        hirda->State = HAL_IRDA_STATE_READY;
      }

      /* Call the Process Unlocked before calling the Tx call back API to give the possibiity to
      start again the Transmission under the Tx call back API */
      __HAL_UNLOCK(hirda);
      
      HAL_IRDA_TxCpltCallback(hirda);
      
      return HAL_OK;
    }
    else
    {
      if ((hirda->Init.WordLength == IRDA_WORDLENGTH_9B) && (hirda->Init.Parity == IRDA_PARITY_NONE))
      {
        tmp = (uint16_t*) hirda->pTxBuffPtr;
        hirda->Instance->TDR = (*tmp & (uint16_t)0x01FF);   
        hirda->pTxBuffPtr += 2;
      }
      else
      { 
        hirda->Instance->TDR = (uint8_t)(*hirda->pTxBuffPtr++ & (uint8_t)0xFF); 
      }  
      hirda->TxXferCount--;
      
      /* Process Unlocked */
      __HAL_UNLOCK(hirda);
  
      return HAL_OK;
    }
  }
  else
  {
    return HAL_BUSY;   
  }
}
コード例 #5
0
ファイル: stm32f0xx_hal_irda.c プロジェクト: bcstack/btsdk
/**
  * @brief Receive an amount of data in non blocking mode. 
  *         Function called under interruption only, once
  *         interruptions have been enabled by HAL_IRDA_Transmit_IT()      
  * @param hirda: IRDA handle
  * @retval HAL status
  */
static HAL_StatusTypeDef IRDA_Transmit_IT(IRDA_HandleTypeDef *hirda)
{
  uint16_t* tmp;
    
  if((hirda->State == HAL_IRDA_STATE_BUSY_TX) || (hirda->State == HAL_IRDA_STATE_BUSY_TX_RX))
  {
 
    if(hirda->TxXferCount == 0)
    {
      /* Disable the IRDA Transmit Data Register Empty Interrupt */
      __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_TXE);
     
      if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX) 
      {
        hirda->State = HAL_IRDA_STATE_BUSY_RX;
      }
      else
      {
        /* Disable the IRDA Error Interrupt: (Frame error, noise error, overrun error) */
        __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_ERR);
      
        hirda->State = HAL_IRDA_STATE_READY;
      }

      /* Wait on TC flag to be able to start a second transfer */
      if(IRDA_WaitOnFlagUntilTimeout(hirda, IRDA_IT_TC, RESET, IRDA_TIMEOUT_VALUE) != HAL_OK)
      { 
        return HAL_TIMEOUT;
      }
      
      HAL_IRDA_TxCpltCallback(hirda);
      
      return HAL_OK;
    }
    else
    {
      if ((hirda->Init.WordLength == IRDA_WORDLENGTH_9B) && (hirda->Init.Parity == IRDA_PARITY_NONE))
      {
        tmp = (uint16_t*) hirda->pTxBuffPtr;
        hirda->Instance->TDR = (*tmp & (uint16_t)0x01FF);   
        hirda->pTxBuffPtr += 2;
      }
      else
      { 
        hirda->Instance->TDR = (uint8_t)(*hirda->pTxBuffPtr++ & (uint8_t)0xFF); 
      }  
      hirda->TxXferCount--;
  
      return HAL_OK;
    }
  }
  else
  {
    return HAL_BUSY;   
  }
}
コード例 #6
0
ファイル: stm32l4xx_hal_irda.c プロジェクト: AlessandroA/mbed
/**
  * @brief  Wrap up transmission in non-blocking mode.
  * @param  hirda: pointer to a IRDA_HandleTypeDef structure that contains
  *                the configuration information for the specified IRDA module.
  * @retval HAL status
  */
static HAL_StatusTypeDef IRDA_EndTransmit_IT(IRDA_HandleTypeDef *hirda)
{
  /* Disable the IRDA Transmit Complete Interrupt */
  __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_TC);

  /* Tx process is ended, restore hirda->gState to Ready */
  hirda->gState = HAL_IRDA_STATE_READY;

  HAL_IRDA_TxCpltCallback(hirda);

  return HAL_OK;
}
コード例 #7
0
ファイル: stm32f4xx_hal_irda.c プロジェクト: 12019/openmv
/**
  * @brief  DMA IRDA transmit process complete callback. 
  * @param  hdma : DMA handle
  * @retval None
  */
static void IRDA_DMATransmitCplt(DMA_HandleTypeDef *hdma)
{
  IRDA_HandleTypeDef* hirda = ( IRDA_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
  /* DMA Normal mode */
  if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0)
  {
    hirda->TxXferCount = 0;

    /* Disable the DMA transfer for transmit request by setting the DMAT bit
       in the IRDA CR3 register */
    hirda->Instance->CR3 &= (uint16_t)~((uint16_t)USART_CR3_DMAT);

    /* Wait for IRDA TC Flag */
    if(IRDA_WaitOnFlagUntilTimeout(hirda, IRDA_FLAG_TC, RESET, IRDA_TIMEOUT_VALUE) != HAL_OK)
    {
      /* Timeout occurred */ 
      hirda->State = HAL_IRDA_STATE_TIMEOUT;
      HAL_IRDA_ErrorCallback(hirda);
    }
    else
    {
      /* No Timeout */
      /* Check if a receive process is ongoing or not */
      if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX)
      {
        hirda->State = HAL_IRDA_STATE_BUSY_RX;
      }
      else
      {
        hirda->State = HAL_IRDA_STATE_READY;
      }
      HAL_IRDA_TxCpltCallback(hirda);
    }
  }
  /* DMA Circular mode */
  else
  {
    HAL_IRDA_TxCpltCallback(hirda);
  }
}
コード例 #8
0
ファイル: stm32l0xx_hal_irda.c プロジェクト: shorai/stm32L05
/**
  * @brief Receive an amount of data in non blocking mode.
  *         Function called under interruption only, once
  *         interruptions have been enabled by HAL_IRDA_Transmit_IT()
  * @param hirda: IRDA handle
  * @retval HAL status
  */
static HAL_StatusTypeDef IRDA_Transmit_IT(IRDA_HandleTypeDef *hirda)
{
    uint16_t* tmp;

    if((hirda->State == HAL_IRDA_STATE_BUSY_TX) || (hirda->State == HAL_IRDA_STATE_BUSY_TX_RX))
    {
        if(hirda->TxXferCount == 0)
        {
            /* Disable the IRDA Transmit Complete Interrupt */
            __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_TXE);

            if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX)
            {
                hirda->State = HAL_IRDA_STATE_BUSY_RX;
            }
            else
            {
                /* Disable the IRDA Error Interrupt: (Frame error, noise error, overrun error) */
                __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_ERR);

                hirda->State = HAL_IRDA_STATE_READY;
            }

            HAL_IRDA_TxCpltCallback(hirda);

            return HAL_OK;
        }
        else
        {
            if ((hirda->Init.WordLength == IRDA_WORDLENGTH_9B) && (hirda->Init.Parity == IRDA_PARITY_NONE))
            {
                tmp = (uint16_t*) hirda->pTxBuffPtr;
                hirda->Instance->TDR = (*tmp & (uint16_t)0x01FF);
                hirda->pTxBuffPtr += 2;
            }
            else
            {
                hirda->Instance->TDR = (uint8_t)(*hirda->pTxBuffPtr++ & (uint8_t)0xFF);
            }
            hirda->TxXferCount--;
            return HAL_OK;
        }
    }
    else
    {
        return HAL_BUSY;
    }
}
コード例 #9
0
/**
  * @brief  DMA IRDA transmit process complete callback. 
  * @param  hdma: Pointer to a DMA_HandleTypeDef structure that contains
  *               the configuration information for the specified DMA module.
  * @retval None
  */
static void IRDA_DMATransmitCplt(DMA_HandleTypeDef *hdma)
{
  IRDA_HandleTypeDef* hirda = ( IRDA_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
  /* DMA Normal mode */
  if ( HAL_IS_BIT_CLR(hdma->Instance->CCR, DMA_CCR_CIRC) )
  {
    hirda->TxXferCount = 0;

    /* Disable the DMA transfer for transmit request by setting the DMAT bit
       in the IRDA CR3 register */
    CLEAR_BIT(hirda->Instance->CR3, USART_CR3_DMAT);

    /* Enable the IRDA Transmit Complete Interrupt */    
    __HAL_IRDA_ENABLE_IT(hirda, IRDA_IT_TC);
  }
  /* DMA Circular mode */
  else
  {
    HAL_IRDA_TxCpltCallback(hirda);
  }
}