| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441 |
- #include "wm_uart.h"
- __attribute__((weak)) void HAL_UART_MspInit(UART_HandleTypeDef *huart);
- __attribute__((weak)) void HAL_UART_MspDeInit(UART_HandleTypeDef *huart);
- static HAL_StatusTypeDef UART_Transmit_IT(UART_HandleTypeDef *huart);
- static HAL_StatusTypeDef UART_EndTransmit_IT(UART_HandleTypeDef *huart);
- static HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart);
- static HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, uint8_t Status, uint32_t Tickstart, uint32_t Timeout);
- static void UART_SetConfig(UART_HandleTypeDef *huart);
- HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart)
- {
- if (huart == NULL)
- {
- return HAL_ERROR;
- }
-
- assert_param(IS_UART_INSTANCE(huart->Instance));
-
- if (huart->gState == HAL_UART_STATE_RESET)
- {
- huart->Lock = HAL_UNLOCKED;
- HAL_UART_MspInit(huart);
- }
- huart->gState = HAL_UART_STATE_BUSY;
- __HAL_UART_DISABLE(huart);
- UART_SetConfig(huart);
- __HAL_UART_ENABLE(huart);
- huart->ErrorCode = HAL_UART_ERROR_NONE;
- huart->gState = HAL_UART_STATE_READY;
- huart->RxState = HAL_UART_STATE_READY;
- return HAL_OK;
- }
- HAL_StatusTypeDef HAL_UART_DeInit(UART_HandleTypeDef *huart)
- {
- if (huart == NULL)
- {
- return HAL_ERROR;
- }
- assert_param(IS_UART_INSTANCE(huart->Instance));
- huart->gState = HAL_UART_STATE_BUSY;
- __HAL_UART_DISABLE(huart);
- HAL_UART_MspDeInit(huart);
- huart->ErrorCode = HAL_UART_ERROR_NONE;
- huart->gState = HAL_UART_STATE_RESET;
- huart->RxState = HAL_UART_STATE_RESET;
- __HAL_UNLOCK(huart);
- return HAL_OK;
- }
- __attribute__((weak)) void HAL_UART_MspInit(UART_HandleTypeDef *huart)
- {
- UNUSED(huart);
- }
- __attribute__((weak)) void HAL_UART_MspDeInit(UART_HandleTypeDef *huart)
- {
- UNUSED(huart);
- }
- HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
- {
- uint8_t *pdata8bits;
- uint32_t tickstart = 0U;
-
- if (huart->gState == HAL_UART_STATE_READY)
- {
- if ((pData == NULL) || (Size == 0))
- {
- return HAL_ERROR;
- }
-
- __HAL_LOCK(huart);
- huart->ErrorCode = HAL_UART_ERROR_NONE;
- huart->gState = HAL_UART_STATE_BUSY_TX;
- tickstart = HAL_GetTick();
- huart->TxXferSize = Size;
- huart->TxXferCount = Size;
- pdata8bits = pData;
- __HAL_UNLOCK(huart);
- while (huart->TxXferCount > 0)
- {
- if (UART_WaitOnFlagUntilTimeout(huart, UART_FIFOS_TFC, UART_FIFO_TX_NOT_FULL, tickstart, Timeout) != HAL_OK)
- {
- return HAL_TIMEOUT;
- }
- huart->Instance->TDW = *pdata8bits;
- pdata8bits++;
- huart->TxXferCount--;
- }
- if (UART_WaitOnFlagUntilTimeout(huart, UART_FIFOS_TFC, UART_FIFO_TX_EMPTY, tickstart, Timeout) != HAL_OK)
- {
- return HAL_TIMEOUT;
- }
- huart->gState = HAL_UART_STATE_READY;
- return HAL_OK;
- }
- else
- {
- return HAL_BUSY;
- }
- }
- HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
- {
- uint8_t *pdata8bits;
- uint32_t tickstart = 0U;
- if (huart->RxState == HAL_UART_STATE_READY)
- {
- if ((pData == NULL) || (Size == 0U))
- {
- return HAL_ERROR;
- }
- __HAL_LOCK(huart);
- huart->ErrorCode = HAL_UART_ERROR_NONE;
- huart->RxState = HAL_UART_STATE_BUSY_RX;
- tickstart = HAL_GetTick();
- huart->RxXferSize = Size;
- huart->RxXferCount = Size;
-
- pdata8bits = pData;
-
- __HAL_UNLOCK(huart);
- while (huart->RxXferCount > 0U)
- {
- if (UART_WaitOnFlagUntilTimeout(huart, UART_FIFOS_RFC, UART_FIFO_RX_NOT_EMPTY, tickstart, Timeout) != HAL_OK)
- {
- return HAL_TIMEOUT;
- }
- *pdata8bits = huart->Instance->RDW;
- pdata8bits++;
- huart->RxXferCount--;
- }
- /* At end of Rx process, restore huart->RxState to Ready */
- huart->RxState = HAL_UART_STATE_READY;
- return HAL_OK;
- }
- else
- {
- return HAL_BUSY;
- }
- }
- HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
- {
- if (huart->gState == HAL_UART_STATE_READY)
- {
- if ((pData == NULL) || (Size == 0))
- {
- return HAL_ERROR;
- }
- __HAL_LOCK(huart);
- huart->pTxBuffPtr = pData;
- huart->TxXferSize = Size;
- huart->TxXferCount = Size;
- huart->ErrorCode = HAL_UART_ERROR_NONE;
- huart->gState = HAL_UART_STATE_BUSY_TX;
- __HAL_UNLOCK(huart);
- __HAL_UART_ENABLE_IT(huart, UART_TX_INT_FLAG);
-
- do {
- if ((huart->Instance->FIFOS & UART_FIFOS_TFC) == UART_FIFO_FULL)
- {
- break;
- }
- huart->Instance->TDW = *(huart->pTxBuffPtr);
- huart->pTxBuffPtr++;
- huart->TxXferCount--;
- } while(0);
- return HAL_OK;
- }
- else
- {
- return HAL_BUSY;
- }
- }
- HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
- {
- if (huart->RxState == HAL_UART_STATE_READY)
- {
- if (pData == NULL)
- {
- return HAL_ERROR;
- }
- __HAL_LOCK(huart);
-
- huart->pRxBuffPtr = pData;
- huart->RxXferSize = Size;
- huart->RxXferCount = 0;
- huart->ErrorCode = HAL_UART_ERROR_NONE;
- huart->RxState = HAL_UART_STATE_BUSY_RX;
- __HAL_UNLOCK(huart);
- __HAL_UART_CLEAR_FLAG(huart, UART_RX_INT_FLAG);
- __HAL_UART_ENABLE_IT(huart, UART_RX_INT_FLAG);
-
- return HAL_OK;
- }
- else
- {
- return HAL_BUSY;
- }
- }
- void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
- {
- uint32_t isrflags = READ_REG(huart->Instance->INTS);
- uint32_t isrmasks = READ_REG(huart->Instance->INTM);
- __HAL_UART_CLEAR_FLAG(huart, isrflags);
- if (((isrflags & UART_RX_INT_FLAG) != RESET) && ((isrmasks & UART_RX_INT_FLAG) == RESET))
- {
- if ((isrflags & UART_RX_ERR_INT_FLAG) != RESET)
- {
- huart->ErrorCode = isrflags & UART_RX_ERR_INT_FLAG;
- }
- else
- {
- huart->ErrorCode = HAL_UART_ERROR_NONE;
- }
-
- if(isrflags&UART_INTS_RTO)
- {
- huart->RxFlag=1;
- }
- UART_Receive_IT(huart);
- }
-
- if (((isrflags & UART_INTS_TL) != RESET) && ((isrmasks & UART_INTM_RL) == RESET))
- {
- UART_Transmit_IT(huart);
- }
- if (((isrflags & UART_INTS_TEMPT) != RESET) && ((isrmasks & UART_INTM_TEMPT) == RESET))
- {
- UART_EndTransmit_IT(huart);
- }
- }
- __attribute__((weak)) void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
- {
- UNUSED(huart);
- }
- __attribute__((weak)) void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
- {
- UNUSED(huart);
- }
- static HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, uint8_t Status, uint32_t Tickstart, uint32_t Timeout)
- {
- while (1)
- {
- if (Status == UART_FIFO_TX_NOT_FULL)
- {
- if ((huart->Instance->FIFOS & Flag) < UART_FIFO_FULL)
- break;
- }
- else if (Status == UART_FIFO_TX_EMPTY)
- {
- if ((huart->Instance->FIFOS & Flag) == 0)
- break;
- }
- else if (Status == UART_FIFO_RX_NOT_EMPTY)
- {
- if ((huart->Instance->FIFOS & Flag) > 0)
- break;
- }
- if (Timeout != HAL_MAX_DELAY)
- {
- if ((Timeout == 0U) || ((HAL_GetTick() - Tickstart) > Timeout))
- {
- huart->gState = HAL_UART_STATE_READY;
- huart->RxState = HAL_UART_STATE_READY;
- __HAL_UNLOCK(huart);
- return HAL_TIMEOUT;
- }
- }
- }
- return HAL_OK;
- }
- static HAL_StatusTypeDef UART_Transmit_IT(UART_HandleTypeDef *huart)
- {
- if (huart->gState == HAL_UART_STATE_BUSY_TX)
- {
- while (huart->TxXferCount > 0)
- {
- if ((huart->Instance->FIFOS & UART_FIFOS_TFC) == UART_FIFO_FULL)
- {
- break;
- }
- huart->Instance->TDW = *(huart->pTxBuffPtr);
- huart->pTxBuffPtr++;
- huart->TxXferCount--;
- }
- return HAL_OK;
- }
- else
- {
- return HAL_BUSY;
- }
- }
- static HAL_StatusTypeDef UART_EndTransmit_IT(UART_HandleTypeDef *huart)
- {
- if (huart->TxXferCount == 0)
- {
- __HAL_UART_DISABLE_IT(huart, UART_INTM_TL | UART_INTM_TEMPT);
- huart->gState = HAL_UART_STATE_READY;
- HAL_UART_TxCpltCallback(huart);
- }
- return HAL_OK;
- }
- static HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart)
- {
- uint8_t ch, count;
- if (huart->RxState == HAL_UART_STATE_BUSY_RX)
- {
- count = ((READ_REG(huart->Instance->FIFOS) & UART_FIFOS_RFC) >> UART_FIFOS_RFC_Pos);
- while (count-- > 0)
- {
- ch = (uint8_t)(huart->Instance->RDW);
- if ((huart->ErrorCode & UART_RX_ERR_INT_FLAG) != RESET)
- {
- continue;
- }
- *(huart->pRxBuffPtr) = ch;
- huart->pRxBuffPtr++;
- huart->RxXferCount++;
- if (huart->RxXferSize > 0)
- {
- if (huart->RxXferCount == huart->RxXferSize)
- {
- huart->pRxBuffPtr -= huart->RxXferSize;
- HAL_UART_RxCpltCallback(huart);
- huart->RxXferCount = 0;
- }
- }
- else
- {
- if (count == 0)
- {
- huart->pRxBuffPtr -= huart->RxXferCount;
- HAL_UART_RxCpltCallback(huart);
- huart->RxXferCount = 0;
- }
- }
- }
- return HAL_OK;
- }
- else
- {
- return HAL_BUSY;
- }
- }
- static void UART_SetConfig(UART_HandleTypeDef *huart)
- {
- uint32_t value;
- uint32_t apbclk;
- wm_sys_clk sysclk;
- assert_param(IS_UART_BAUDRATE(huart->Init.BaudRate));
- assert_param(IS_UART_STOPBITS(huart->Init.StopBits));
- assert_param(IS_UART_PARITY(huart->Init.Parity));
- assert_param(IS_UART_WORD_LENGTH(huart->Init.WordLength));
- assert_param(IS_UART_MODE(huart->Init.Mode));
- assert_param(IS_UART_HARDWARE_FLOW_CONTROL(huart->Init.HwFlowCtl));
-
-
- MODIFY_REG(huart->Instance->LC,
- (uint32_t)(UART_LC_RE | UART_LC_TE | UART_LC_PS | UART_LC_PCE | UART_LC_STOP | UART_LC_DATAL),
- (uint32_t)(huart->Init.WordLength | huart->Init.Parity | huart->Init.Mode | huart->Init.StopBits));
- if (huart->Instance == UART2)
- {
- CLEAR_BIT(huart->Instance->LC, (1 << 24));
- }
-
- MODIFY_REG(huart->Instance->FC, (uint32_t)(UART_FC_RTSL | UART_FC_AFCE), (uint32_t)(UART_FC_RTSL_24 | huart->Init.HwFlowCtl));
-
- MODIFY_REG(huart->Instance->DMAC, (uint32_t)(UART_DMAC_RTO | UART_DMAC_RTOE), (uint32_t)((4 << 3) | UART_DMAC_RTOE));
-
- MODIFY_REG(huart->Instance->FIFOC,
- (uint32_t)(UART_FIFOC_RFL | UART_FIFOC_TFL | UART_FIFOC_RFRST | UART_FIFOC_TFRST),
- (uint32_t)(UART_FIFOC_RFL_16 | UART_FIFOC_TFL_16 | UART_FIFOC_RFRST | UART_FIFOC_TFRST));
-
- SystemClock_Get(&sysclk);
- apbclk = sysclk.apbclk * 1000000;
- value = (apbclk / (16 * (huart->Init.BaudRate)) - 1) |
- (((apbclk % ((huart->Init.BaudRate) * 16)) * 16 / ((huart->Init.BaudRate) * 16)) << 16);
-
- huart->Instance->BAUDR = value;
- }
|