📄 drv_uart.c
字号:
/***********************************************************************
* MODULE: drv_uart.c
* Description: Uart Driver
* Runtime Env: ARM7TDMI - KS32C50100
* Company:
* Change History:
* 03-28-02 Create (Yadong Wang)
***********************************************************************/
#include "common_types.h"
#include "samsung4510.h"
#include "main.h"
static void Uart1Isr(void);
tU16 DrvUartInit()
{
// 8 Bit Data, 1 stop bit, No parity, external clock
UARTLCON0 = 0x43;
// RxMode = IRQ, RxStatus IRQ enable, TxMode = IRQ
UARTCONT0 = 0x0D; //(UCON_RXM_INTREQ|UCON_TXM_INTREQ|UCON_RXSTAT_INT);
// Baud: Using external clock 29.4912MHz - 29491200/115200/16 = 16
UARTBRD0 = 0x0010; //0x00D0; //0x0001;
// 8 Bit Data, 1 stop bit, No parity, external clock
UARTLCON1 = 0x43;
// RxMode = IRQ, RxStatus IRQ enable, TxMode = IRQ
UARTCONT1 = 0x0D; //(UCON_RXM_INTREQ|UCON_TXM_INTREQ|UCON_RXSTAT_INT);
// Baud: Using external clock 29.4912MHz - 29491200/115200/16 = 16
UARTBRD1 = 0x0010; //0x00D0; //0x0001;
SysSetInterrupt(nUART1_RX_ERR_INT, Uart1Isr);
// Enable the INT, Enable_Int(nTIMER1_INT);
Enable_Int(nUART1_RX_ERR_INT);
return 0;
}
tU16 DrvUartWrite(tU8 *DataBuf, tU16 size)
{
int i;
for(i=0; i<size; i++)
{
while(!(UARTSTAT0 & 0x0040));
UARTTXH0 = DataBuf[i];
}
// wait the transmit complete
while(!(UARTSTAT0 & 0x0080));
return 0;
}
tU32 DrvUartRead(tU32 Dev, tU8 *data, tU32 ReqSize)
{
tU32 size;
tU8 *ptr;
ptr = data;
size = 0;
// reset timer, 4ms time out
DrvTimerArm(0, 4000);
while(1)
{
if (UARTSTAT0 & 0x0020)
{
*ptr++ = UARTRXB0;
size++;
// reset timer, 4ms time out
DrvTimerArm(0, 4000);
}
else
{
if (DrvTimerTimeout(0))
break;
}
}
return size;
}
tU16 DrvUartCntrl(tU16 cmd, void *data)
{
switch (cmd)
{
case 0: //UART_TX_DONE:
break;
case 1: //UART_SET_BAUD:
break;
default:
break;
}
return 0;
}
void Print(char *buf)
{
tU16 i;
tU8 UartBuf[100];
tS8 *ptr;
// Data convert and buffer copy
ptr = buf;
for(i=0; *ptr; ptr++)
{
UartBuf[i++] = *ptr;
if (*ptr == '\n')
UartBuf[i++] = '\r';
}
// Send the data
DrvUartWrite(UartBuf, i);
}
static void Uart1Isr()
{
tU8 ch;
INTPEND |= UART1_RX_ERR_INT;
if (UARTSTAT1 & 0x0020)
{
ch = UARTRXB1;
while(!(UARTSTAT1 & 0x0040));
UARTTXH1 = ch;
while(!(UARTSTAT1 & 0x0080));
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -