📄 drv_uart.c
字号:
#include <assert.h>
#include "drv_defs.h"
#include "drv_extr.h"
#include "kal.h"
extern KL_mailbox_t mailbox;
/*------------------------------------------------------------------------------
Function: uart_init
Date: 2005-11-21
Description: Initialization of uart
Arguments: None
Return Value: None
------------------------------------------------------------------------------*/
void uart_init(void)
{
/*------------------ uart1 ----------------------*/
ULCON1 = 0x00000003; /* 8bit data, 1bit stop, No parity */
UCON1 = 0x000003C5; /* use PCLK, level triger, Enable time out and
error interrupt, no loopback and break,
use interrupt no DMA */
UFCON1 = 0x000000A1; /* 32-byte for TX, 16-byte for RX, enable FIFO */
UBRDIV1 = 0x0000001A; /* config div for 115200 from 50MHz */
/* enable UART1's pin */
{
unsigned int port_con; /* for save port configure */
port_con = GPHCON; /* get port H configuration */
port_con &= 0xFFFFF0FF; /* clear UART1 pin setting */
port_con |= 0xA00; /* enable UART1 pin */
GPHCON = port_con; /* configure it */
}
irq_clear_subsrc(INT_TXD1);
irq_clear_subsrc(INT_RXD1);
irq_clear_subsrc(INT_ERR1);
irq_clear(IRQ_VECTOR_UART1);
irq_disable_submask(INT_TXD1);
irq_disable_submask(INT_RXD1);
irq_disable_submask(INT_ERR1);
irq_enable_submask(INT_RXD1);
irq_enable(IRQ_VECTOR_UART1); /* enable the irq */
}
/*------------------------------------------------------------------------------
Function: uart1_send_char
Date: 2005-11-21
Description: send a char by uart1, it will be used by printf
Arguments:
ch pointer to the char need to send
Return Value: None
------------------------------------------------------------------------------*/
void uart1_send_char( char *ch )
{
unsigned int fifo_staus = 0; /* uart fifo status */
fifo_staus = UFSTAT1; /* get uart1 fifo status */
while(fifo_staus & (1<<9)) /* fifo is full */
{
fifo_staus = UFSTAT1; /* get uart1 fifo status */
}
UTXH1 = *ch; /* send the char */
}
void uart1_LISR(int vector)
{
Status s;
int num = 0;
int i = 0;
int subsrc, submsk;
char tmp;
submsk = ~(INTSUBMSK);
subsrc = SUBSRCPND;
submsk &= subsrc;
if (submsk & (1<<INT_RXD1)) /* INT_RXD */
{
num = UFSTAT1 & 0xF; /* how many data in RX FIFO */
for (i = 0; i < num; i++)
{
tmp = URXH1;
s = KL_SendMail(&mailbox, (void *)tmp, KL_SUSPEND_NEVER);
assert(s == KL_SUCCESS);
}
irq_clear_subsrc(INT_RXD1);
}
irq_clear(IRQ_VECTOR_UART1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -