123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429 |
- /*
- File Name : yc_uart.c
- Author : Yichip
- Version : V1.0
- Date : 2019/12/4
- Description : UART encapsulation.
- */
- #include "yc_uart.h"
- #define uart_DMA_buf_len 1024
- uint8_t uart0_DMA_buf[uart_DMA_buf_len] = {0};
- uint8_t uart1_DMA_buf[uart_DMA_buf_len] = {0};
- #define RX_ENABLE_BIT 0
- #define RX_ENABLE (1 << RX_ENABLE_BIT)
- #define UART_DMA_ENABLE_BIT 31
- #define UART_DMA_ENABLE (1 << UART_DMA_ENABLE_BIT)
- #define TX_INTR_ENABLE_BIT 31
- #define TX_INTR_ENABLE ((uint32_t)1 << TX_INTR_ENABLE_BIT)
- #define Set_RxITNum_Mask 0xff00
- #define Statu_RxNum_Mask (uint32_t)0xffff0000
- void UART_AutoFlowCtrlCmd(UART_TypeDef UARTx, FunctionalState NewState)
- {
- _ASSERT(IS_UART(UARTx));
- if (NewState == ENABLE)
- {
- switch (UARTx)
- {
- case UART0:
- UART0_CTRL |= FlowCtrl_Enable;
- break;
- case UART1:
- UART1_CTRL |= FlowCtrl_Enable;
- break;
- }
- }
- else
- {
- switch (UARTx)
- {
- case UART0:
- UART0_CTRL &= (~FlowCtrl_Enable);
- break;
- case UART1:
- UART1_CTRL &= (~FlowCtrl_Enable);
- break;
- }
- }
- return;
- }
- void UART_ClearIT(UART_TypeDef UARTx)
- {
- uint8_t ITType = UART_GetITIdentity(UARTx);
- UART_ITConfig(UARTx, ITType, DISABLE);
- }
- void UART_DeInit(UART_TypeDef UARTx)
- {
- _ASSERT(IS_UART(UARTx));
- switch (UARTx)
- {
- case UART0:
- UART0_CTRL = 0;
- break;
- case UART1:
- UART1_CTRL = 0;
- break;
- }
- }
- void UART_DMASendBuf(UART_TypeDef UARTx, uint8_t *buf, int len)
- {
- _ASSERT(IS_UART(UARTx));
- _ASSERT(NULL != buf);
- _ASSERT((len < 0xffff));
- if (UARTx == UART0)
- {
- DMA_SRC_ADDR(DMACH_UART0) = (int)buf;
- DMA_LEN(DMACH_UART0) = (DMA_LEN(DMACH_UART0) & 0xffff) | len << 16;
- DMA_START(DMACH_UART0) = (1 << DMA_START_BIT);
- }
- else
- {
- DMA_SRC_ADDR(DMACH_UART1) = (int)buf;
- DMA_LEN(DMACH_UART1) = (DMA_LEN(DMACH_UART1) & 0xffff) | len << 16;
- DMA_START(DMACH_UART1) = (1 << DMA_START_BIT);
- }
- }
- uint8_t UART_GetITIdentity(UART_TypeDef UARTx)
- {
- uint8_t IT_Mode = 0;
- switch (UARTx)
- {
- case UART0:
- {
- if (((UART0_CTRL & Set_RxITNum_Mask) > 0) && ((UART0_STATUS >> 16) > 0))
- {
- IT_Mode = UART_IT_RX;
- }
- else
- {
- if ((UART0_CTRL & (uint32_t)TX_INTR_ENABLE))
- {
- IT_Mode = UART_IT_TX;
- }
- else
- {
- IT_Mode = FALSE;
- }
- }
- }
- break;
- case UART1:
- {
- if (((UART1_CTRL & Set_RxITNum_Mask) > 0) && ((UART1_STATUS >> 16) > 0))
- {
- IT_Mode = UART_IT_RX;
- }
- else
- {
- if (UART1_CTRL & TX_INTR_ENABLE)
- {
- IT_Mode = UART_IT_TX;
- }
- else
- {
- IT_Mode = FALSE;
- }
- }
- }
- break;
- }
- return IT_Mode;
- }
- void UART_Init(UART_TypeDef UARTx, UART_InitTypeDef *UART_InitStruct)
- {
- #define RESET_BAUD (1 << 7)
- #define AUTO_BAUD (0 << 7)
- uint32_t reg_value = 0;
- uint32_t temp_baudrate = 0;
- _ASSERT(IS_UART(UARTx));
- _ASSERT(IS_MODE(UART_InitStruct->Mode));
- _ASSERT(IS_BAUDRATE(UART_InitStruct->BaudRate));
- _ASSERT(IS_PARITY(UART_InitStruct->Parity));
- _ASSERT(IS_FlowCtrl(UART_InitStruct->FlowCtrl));
- _ASSERT(IS_USART_STOPBITS(UART_InitStruct->StopBits));
- temp_baudrate = ((48000000 / UART_InitStruct->BaudRate) << 16);
- reg_value = RX_ENABLE |
- UART_InitStruct->Parity |
- UART_InitStruct->DataBits |
- UART_InitStruct->StopBits |
- UART_InitStruct->FlowCtrl |
- UART_InitStruct->Mode |
- RESET_BAUD |
- temp_baudrate;
- if (UARTx == UART0)
- {
- UART0_CTRL = 0;
- DMA_DEST_ADDR(DMACH_UART0) = (int)uart0_DMA_buf;
- DMA_LEN(DMACH_UART0) = uart_DMA_buf_len;
- DMA_CONFIG(DMACH_UART0) = 1;
- DMA_START(DMACH_UART0) |= (1 << (DMA_RESET_BIT));
- DMA_START(DMACH_UART0) &= ~(1 << (DMA_RESET_BIT));
- UART0_CTRL = 0;
- UART0_CTRL = reg_value;
- }
- else
- {
- UART1_CTRL = 0;
- DMA_DEST_ADDR(DMACH_UART1) = (int)uart1_DMA_buf;
- DMA_LEN(DMACH_UART1) = uart_DMA_buf_len;
- DMA_CONFIG(DMACH_UART1) = 1;
- DMA_START(DMACH_UART1) |= (1 << (DMA_RESET_BIT));
- DMA_START(DMACH_UART1) &= ~(1 << (DMA_RESET_BIT));
- UART1_CTRL = 0;
- UART1_CTRL = reg_value;
- }
- return;
- }
- Boolean UART_IsRXFIFOFull(UART_TypeDef UARTx)
- {
- #define BITRXFULL 1
- _ASSERT(IS_UART(UARTx));
- if (UART0 == UARTx)
- {
- return (Boolean)(UART0_STATUS & (1 << BITRXFULL));
- }
- else
- {
- return (Boolean)(UART1_STATUS & (1 << BITRXFULL));
- }
- }
- Boolean UART_IsRXFIFONotEmpty(UART_TypeDef UARTx)
- {
- #define BITRXEMPTY 0
- _ASSERT(IS_UART(UARTx));
- if (UART0 == UARTx)
- {
- return (Boolean)((UART0_STATUS >> 16) ? 1 : 0);
- }
- else
- {
- return (Boolean)((UART1_STATUS >> 16) ? 1 : 0);
- }
- }
- Boolean UART_IsUARTBusy(UART_TypeDef UARTx)
- {
- _ASSERT(IS_UART(UARTx));
- if (UART0 == UARTx)
- {
- return (Boolean)(!(DMA_STATUS(DMACH_UART0) & 1));
- }
- else
- {
- return (Boolean)(!(DMA_STATUS(DMACH_UART1) & 1));
- }
- }
- void UART_ITConfig(UART_TypeDef UARTx, uint32_t UART_IT, FunctionalState NewState)
- {
- _ASSERT(IS_UART(UARTx));
- _ASSERT(IS_UART_IT(UART_IT));
- switch (UARTx)
- {
- case UART0:
- {
- if (UART_IT == UART_IT_RX)
- {
- if (NewState)
- {
- UART0_CTRL |= ((ENABLE << 8));
- }
- else
- {
- UART0_CTRL &= ~Set_RxITNum_Mask;
- }
- }
- else if (UART_IT == UART_IT_TX)
- {
- UART0_CTRL &= (~TX_INTR_ENABLE);
- UART0_CTRL |= (NewState << TX_INTR_ENABLE_BIT);
- }
- }
- break;
- case UART1:
- {
- if (UART_IT == UART_IT_RX)
- {
- if (NewState)
- {
- UART1_CTRL |= ((ENABLE << 8));
- }
- else
- {
- UART1_CTRL &= ~Set_RxITNum_Mask;
- }
- }
- else if (UART_IT == UART_IT_TX)
- {
- UART1_CTRL &= (uint32_t)~TX_INTR_ENABLE;
- UART1_CTRL |= (NewState << TX_INTR_ENABLE_BIT);
- }
- }
- break;
- }
- }
- uint8_t UART_ReceiveData(UART_TypeDef UARTx)
- {
- _ASSERT(IS_UART(UARTx));
- if (UART0 == UARTx)
- {
- return UART0_RDATA;
- }
- else
- {
- return UART1_RDATA;
- }
- }
- int UART_RecvBuf(UART_TypeDef UARTx, uint8_t *buf, int len)
- {
- uint32_t length = 0;
- volatile int *pstatus = NULL;
- volatile unsigned char *pdata = NULL;
- _ASSERT(IS_UART(UARTx));
- _ASSERT(NULL != buf);
- if (UART0 == UARTx)
- {
- pstatus = &UART0_STATUS;
- pdata = &UART0_RDATA;
- }
- else
- {
- pstatus = &UART1_STATUS;
- pdata = &UART1_RDATA;
- }
- while ((*pstatus >> 16) > 0)
- {
- if (length < len)
- {
- buf[length++] = *pdata;
- }
- else
- {
- break;
- }
- }
- return length;
- }
- void UART_SendBuf(UART_TypeDef UARTx, uint8_t *buf, int len)
- {
- _ASSERT(IS_UART(UARTx));
- _ASSERT(NULL != buf);
- _ASSERT((len < 0xffff));
- if (UARTx == UART0)
- {
- DMA_SRC_ADDR(DMACH_UART0) = (int)buf;
- DMA_LEN(DMACH_UART0) = (DMA_LEN(DMACH_UART0) & 0xffff) | len << 16;
- DMA_START(DMACH_UART0) = (1 << DMA_START_BIT);
- while ((!(DMA_STATUS(DMACH_UART0) & 1)));
- }
- else
- {
- DMA_SRC_ADDR(DMACH_UART1) = (int)buf;
- DMA_LEN(DMACH_UART1) = (DMA_LEN(DMACH_UART1) & 0xffff) | len << 16;
- DMA_START(DMACH_UART1) = (1 << DMA_START_BIT);
- while ((!(DMA_STATUS(DMACH_UART1) & 1)));
- }
- }
- void UART_SendData(UART_TypeDef UARTx, uint8_t Data)
- {
- uint8_t buf[1] = {Data};
- if (UARTx == UART0)
- {
- DMA_SRC_ADDR(DMACH_UART0) = (int)buf;
- DMA_LEN(DMACH_UART0) = (DMA_LEN(DMACH_UART0) & 0xffff) | 1 << 16;
- DMA_START(DMACH_UART0) = (1 << DMA_START_BIT);
- while (!(DMA_STATUS(DMACH_UART0) & 1));
- }
- else
- {
- DMA_SRC_ADDR(DMACH_UART1) = (int)buf;
- DMA_LEN(DMACH_UART1) = (DMA_LEN(DMACH_UART1) & 0xffff) | 1 << 16;
- DMA_START(DMACH_UART1) = (1 << DMA_START_BIT);
- while (!(DMA_STATUS(DMACH_UART1) & 1));
- }
- }
- void UART_SetITTimeout(UART_TypeDef UARTx, uint16_t timeout)
- {
- if (UART0 == UARTx)
- {
- UART0_INTR = timeout;
- }
- else
- {
- UART1_INTR = timeout;
- }
- }
- void UART_SetRxITNum(UART_TypeDef UARTx, uint8_t Bcnt)
- {
- _ASSERT(IS_UART(UARTx));
- if (UART0 == UARTx)
- {
- UART0_CTRL = (UART0_CTRL & 0xffff00ff) | ((Bcnt & 0xff) << 8);
- }
- else
- {
- UART1_CTRL = (UART1_CTRL & 0xffff00ff) | ((Bcnt & 0xff) << 8);
- }
- }
- void UART_StructInit(UART_InitTypeDef *UART_InitStruct)
- {
- UART_InitStruct->BaudRate = 9600;
- UART_InitStruct->DataBits = Databits_8b;
- UART_InitStruct->FlowCtrl = FlowCtrl_None;
- UART_InitStruct->Mode = Mode_duplex;
- UART_InitStruct->StopBits = StopBits_1;
- UART_InitStruct->Parity = 0;
- }
- uint16_t UART_ReceiveDataLen(UART_TypeDef UARTx)
- {
- _ASSERT(IS_UART(UARTx));
- if (UART0 == UARTx)
- {
- return (uint16_t)(UART0_STATUS >> 16);
- }
- else
- {
- return (uint16_t)(UART1_STATUS >> 16);
- }
- }
|