📄 uart.c
字号:
if(*uartRxStr == '\0') break;
uartRxStr++;
}
Uart_TxEmpty(0);
Uart_Port_Return(); // Restore GPIO port state
Uart_TxEmpty(1);
Delay(1000);
}
void Uart0_Rx_Interrupt_Fifo(void)
{
Uart_Port_Init(); // GPIO port init.
Uart_DataFormatSet(0,NP,1,8); // Channel 0, No Parity, One Stop Bit, 8-Bit Data
Uart_BaudRateSet(CH0,115200); // Channel 0, 115200BPS
uartRxStr=RxBUFFER;
RxBufferClear();
IsRxDone=FALSE;
Uart_FunctionSet(CH0,DISABLE,INTORPOL); // Tx -> Disable, Rx -> Interrupt
Uart_FifoLvSet(0,TX48BYTE,RX16BYTE); // Tx Trigger Level is not necessary
// Uart_FifoLvSet(0,TX48BYTE,RX32BYTE); // Tx Trigger Level is not necessary
// rUMCON0 = (1<<4); // AFC Enable
pISR_UART0 = (U32)UART0_Rx_Fifo_ISR;
rINTMSK &= ~(BIT_UART0);
rINTSUBMSK &= ~(BIT_SUB_RXD0|BIT_SUB_ERR0);
while(IsRxDone==FALSE);
rINTSUBMSK |= (BIT_SUB_RXD0|BIT_SUB_ERR0);
rINTMSK |= (BIT_UART0);
uartRxStr=RxBUFFER;
while(1) {
printf("%c",*uartRxStr);
if(*uartRxStr == '\0') break;
uartRxStr++;
}
Uart_TxEmpty(0);
Uart_Port_Return(); // Restore GPIO port state
Uart_TxEmpty(1);
Delay(1000);
}
void Uart0_Rx_DMA3(void)
{
int i;
Uart_Port_Init(); // GPIO port init.
printf("Only DMA Tx must be used !!!\n");
Uart_DataFormatSet(0,NP,1,8); // Channel 0, No Parity, One Stop Bit, 8-Bit Data
Uart_BaudRateSet(CH0,115200); // Channel 0, 115200BPS
Uart_FifoDisable(0);
uartRxStr=RxBUFFER;
RxBufferClear();
Uart_Rx_DMA3_Set();
Uart_FunctionSet(CH0,DISABLE,DMAREQ0); // Rx -> DMA Request, Tx -> Disable
while(IsRxDone==FALSE);
rINTMSK|=(BIT_DMA3);
// for(i=0;i<96;i++)
for(i=0;i<96;i++)
printf("%c",*(uartRxStr+i));
Uart_TxEmpty(0);
Uart_Port_Return(); // Restore GPIO port state
Uart_TxEmpty(1);
Delay(1000);
}
void Uart0_Rx_DMA3_Fifo(void)
{
int i;
Uart_Port_Init(); // GPIO port init.
printf("Only DMA Tx must be used !!!\n");
Uart_DataFormatSet(0,NP,1,8); // Channel 0, No Parity, One Stop Bit, 8-Bit Data
Uart_BaudRateSet(CH0,115200); // Channel 0, 115200BPS
uartRxStr=RxBUFFER;
RxBufferClear();
Uart_Rx_DMA3_Set();
Uart_FunctionSet(CH0,DISABLE,DMAREQ0); // Rx -> DMA Request, Tx -> Disable
rUCON0 |= (3<<8); // Tx, Rx => Interrupt Type is Level
Uart_FifoLvSet(0,TX48BYTE,RX16BYTE); // Rx Trigger Level is not necessary
while(IsRxDone==FALSE);
rINTMSK|=(BIT_DMA3);
for(i=0;i<96;i++)
printf("%c",*(uartRxStr+i));
Uart_TxEmpty(0);
Uart_Port_Return(); // Restore GPIO port state
Uart_TxEmpty(1);
Delay(1000);
}
void Uart0_Tx_Fifo_TrigLv(void)
{
U32 in;
printf("This Test Item is Tx FIFO Trigger Level Test !!!\n");
printf("The Rx Trriger Buffer is 1Byte!\n");
printf("The String Size is 236Byte\n");
do {
printf("Select FIFO Trigger Level : [0] Empty [1] 16-byte [2] 32-byte [3] 48-byte =>");
in=GetIntNum();
} while(in>3);
switch(in) {
case 0:
printf("Tx FIFO Trigger Level [Empty]\n");
break;
case 1:
printf("Tx FIFO Trigger Level [16-byte]\n");
break;
case 2:
printf("Tx FIFO Trigger Level [32-byte]\n");
break;
case 3:
printf("Tx FIFO Trigger Level [48-byte]\n");
break;
}
Uart_Port_Init(); // GPIO port init.
Uart_DataFormatSet(0,NP,1,8); // Channel 0, No Parity, One Stop Bit, 8-Bit Data
Uart_FunctionSet(CH0,INTORPOL,DISABLE); // Tx -> Polling, Rx -> Disable
Uart_BaudRateSet(CH0,115200); // Channel 0, 115200BPS
// Uart_BaudRateSet(CH0,96000); // Channel 0, 115200BPS
Uart_FifoLvSet(0,in,RX1BYTE); // Rx Trigger Level is not necessary
uartTxStr=TestString3;
RxBufferClear();
IsTxDone=FALSE;
pISR_UART0 = (U32)UART0_Tx_Fifo_ISR;
rINTMSK &= ~(BIT_UART0);
rINTSUBMSK &= ~(BIT_SUB_TXD0);
while(IsTxDone==FALSE);
rINTSUBMSK |= (BIT_SUB_TXD0);
rINTMSK |= (BIT_UART0);
// printf ("Interrupt Number = %d",iIRQ_TX);
// iIRQ_TX = 0;
Uart_Port_Return(); // Restore GPIO port state
}
void Uart0_Tx_Fifo_TrigLv_Jung(void)
{
U32 in;
U32 iIndex;
char cIndex = 0;
Uart_Port_Init();
Uart_DataFormatSet(0,NP,1,8); // Channel 0, No Parity, One Stop Bit, 8-Bit Data
Uart_FunctionSet(CH0,INTORPOL,DISABLE);
Uart_BaudRateSet(CH0,115200);
Uart_FifoDisable(0);
//UART1 Setting
Uart_DataFormatSet(1,NP,1,8); // Channel 1, No Parity, One Stop Bit, 8-Bit Data
Uart_FunctionSet(CH1,DISABLE,INTORPOL);
Uart_BaudRateSet(CH1,115200);
Uart_FifoEnable(1);
rUCON1 &= ~(1<<7); //Time Interrupt Disable
Uart_FifoLvSet(1,0,2); // Rx Trigger Level is 16Byte
RxBufferClear();
IsRxDone=FALSE;
pISR_UART1 = (U32)UART1_Rx_Fifo_ISR_Jung;
rINTMSK &= ~(BIT_UART1);
rINTSUBMSK &= ~(BIT_SUB_RXD1);
uartRxStr=RxBUFFER;
while(1)
{
while(!(rUTRSTAT1 & 0x1)); //Receive data ready
*uartRxStr = RdURXH1();
uartRxStr++;
if (IsRxDone == TRUE) break;
}
rINTSUBMSK |= (BIT_SUB_RXD1);
rINTMSK |= (BIT_UART1);
printf("IRQ == %d\n",iIRQ);
printf("Addreas == %x\n", uartRxStr );
uartTxStr = RxBUFFER;
printf("Check Memory\n");
getchar();
while(1)
{
WrUTXH0(*uartTxStr);
if ( *uartTxStr == '\0' )
{
break;
}
uartTxStr++;
}
Uart_Port_Return(); // Restore GPIO port state
}
void Uart0_Rx_Fifo_TrigLv(void)
{
U32 in,i;
printf("This Test Item is Rx FIFO Trigger Level Test !!!\n");
printf("The Tx Trigger Buffer is 48Byte!\n");
printf("The String Size is 236Byte\n");
do {
printf("Select FIFO Trigger Level : [0] 1-byte [1] 8-byte [2] 16-byte [3] 32-byte =>");
in=GetIntNum();
} while(in>3);
switch(in) {
case 0:
printf("Rx FIFO Trigger Level [1-byte]\n");
break;
case 1:
printf("Rx FIFO Trigger Level [8-byte]\n");
break;
case 2:
printf("Rx FIFO Trigger Level [16-byte]\n");
break;
case 3:
printf("Rx FIFO Trigger Level [32-byte]\n");
break;
}
Uart_Port_Init(); // GPIO port init.
Uart_DataFormatSet(0,NP,1,8); // Channel 0, No Parity, One Stop Bit, 8-Bit Data
Uart_BaudRateSet(CH0,115200); // Channel 0, 115200BPS
// Uart_BaudRateSet(CH0,96000); // Channel 0, 96000BPS
uartRxStr=RxBUFFER;
RxBufferClear();
IsRxDone=FALSE;
Uart_FunctionSet(CH0,DISABLE,INTORPOL); // Tx -> Disable, Rx -> INT or POLL
rUCON0 &= ~(1<<7); //Time Interrupt Disable
Uart_FifoLvSet(0,TX48BYTE,in); // Rx Trigger Level is not necessary
pISR_UART0 = (U32)UART0_Rx_Fifo_ISR;
rINTMSK &= ~(BIT_UART0);
rINTSUBMSK &= ~(BIT_SUB_RXD0|BIT_SUB_ERR0);
while(1) {
if(Uart_GetKey()) {
*uartRxStr='\0';
// printf("IRQ Number = %d\n", iIRQ);
break;
}
}
rINTSUBMSK |= (BIT_SUB_RXD0|BIT_SUB_ERR0);
rINTMSK |= (BIT_UART0);
uartRxStr=RxBUFFER;
while(1) {
printf("%c",*uartRxStr);
if(*uartRxStr == '\0') break;
uartRxStr++;
}
Uart_Port_Return(); // Restore GPIO port state
Uart_TxEmpty(1);
Delay(1000);
iIRQ = 0;
}
void Uart0_TxRx_LoopBack_Test(void)
{
U32 TxDone, RxDone;
Uart_Port_Init(); // GPIO port init.
// SelectUartClockSource(0,USYSCLK);
// SelectUartClockSource(0,UPCLK);
Uart_DataFormatSet(0,NP,1,8); // Channel 0, No Parity, One Stop Bit, 8-Bit Data
Uart_FunctionSet(CH0,INTORPOL,INTORPOL); // Tx -> Polling, Rx -> Disable
Uart_BaudRateSet(CH0,115200); // Channel 0, 115200BPS
Uart_FifoDisable(0);
rUCON0 |= (1<<5); // Loopback mode
uartTxStr=TestString1;
uartRxStr=RxBUFFER;
RxBufferClear();
TxDone=1;
RxDone=1;
while(TxDone||RxDone) {
if(TxDone) {
if(rUTRSTAT0&0x4) {
WrUTXH0(*uartTxStr);
if(*uartTxStr == '\0') TxDone=0;
uartTxStr++;
}
}
if(RxDone) {
if(rUTRSTAT0&0x1) {
*uartRxStr=RdURXH0();
if(*uartRxStr == '\0') RxDone=0;
uartRxStr++;
}
}
}
uartRxStr=RxBUFFER;
// SelectUartClockSource(0,UPCLK);
Uart_Port_Return(); // Restore GPIO port state
while(1) {
printf("%c",*uartRxStr);
if(*uartRxStr == '\0') break;
uartRxStr++;
}
}
void Uart0_Afc_nRTS_TrigLv(void)
{
Uart_Port_Init(); // GPIO port init.
Uart_DataFormatSet(0,NP,1,8); // Channel 0, No Parity, One Stop Bit, 8-Bit Data
Uart_BaudRateSet(CH0,115200); // Channel 0, 115200BPS
uartRxStr=RxBUFFER;
RxBufferClear();
IsRxDone=FALSE;
Uart_FunctionSet(CH0,DISABLE,INTORPOL); // Tx -> Disable, Rx -> Interrupt
Uart_FifoLvSet(0,TX48BYTE,RX16BYTE); // Tx Trigger Level is not necessary
rUMCON0 = (0<<5)|(1<<4); // AFC Enable
pISR_UART0 = (U32)UART0_Rx_Fifo_ISR;
rINTMSK &= ~(BIT_UART0);
rINTSUBMSK &= ~(BIT_SUB_RXD0|BIT_SUB_ERR0);
while(IsRxDone==FALSE) {
if(Uart_GetKey()) break;
}
rINTSUBMSK |= (BIT_SUB_RXD0|BIT_SUB_ERR0);
rINTMSK |= (BIT_UART0);
uartRxStr=RxBUFFER;
while(1) {
printf("%c",*uartRxStr);
if(*uartRxStr == '\0') break;
uartRxStr++;
}
Uart_Port_Return(); // Restore GPIO port state
Delay(200);
}
void Uart0_Tx_MaxSpeed(void)
{
Uart_Port_Init(); // GPIO port init.
Uart_DataFormatSet(0,NP,1,8); // Channel 0, No Parity, One Stop Bit, 8-Bit Data
Uart_FunctionSet(CH0,INTORPOL,DISABLE); // Tx -> Polling, Rx -> Disable
Uart_BaudRateSet(CH0,921600); // Channel 0, 460800BPS
Uart_FifoLvSet(0,TX48BYTE,RX1BYTE); // Rx Trigger Level is not necessary
// rUMCON0 = (1<<4); // AFC Enable
// uartTxStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890->UART Tx int with fifo test is First!!!!\r\n1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ->UART Tx int with fifo test is Second!!!!\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890->UART Tx int with fifo test is Third!!!!\r\n";
uartTxStr=TestString3;
IsTxDone=FALSE;
pISR_UART0 = (U32)UART0_Tx_Fifo_ISR;
rINTMSK &= ~(BIT_UART0);
rINTSUBMSK &= ~(BIT_SUB_TXD0);
while(IsTxDone==FALSE);
rINTSUBMSK |= (BIT_SUB_TXD0);
rINTMSK |= (BIT_UART0);
Uart_Port_Return(); // Restore GPIO port state
}
void Uart0_Rx_MaxSpeed(void)
{
Uart_Port_Init(); // GPIO port init.
Uart_DataFormatSet(0,NP,1,8); // Channel 0, No Parity, One Stop Bit, 8-Bit Data
Uart_BaudRateSet(CH0,921600); // Channel 0, 115200BPS
uartRxStr=RxBUFFER;
RxBufferClear();
IsRxDone=FALSE;
Uart_FunctionSet(CH0,DISABLE,INTORPOL); // Tx -> Disable, Rx -> Interrupt
Uart_FifoLvSet(0,TX48BYTE,RX16BYTE); // Tx Trigger Level is not necessary
// rUMCON0 = (1<<4); // AFC Enable
pISR_UART0 = (U32)UART0_Rx_Fifo_ISR;
rINTMSK &= ~(BIT_UART0);
rINTSUBMSK &= ~(BIT_SUB_RXD0|BIT_SUB_ERR0);
while(IsRxDone==FALSE);
rINTSUBMSK |= (BIT_SUB_RXD0|BIT_SUB_ERR0);
rINTMSK |= (BIT_UART0);
uartRxStr=RxBUFFER;
while(1) {
printf("%c",*uartRxStr);
if(*uartRxStr == '\0') break;
uartRxStr++;
}
Uart_TxEmpty(0);
Uart_Port_Return(); // Restore GPIO port state
Uart_TxEmpty(1);
Delay(1000);
}
//=============================================================================================//
void Uart_Tx_DMA1_Set(void)
{
IsTxDone=FALSE; // DMA is not done
pISR_DMA1 = (unsigned)Uart_Dma1Tx_Int; // DMA1 ISR Address Mapping
rINTMSK&=~(BIT_DMA1); // Interrupt Mask Disable, Interrupt Enable
rDISRC1=(unsigned)uartTxStr; //Source Address of Memory
rDISRCC1=(0<<1)|(0); //AHB(Memory), inc
rDIDST1=(unsigned)0x50000020; //Destination Address of UTXH0 Register
rDIDSTC1=(1<<1)|(1); //APB(SPI), fix
rDCON1=(1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(1<<22)|(0<<20)|(96);//96
rDMAREQSEL1=(19<<1)|(1<<0); // HWSRC SPI0 TX
rDMASKTRIG1=(0<<2)|(1<<1)|(0); //run, DMA1 channel on, no-sw trigger
}
void Uart_Rx_DMA3_Set(void)
{
IsRxDone=FALSE; // DMA is not done
pISR_DMA3 = (unsigned)Uart_Dma3Rx_Int;
rINTMSK&=~(BIT_DMA3);
rDISRC3=(unsigned)0x50000024; //Address of URXH0 Register
rDISRCC3=(1<<1)|(1); //APB(SPI), fix
rDIDST3=(unsigned)uartRxStr; //Address of Memory
rDIDSTC3=(0<<1)|(0); //AHB(Memory), inc
rDCON3=(1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(1<<22)|(0<<20)|(96);
rDMAREQSEL3=(19<<1)|(1<<0);
rDMASKTRIG3=(0<<2)|(1<<1)|(0); //run, DMA1 channel on, no-sw trigger
}
//=============================================================================================//
void __irq UART0_Tx_ISR(void)
{
rINTSUBMSK |= (BIT_SUB_TXD0);
rINTMSK |= (BIT_UART0);
rSUBSRCPND=BIT_SUB_TXD0; // Clear Sub int pending
ClearPending(BIT_UART0); // Clear source pending
if(*uartTxStr == '\0') {
WrUTXH0(*uartTxStr);
IsTxDone=TRUE;
}
else {
WrUTXH0(*uartTxStr);
uartTxStr++;
}
rINTMSK &= ~(BIT_UART0);
rINTSUBMSK &= ~(BIT_SUB_TXD0);
}
#if 0
void __irq UART0_Tx_ISR(void)
{
rINTSUBMSK |= (BIT_SUB_TXD0);
rINTMSK |= (BIT_UART0);
rSUBSRCPND=BIT_SUB_TXD0; // Clear Sub int pending
ClearPending(BIT_UART0); // Clear source pending
WrUTXH0(*uartTxStr);
if(*uartTxStr == '\0')
IsTxDone=TRUE;
else {
uartTxStr++;
rINTMSK &= ~(BIT_UART0);
rINTSUBMSK &= ~(BIT_SUB_TXD0);
}
}
#endif
void __irq UART0_Tx_Fifo_ISR(void)
{
rINTSUBMSK |= (BIT_SUB_TXD0);
rINTMSK |= (BIT_UART0);
rSUBSRCPND=BIT_SUB_TXD0; // Clear Sub int pending
ClearPending(BIT_UART0); // Clear source pending
while(!(rUFSTAT0&(1<<14)))
{
WrUTXH0(*uartTxStr);
if(*uartTxStr == '\0')
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -