]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS/Demo/CORTEX_M7_STM32F7_STM32756G-EVAL_IAR_Keil/ST_Library/stm32f7xx_hal_irda.c
Update library files used in STM32F7 demo to the latest version released by ST.
[freertos] / FreeRTOS / Demo / CORTEX_M7_STM32F7_STM32756G-EVAL_IAR_Keil / ST_Library / stm32f7xx_hal_irda.c
index aa6d89f201433c0e45bab7c2abede16811bcd12c..68403fd1631c99f6c51e1930eb50e6ff5b6bee2f 100644 (file)
@@ -2,8 +2,8 @@
   ******************************************************************************\r
   * @file    stm32f7xx_hal_irda.c\r
   * @author  MCD Application Team\r
-  * @version V1.0.0RC1\r
-  * @date    24-March-2015\r
+  * @version V1.0.0\r
+  * @date    12-May-2015\r
   * @brief   IRDA HAL module driver.\r
   *          This file provides firmware functions to manage the following \r
   *          functionalities of the IrDA SIR ENDEC block (IrDA):\r
@@ -164,6 +164,7 @@ static void IRDA_SetConfig (IRDA_HandleTypeDef *hirda);
 static HAL_StatusTypeDef IRDA_CheckIdleState(IRDA_HandleTypeDef *hirda);\r
 static HAL_StatusTypeDef IRDA_WaitOnFlagUntilTimeout(IRDA_HandleTypeDef *hirda, uint32_t Flag, FlagStatus Status, uint32_t Timeout);\r
 static HAL_StatusTypeDef IRDA_Transmit_IT(IRDA_HandleTypeDef *hirda);\r
+static HAL_StatusTypeDef IRDA_EndTransmit_IT(IRDA_HandleTypeDef *hirda);\r
 static HAL_StatusTypeDef IRDA_Receive_IT(IRDA_HandleTypeDef *hirda);\r
 /**\r
   * @}\r
@@ -225,6 +226,8 @@ HAL_StatusTypeDef HAL_IRDA_Init(IRDA_HandleTypeDef *hirda)
 \r
   if(hirda->State == HAL_IRDA_STATE_RESET)\r
   {\r
+    /* Allocate lock resource and initialize it */\r
+    hirda->Lock = HAL_UNLOCKED;\r
     /* Init the low level hardware : GPIO, CLOCK, CORTEX */\r
     HAL_IRDA_MspInit(hirda);\r
   }\r
@@ -947,7 +950,12 @@ void HAL_IRDA_IRQHandler(IRDA_HandleTypeDef *hirda)
   {\r
     IRDA_Transmit_IT(hirda);\r
   } \r
-  \r
+\r
+  /* IRDA in mode Transmitter (transmission end) -----------------------------*/\r
+ if((__HAL_IRDA_GET_IT(hirda, IRDA_IT_TC) != RESET) &&(__HAL_IRDA_GET_IT_SOURCE(hirda, IRDA_IT_TC) != RESET))\r
+  {\r
+    IRDA_EndTransmit_IT(hirda);\r
+  }   \r
 }\r
 \r
 /**\r
@@ -1185,7 +1193,7 @@ static HAL_StatusTypeDef IRDA_WaitOnFlagUntilTimeout(IRDA_HandleTypeDef *hirda,
           __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_PE);\r
           __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_ERR);\r
 \r
-          hirda->State= HAL_IRDA_STATE_TIMEOUT;\r
+          hirda->State= HAL_IRDA_STATE_READY;\r
 \r
           /* Process Unlocked */\r
           __HAL_UNLOCK(hirda);\r
@@ -1210,7 +1218,7 @@ static HAL_StatusTypeDef IRDA_WaitOnFlagUntilTimeout(IRDA_HandleTypeDef *hirda,
           __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_PE);\r
           __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_ERR);\r
 \r
-          hirda->State= HAL_IRDA_STATE_TIMEOUT;\r
+          hirda->State= HAL_IRDA_STATE_READY;\r
 \r
           /* Process Unlocked */\r
           __HAL_UNLOCK(hirda);\r
@@ -1278,6 +1286,35 @@ static HAL_StatusTypeDef IRDA_Transmit_IT(IRDA_HandleTypeDef *hirda)
   }\r
 }\r
 \r
