]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS/Demo/CORTEX_M7_STM32F7_STM32756G-EVAL_IAR_Keil/ST_Library/stm32f7xx_hal_usart.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_usart.c
index a9bc475a8eb03d42b1c541f6bf37c773e5fc90c1..3bf220aa674ab39d0037b4bb8cd3fa827a2b6850 100644 (file)
@@ -2,8 +2,8 @@
   ******************************************************************************\r
   * @file    stm32f7xx_hal_usart.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   USART HAL module driver.\r
   *\r
   *          This file provides firmware functions to manage the following \r
@@ -126,6 +126,7 @@ static HAL_StatusTypeDef USART_WaitOnFlagUntilTimeout(USART_HandleTypeDef *husar
 static HAL_StatusTypeDef USART_SetConfig(USART_HandleTypeDef *husart);\r
 static HAL_StatusTypeDef USART_CheckIdleState(USART_HandleTypeDef *husart);\r
 static HAL_StatusTypeDef USART_Transmit_IT(USART_HandleTypeDef *husart);\r
+static HAL_StatusTypeDef USART_EndTransmit_IT(USART_HandleTypeDef *husart);\r
 static HAL_StatusTypeDef USART_Receive_IT(USART_HandleTypeDef *husart);\r
 static HAL_StatusTypeDef USART_TransmitReceive_IT(USART_HandleTypeDef *husart);\r
 /**\r
@@ -197,6 +198,8 @@ HAL_StatusTypeDef HAL_USART_Init(USART_HandleTypeDef *husart)
 \r
   if(husart->State == HAL_USART_STATE_RESET)\r
   {\r
+    /* Allocate lock resource and initialize it */\r
+    husart->Lock = HAL_UNLOCKED;\r
     /* Init the low level hardware : GPIO, CLOCK */\r
     HAL_USART_MspInit(husart);\r
   }\r
@@ -1133,6 +1136,12 @@ void HAL_USART_IRQHandler(USART_HandleTypeDef *husart)
     }\r
   }\r
 \r
+  /* USART in mode Transmitter (transmission end) -----------------------------*/\r
+  if((__HAL_USART_GET_IT(husart, USART_IT_TC) != RESET) &&(__HAL_USART_GET_IT_SOURCE(husart, USART_IT_TC) != RESET))\r
+  {\r
+    USART_EndTransmit_IT(husart);\r
+  }\r
+       \r
 }\r
 \r
 /**\r
@@ -1276,16 +1285,8 @@ static HAL_StatusTypeDef USART_Transmit_IT(USART_HandleTypeDef *husart)
       /* Disable the USART Transmit Complete Interrupt */\r
       __HAL_USART_DISABLE_IT(husart, USART_IT_TXE);\r
 \r
-      /* Disable the USART Error Interrupt: (Frame error, noise error, overrun error) */\r
-      __HAL_USART_DISABLE_IT(husart, USART_IT_ERR);\r
-\r
-      if(USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TC, RESET, USART_TIMEOUT_VALUE) != HAL_OK)\r
-      {\r
-        return HAL_TIMEOUT;\r
-      }\r
-      husart->State = HAL_USART_STATE_READY;\r
-\r
-      HAL_USART_TxCpltCallback(husart);\r
+      /* Enable the USART Transmit Complete Interrupt */\r
+      __HAL_USART_ENABLE_IT(husart, USART_IT_TC);\r
 \r
       return HAL_OK;\r
     }\r
@@ -1313,6 +1314,27 @@ static HAL_StatusTypeDef USART_Transmit_IT(USART_HandleTypeDef *husart)
   }\r
 }\r
 \r
+/**\r
+  * @brief  Wraps up transmission in non-blocking mode.\r
+  * @param  husart: pointer to a USART_HandleTypeDef structure that contains\r
+  *                the configuration information for the specified USART module.\r
+  * @retval HAL status\r
+  */\r
+static HAL_StatusTypeDef USART_EndTransmit_IT(USART_HandleTypeDef *husart)\r
+{\r
+  /* Disable the USART Transmit Complete Interrupt */\r
+  __HAL_USART_DISABLE_IT(husart, USART_IT_TC);\r
+\r
+  /* Disable the USART Error Interrupt: (Frame error, noise error, overrun error) */\r
+  __HAL_USART_DISABLE_IT(husart, USART_IT_ERR);\r
+\r
+  husart->State = HAL_USART_STATE_READY;\r
+\r
+  HAL_USART_TxCpltCallback(husart);\r
+\r
+  return HAL_OK;\r
+}\r
+\r
 /**\r
   * @brief  Simplex Receive an amount of data in non-blocking mode.\r
   *         Function called under interruption only, once\r
@@ -1476,7 +1498,7 @@ static HAL_StatusTypeDef USART_WaitOnFlagUntilTimeout(USART_HandleTypeDef *husar
           __HAL_USART_DISABLE_IT(husart, USART_IT_PE);\r
           __HAL_USART_DISABLE_IT(husart, USART_IT_ERR);\r
 \r
-          husart->State= HAL_USART_STATE_TIMEOUT;\r
+          husart->State= HAL_USART_STATE_READY;\r
 \r
           /* Process Unlocked */\r
           __HAL_UNLOCK(husart);\r
