Files

398 lines
12 KiB
C
Raw Permalink Normal View History

/*
******************************************************************************
* @file apt32f102_uart.c
* @author APT AE Team
* @version V1.15
* @date 2022/09/05
******************************************************************************
*THIS SOFTWARE WHICH IS FOR ILLUSTRATIVE PURPOSES ONLY WHICH PROVIDES
*CUSTOMER WITH CODING INFORMATION REGARDING THEIR PRODUCTS.
*APT CHIP SHALL NOT BE HELD RESPONSIBILITY ADN LIABILITY FOR ANY DIRECT,
*INDIRECT DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT OF
*SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION
*CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.AND APT CHIP RESERVES
*THE RIGHT TO MAKE CHANGES IN THE SOFTWARE WITHOUT NOTIFICATION
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "apt32f102_uart.h"
/* define --------------------------------------------------------------------*/
volatile U8_T RxDataFlag=0;
volatile U8_T TxDataFlag=0;
volatile U8_T f_Uart_send_Complete;
volatile U16_T Uart_send_Length_temp;
volatile U8_T Uart_send_Length;
volatile U8_T Uart_buffer[UART_BUFSIZE];
/* externs--------------------------------------------------------------------*/
/*************************************************************/
//UART RESET,CLEAR ALL REGISTER
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/
void UART0_DeInit(void)
{
UART0->DATA = UART_RESET_VALUE;
UART0->SR = UART_RESET_VALUE;
UART0->CTRL = UART_RESET_VALUE;
UART0->ISR = UART_RESET_VALUE;
UART0->BRDIV =UART_RESET_VALUE;
}
void UART1_DeInit(void)
{
UART1->DATA = UART_RESET_VALUE;
UART1->SR = UART_RESET_VALUE;
UART1->CTRL = UART_RESET_VALUE;
UART1->ISR = UART_RESET_VALUE;
UART1->BRDIV =UART_RESET_VALUE;
}
void UART2_DeInit(void)
{
UART2->DATA = UART_RESET_VALUE;
UART2->SR = UART_RESET_VALUE;
UART2->CTRL = UART_RESET_VALUE;
UART2->ISR = UART_RESET_VALUE;
UART2->BRDIV =UART_RESET_VALUE;
}
/*************************************************************/
//UART0 Interrupt enable
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/
void UART0_Int_Enable(void)
{
UART0->ISR=0x0F; //clear UART0 INT status
INTC_ISER_WRITE(UART0_INT); //INT Vector Enable UART0/1 Interrupt in CK802
}
/*************************************************************/
//UART0 Interrupt enable
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/
void UART0_Int_Disable(void)
{
INTC_ICER_WRITE(UART0_INT); //INT Vector Enable UART0/1 Interrupt in CK802
}
/*************************************************************/
//UART1 Interrupt enable
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/
void UART1_Int_Enable(void)
{
UART1->ISR=0x0F; //clear UART1 INT status
INTC_ISER_WRITE(UART1_INT); //INT Vector Enable UART0/1 Interrupt in CK802
}
/*************************************************************/
//UART1 Interrupt Disable
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/
void UART1_Int_Disable(void)
{
INTC_ICER_WRITE(UART1_INT); //INT Vector Enable UART0/1 Interrupt in CK802
}
/*************************************************************/
//UART1 Interrupt enable
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/
void UART2_Int_Enable(void)
{
UART2->ISR=0x0F; //clear UART1 INT status
INTC_ISER_WRITE(UART2_INT); //INT Vector Enable UART0/1 Interrupt in CK802
}
/*************************************************************/
//UART1 Interrupt Disable
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/
void UART2_Int_Disable(void)
{
INTC_ICER_WRITE(UART2_INT); //INT Vector Enable UART0/1 Interrupt in CK802
}
/*************************************************************/
//UART0 Wake up enable
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/
void UART0_WakeUp_Enable(void)
{
INTC_IWER_WRITE(UART0_INT);
}
/*************************************************************/
//UART0 Wake up enable
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/
void UART0_WakeUp_Disable(void)
{
INTC_IWDR_WRITE(UART0_INT);
}
/*************************************************************/
//UART0 Wake up enable
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/
void UART1_WakeUp_Enable(void)
{
INTC_IWER_WRITE(UART1_INT);
}
/*************************************************************/
//UART0 Wake up enable
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/
void UART1_WakeUp_Disable(void)
{
INTC_IWDR_WRITE(UART1_INT);
}
/*************************************************************/
//UART0 Wake up enable
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/
void UART2_WakeUp_Enable(void)
{
INTC_IWER_WRITE(UART2_INT);
}
/*************************************************************/
//UART0 Wake up enable
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/
void UART2_WakeUp_Disable(void)
{
INTC_IWDR_WRITE(UART2_INT);
}
/*************************************************************/
//UART IO Init
//EntryParameter:IO_UARTX,UART_IO_G
//IO_UARTX:IO_UART0,IO_UART1
//UART_IO_G:0 1
//ReturnValue:NONE
/*************************************************************/
void UART_IO_Init(UART_NUM_TypeDef IO_UART_NUM , U8_T UART_IO_G)
{
if (IO_UART_NUM==IO_UART0)
{
if(UART_IO_G==0)
{
GPIOA0->CONLR = (GPIOA0->CONLR&0XFFFFFFF0) | 0x00000004; //PA0.1->RXD0, PA0.0->TXD0
}
else if(UART_IO_G==1)
{
GPIOA0->CONLR = (GPIOA0->CONLR&0XFF0FFFFF) | 0x00700000; //PA0.5->RXD0, PA0.12->TXD0
GPIOA0->CONHR = (GPIOA0->CONHR&0XFFF0FFFF) | 0x00070000;
}
}
if (IO_UART_NUM==IO_UART1)
{
if(UART_IO_G==0)
{
GPIOB0->CONLR = (GPIOB0->CONLR&0XFFFFFFF0) | 0x00000007; //PA0.13->RXD1, PB0.0->TXD1
GPIOA0->CONHR = (GPIOA0->CONHR&0XFF0FFFFF) | 0x00700000;
}
else if(UART_IO_G==1)
{
GPIOA0->CONLR = (GPIOA0->CONLR&0XFFF00FFF) | 0X00077000; //PA0.4->RXD1, PA0.3->TXD1
}
else if(UART_IO_G==2)
{
GPIOA0->CONHR = (GPIOA0->CONHR&0X00FFFFFF) | 0X77000000; //PA0.15->RXD1, PA0.14->TXD1
}
}
if (IO_UART_NUM==IO_UART2)
{
if(UART_IO_G==0)
{
GPIOA0->CONLR = (GPIOA0->CONLR&0XFFFFFF00) | 0x00000077; //PA0.0->RXD2, PA0.1->TXD2
}
else if(UART_IO_G==1)
{
GPIOA0->CONLR = (GPIOA0->CONLR&0X00FFFFFF) | 0X77000000; //PA0.7->RXD2, PA0.6->TXD2
}
else if(UART_IO_G==2)
{
GPIOB0->CONLR = (GPIOB0->CONLR&0XFF00FFFF) | 0X00660000; //PB0.5->RXD2, PB0.4->TXD2
}
}
}
/*************************************************************/
//UART Init
//EntryParameter:UART0,UART1,UART2 ,baudrate_u16
//e.g:
//sys_clk@24MHz, 24/4(div)=6MHz, 6000000/115200bps=52,baudrate_u16=52
//sys_clk@24MHz, 24/2(div)=12MHz, 12000000/115200bps=104,baudrate_u16=104
//ReturnValue:NONE
/*************************************************************/
void UARTInit(CSP_UART_T *uart,U16_T baudrate_u16,UART_PAR_TypeDef PAR_DAT)
{
// Set Transmitter Enable
CSP_UART_SET_CTRL(uart, UART_TX | UART_RX |PAR_DAT);
// Set Baudrate
CSP_UART_SET_BRDIV(uart, baudrate_u16);
}
/*************************************************************/
//UART init and enable RX,TX interrupt
//EntryParameter:UART0,UART1,UART2 ,baudrate_u16
//ReturnValue:NONE
/*************************************************************/
void UARTInitRxTxIntEn(CSP_UART_T *uart,U16_T baudrate_u16,UART_PAR_TypeDef PAR_DAT)
{
// Set Transmitter Enable
CSP_UART_SET_CTRL(uart, UART_TX | UART_RX | UART_RX_INT | UART_TX_INT|PAR_DAT);
// Set Baudrate
CSP_UART_SET_BRDIV(uart, baudrate_u16);
}
/*************************************************************/
//UART init and enable RX interrupt
//EntryParameter:UART0,UART1,UART2 ,baudrate_u16
//ReturnValue:NONE
/*************************************************************/
void UARTInitRxIntEn(CSP_UART_T *uart,U16_T baudrate_u16,UART_PAR_TypeDef PAR_DAT)
{
// Set Transmitter Enable
CSP_UART_SET_CTRL(uart, UART_TX | UART_RX | UART_RX_INT |PAR_DAT);
// Set Baudrate
CSP_UART_SET_BRDIV(uart, baudrate_u16);
}
/*************************************************************/
//UART Close
//EntryParameter:UART0,UART1,UART2
//ReturnValue:NONE
/*************************************************************/
void UARTClose(CSP_UART_T *uart)
{
// Set Transmitter Disable
CSP_UART_SET_CTRL(uart, 0x00);
}
/*************************************************************/
//UART TX Byte loop send
//EntryParameter:UART0,UART1,UART2,txdata_u8
//ReturnValue:NONE
/*************************************************************/
void UARTTxByte(CSP_UART_T *uart,U8_T txdata_u8)
{
unsigned int DataI;
// Write the transmit buffer
CSP_UART_SET_DATA(uart,txdata_u8);
do
{
DataI = CSP_UART_GET_SR(uart);
DataI = DataI & UART_TX_FULL;
}
while(DataI == UART_TX_FULL); //Loop when tx is full
}
/*************************************************************/
//UART Transmit
//EntryParameter:UART0,UART1,UART2,sourceAddress_u16,length_u16
//ReturnValue:NONE
/*************************************************************/
void UARTTransmit(CSP_UART_T *uart,U8_T *sourceAddress_u16,U16_T length_u16)
{
unsigned int DataI,DataJ;
for(DataJ = 0;DataJ < length_u16 ;DataJ ++)
{
CSP_UART_SET_DATA(uart,*sourceAddress_u16++);
do{
DataI = CSP_UART_GET_SR(uart);
DataI = DataI & UART_TX_FULL;
}while(DataI == UART_TX_FULL); //Loop when tx is full
}
}
/*************************************************************/
//UART INT Transmit
//EntryParameter:
//ReturnValue:NONE
/*************************************************************/
void UARTTTransmit_data_set(CSP_UART_T *uart )
{
if(!f_Uart_send_Complete)
{
f_Uart_send_Complete=1;
Uart_send_Length_temp++;
CSP_UART_SET_DATA(uart,Uart_buffer[0]);
}
}
void UARTTransmit_INT_Send(CSP_UART_T *uart )
{
if(f_Uart_send_Complete)
{
if(Uart_send_Length_temp>=Uart_send_Length)
{
f_Uart_send_Complete=0;
Uart_send_Length_temp=0;
}
else
{
CSP_UART_SET_DATA(uart,Uart_buffer[Uart_send_Length_temp++]);
}
}
}
/*************************************************************/
//UART RX Byte
//EntryParameter:UART0,UART1,UART2,Rxdata_u16
//ReturnValue:NONE
/*************************************************************/
U16_T UARTRxByte(CSP_UART_T *uart,U8_T *Rxdata_u16)
{
unsigned int DataI;
DataI = CSP_UART_GET_SR(uart);
DataI = DataI & UART_RX_FULL;
if(DataI != UART_RX_FULL) //Loop when rx is not full
return FALSE;
else
{
*Rxdata_u16 = CSP_UART_GET_DATA(uart);
return TRUE;
}
}
/*************************************************************/
//UART RX Return Byte
//EntryParameter:UART0,UART1,UART2
//ReturnValue:(uart)->DATA
/*************************************************************/
U8_T UART_ReturnRxByte(CSP_UART_T *uart)
{
RxDataFlag = FALSE;
while(RxDataFlag != TRUE);
return CSP_UART_GET_DATA(uart);
}
/*************************************************************/
//UART Receive
//EntryParameter:UART0,UART1,UART2destAddress_u16length_u16
//ReturnValue:FALSE/TRUE
/*************************************************************/
U16_T UARTReceive(CSP_UART_T *uart,U8_T *destAddress_u16,U16_T length_u16)
{
unsigned int DataI,DataJ,LoopTime;
DataJ = 0;
LoopTime = 0;
do{
DataI = CSP_UART_GET_SR(uart);
DataI = DataI & UART_RX_FULL;
if(DataI == UART_RX_FULL) //Loop when rx is full
{
*destAddress_u16++ = CSP_UART_GET_DATA(uart);
DataJ++;
LoopTime = 0;
}
if(LoopTime ++ >= 0xfff0)
return FALSE;
}while(DataJ < length_u16);
return TRUE;
}