+/**\r
+  * @brief  Wraps up transmission in non blocking mode.\r
+  * @param  hirda: pointer to a IRDA_HandleTypeDef structure that contains\r
+  *                the configuration information for the specified IRDA module.\r
+  * @retval HAL status\r
+  */\r
+static HAL_StatusTypeDef IRDA_EndTransmit_IT(IRDA_HandleTypeDef *hirda)\r
+{\r
+  /* Disable the IRDA Transmit Complete Interrupt */    \r
+  __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_TC);\r
+  \r
+  /* Check if a receive process is ongoing or not */\r
+  if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX) \r
+  {\r
+    hirda->State = HAL_IRDA_STATE_BUSY_RX;\r
+  }\r
+  else\r
+  {\r
+    /* Disable the IRDA Error Interrupt: (Frame error, noise error, overrun error) */\r
+    __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_ERR);\r
+\r
+    hirda->State = HAL_IRDA_STATE_READY;\r
+  }\r
+  \r
+  HAL_IRDA_TxCpltCallback(hirda);\r
+  \r
+  return HAL_OK;\r
+}\r
+\r
 /**\r
   * @brief Receive an amount of data in non blocking mode. \r
   *         Function called under interruption only, once\r
@@ -1341,49 +1378,30 @@ static HAL_StatusTypeDef IRDA_Receive_IT(IRDA_HandleTypeDef *hirda)
   \r
 /**\r
   * @brief DMA IRDA Tx transfer completed callback \r
-  * @param  hirda: pointer to a IRDA_HandleTypeDef structure that contains\r
-  *                the configuration information for the specified IRDA module.\r
+  * @param  hdma: pointer to a DMA_HandleTypeDef structure that contains\r
+  *                the configuration information for the specified DMA module.\r
   * @retval None\r
   */\r
 static void IRDA_DMATransmitCplt(DMA_HandleTypeDef *hdma)     \r
 {\r
   IRDA_HandleTypeDef* hirda = ( IRDA_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;\r
   \r
-  /* DMA Normal mode */\r
+  /* DMA Normal mode*/\r
   if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0)\r
   {\r
     hirda->TxXferCount = 0;\r
-    \r
+\r
     /* Disable the DMA transfer for transmit request by setting the DMAT bit\r
-    in the IRDA CR3 register */\r
-    hirda->Instance->CR3 &= (uint16_t)~((uint16_t)USART_CR3_DMAT);\r
-    \r
-    /* Wait for IRDA TC Flag */\r
-    if(IRDA_WaitOnFlagUntilTimeout(hirda, IRDA_FLAG_TC, RESET, HAL_IRDA_TXDMA_TIMEOUTVALUE) != HAL_OK)\r
-    {\r
-      /* Timeout Occured */ \r
-      hirda->State = HAL_IRDA_STATE_TIMEOUT;\r
-      HAL_IRDA_ErrorCallback(hirda);\r
-    }\r
-    else\r
-    {\r
-      /* No Timeout */\r
-      \r
-      if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX)\r
-      {\r
-        hirda->State = HAL_IRDA_STATE_BUSY_RX;\r
-      }\r
-      else\r
-      {\r
-        hirda->State = HAL_IRDA_STATE_READY;\r
-      }\r
-      HAL_IRDA_TxCpltCallback(hirda);\r
-    }\r
+       in the IRDA CR3 register */\r
+    hirda->Instance->CR3 &= (uint32_t)~((uint32_t)USART_CR3_DMAT);\r
+\r
+    /* Enable the IRDA Transmit Complete Interrupt */    \r
+    __HAL_IRDA_ENABLE_IT(hirda, IRDA_IT_TC);\r
   }\r
   /* DMA Circular mode */\r
   else\r
   {\r
-    HAL_IRDA_TxCpltCallback(hirda);\r
+   HAL_IRDA_TxCpltCallback(hirda);\r
   }\r
 }\r
 \r
@@ -1408,15 +1426,16 @@ static void IRDA_DMATransmitHalfCplt(DMA_HandleTypeDef *hdma)
 static void IRDA_DMAReceiveCplt(DMA_HandleTypeDef *hdma)  \r
 {\r
   IRDA_HandleTypeDef* hirda = ( IRDA_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;\r
+       \r
   /* DMA Normal mode */\r
   if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0)\r
   {\r
     hirda->RxXferCount = 0;\r
-    \r
+\r
     /* Disable the DMA transfer for the receiver request by setting the DMAR bit \r
-    in the IRDA CR3 register */\r
+       in the IRDA CR3 register */\r
     hirda->Instance->CR3 &= (uint16_t)~((uint16_t)USART_CR3_DMAR);\r
-    \r
+\r
     if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX) \r
     {\r
       hirda->State = HAL_IRDA_STATE_BUSY_TX;\r
@@ -1426,7 +1445,7 @@ static void IRDA_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
       hirda->State = HAL_IRDA_STATE_READY;\r
     }\r
   }\r
-  \r
+\r
   HAL_IRDA_RxCpltCallback(hirda);\r
 }\r
 \r