@@ -1501,7 +1523,7 @@ static HAL_StatusTypeDef USART_WaitOnFlagUntilTimeout(USART_HandleTypeDef *husar
           __HAL_USART_DISABLE_IT(husart, USART_IT_PE);\r
           __HAL_USART_DISABLE_IT(husart, USART_IT_ERR);\r
 \r
-          husart->State= HAL_USART_STATE_TIMEOUT;\r
+          husart->State= HAL_USART_STATE_READY;\r
 \r
           /* Process Unlocked */\r
           __HAL_UNLOCK(husart);\r
@@ -1524,32 +1546,29 @@ static void USART_DMATransmitCplt(DMA_HandleTypeDef *hdma)
 {\r
   USART_HandleTypeDef* husart = ( USART_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;\r
 \r
-  husart->TxXferCount = 0;\r
-  \r
-  if(husart->State == HAL_USART_STATE_BUSY_TX)\r
-  {\r
-    /* Wait for USART TC Flag */\r
-    if(USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TC, RESET, USART_TXDMA_TIMEOUTVALUE) != HAL_OK)\r
-    {\r
-      /* Timeout occurred */ \r
-      husart->State = HAL_USART_STATE_TIMEOUT;\r
-      HAL_USART_ErrorCallback(husart);\r
-    }\r
-    else\r
+  /* DMA Normal mode */\r
+  if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0)\r
+  { \r
+    husart->TxXferCount = 0;\r
+\r
+    if(husart->State == HAL_USART_STATE_BUSY_TX)\r
     {\r
-      /* No Timeout */\r
-      /* Disable the DMA transfer for transmit request by setting the DMAT bit\r
-       in the USART CR3 register */\r
+      /* Disable the DMA transfer for transmit request by resetting the DMAT bit\r
+         in the USART CR3 register */\r
       husart->Instance->CR3 &= ~(USART_CR3_DMAT);\r
-      husart->State= HAL_USART_STATE_READY;\r
+\r
+      /* Enable the USART Transmit Complete Interrupt */\r
+      __HAL_USART_ENABLE_IT(husart, USART_IT_TC);\r
     }\r
   }\r
-  /* the usart state is HAL_USART_STATE_BUSY_TX_RX*/\r
+  /* DMA Circular mode */\r
   else\r
   {\r
-    husart->State= HAL_USART_STATE_BUSY_RX;\r
+    if(husart->State == HAL_USART_STATE_BUSY_TX)\r
+    {\r
     HAL_USART_TxCpltCallback(husart);\r
-  }\r
+   }\r
+ }\r
 }\r
 \r
 \r
@@ -1574,18 +1593,42 @@ static void USART_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
 {\r
   USART_HandleTypeDef* husart = ( USART_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;\r
 \r
-  husart->RxXferCount = 0;\r
-\r
-  /* Disable the DMA RX transfer for the receiver request by resetting the DMAR bit\r
-  in USART CR3 register */\r
-  husart->Instance->CR3 &= (uint32_t)~((uint32_t)USART_CR3_DMAR);\r
-  /* similarly, disable the DMA TX transfer that was started to provide the\r
-     clock to the slave device */\r
-  husart->Instance->CR3 &= (uint32_t)~((uint32_t)USART_CR3_DMAT);\r
+  /* DMA Normal mode */\r
+  if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0)\r
+  { \r
+    husart->RxXferCount = 0;\r
 \r
-  husart->State= HAL_USART_STATE_READY;\r
+    /* Disable the DMA RX transfer for the receiver request by resetting the DMAR bit\r
+    in USART CR3 register */\r
+    husart->Instance->CR3 &= (uint32_t)~((uint32_t)USART_CR3_DMAR);\r
+    /* similarly, disable the DMA TX transfer that was started to provide the\r
+       clock to the slave device */\r
+    husart->Instance->CR3 &= (uint32_t)~((uint32_t)USART_CR3_DMAT);\r
 \r
-  HAL_USART_RxCpltCallback(husart);\r
+      if(husart->State == HAL_USART_STATE_BUSY_RX)\r
+      {\r
+        HAL_USART_RxCpltCallback(husart);\r
+      }\r
+      /* The USART state is HAL_USART_STATE_BUSY_TX_RX */\r
+      else\r
+      {\r
+        HAL_USART_TxRxCpltCallback(husart);\r
+      }\r
+    husart->State= HAL_USART_STATE_READY;\r
+  }\r
+  /* DMA circular mode */\r
+  else\r
+  {\r
+    if(husart->State == HAL_USART_STATE_BUSY_RX)\r
+    {\r
+      HAL_USART_RxCpltCallback(husart);\r
+    }\r
+    /* The USART state is HAL_USART_STATE_BUSY_TX_RX */\r
+    else\r
+    {\r
+      HAL_USART_TxRxCpltCallback(husart);\r
+    }\r
+  }\r
 }\r
 \r
 /**\r
@@ -1627,6 +1670,8 @@ static HAL_StatusTypeDef USART_SetConfig(USART_HandleTypeDef *husart)
   uint32_t tmpreg      = 0x0;\r
   USART_ClockSourceTypeDef clocksource = USART_CLOCKSOURCE_UNDEFINED;\r
   HAL_StatusTypeDef ret                = HAL_OK;\r
+  uint16_t brrtemp                     = 0x0000;\r
+  uint16_t usartdiv                    = 0x0000;\r
   \r
   /* Check the parameters */\r
   assert_param(IS_USART_POLARITY(husart->Init.CLKPolarity));\r
@@ -1669,27 +1714,31 @@ static HAL_StatusTypeDef USART_SetConfig(USART_HandleTypeDef *husart)
   USART_GETCLOCKSOURCE(husart, clocksource);\r
   switch (clocksource)\r
   {\r
-  case USART_CLOCKSOURCE_PCLK1: \r
-    husart->Instance->BRR = (uint16_t)(2*HAL_RCC_GetPCLK1Freq() / husart->Init.BaudRate);\r
-    break;\r
-  case USART_CLOCKSOURCE_PCLK2: \r
-    husart->Instance->BRR = (uint16_t)(2*HAL_RCC_GetPCLK2Freq() / husart->Init.BaudRate);\r
-    break;\r
-  case USART_CLOCKSOURCE_HSI: \r
-    husart->Instance->BRR = (uint16_t)(2*HSI_VALUE / husart->Init.BaudRate); \r
-    break; \r
-  case USART_CLOCKSOURCE_SYSCLK:  \r
-    husart->Instance->BRR = (uint16_t)(2*HAL_RCC_GetSysClockFreq() / husart->Init.BaudRate);\r
-    break;  \r
-  case USART_CLOCKSOURCE_LSE:                \r
-    husart->Instance->BRR = (uint16_t)(2*LSE_VALUE / husart->Init.BaudRate); \r
-    break;\r
-    case USART_CLOCKSOURCE_UNDEFINED:                \r
-  default:\r
-      ret = HAL_ERROR; \r
-    break;    \r
+    case USART_CLOCKSOURCE_PCLK1:\r
+      usartdiv = (uint16_t)((2*HAL_RCC_GetPCLK1Freq()) / husart->Init.BaudRate);\r
+      break;\r
+    case USART_CLOCKSOURCE_PCLK2:\r
+      usartdiv = (uint16_t)((2*HAL_RCC_GetPCLK2Freq()) / husart->Init.BaudRate);\r
+      break;\r
+    case USART_CLOCKSOURCE_HSI:\r
+      usartdiv = (uint16_t)((2*HSI_VALUE) / husart->Init.BaudRate);\r
+      break;\r
+    case USART_CLOCKSOURCE_SYSCLK:\r
+      usartdiv = (uint16_t)((2*HAL_RCC_GetSysClockFreq()) / husart->Init.BaudRate);\r
+      break;\r
+    case USART_CLOCKSOURCE_LSE:\r
+      usartdiv = (uint16_t)((2*LSE_VALUE) / husart->Init.BaudRate);\r
+      break;\r
+    case USART_CLOCKSOURCE_UNDEFINED:\r
+    default:\r
+      ret = HAL_ERROR;\r
+      break;\r
   } \r
   \r
+  brrtemp = usartdiv & 0xFFF0;\r
+  brrtemp |= (uint16_t)((usartdiv & (uint16_t)0x000F) >> 1U);\r
+  husart->Instance->BRR = brrtemp;\r
+  \r
   return ret; \r
 }\r
 \r