📄 uart.c
字号:
#include "hardware.h"
#include "hardware_reg.h"
#include "HA_typedef.h"
#include "stdio.h"
int uart1_reset_value_test(void)
{
write_reg(UART1_IER, 0x00);
write_reg(UART1_FCR, 0xC0);
write_reg(UART1_LCR, 0x03);
write_reg(UART1_MCR, 0x00);
if(read_reg(UART1_IIR) != 0xCF)
printf("UART_IIR ERROR!\n");
if(read_reg(UART1_LCR) != 0x03)
printf("UART_LCR ERROTR!\n");
if(read_reg(UART1_LSR) != 0x00)
printf("UART_LSR ERROR!\n");
if(read_reg(UART1_MSR) != 0x00)
printf("UART_MSR ERROR!\n");
if((read_reg(UART1_LCR) &= (0x1 << 7) ) != 0) //LCR[7]=1, divisor latches accessed
{
if(read_reg(UART1_DLL) != 0x00)
printf("UART_DLL ERROR!\n");
if(read_reg(UART1_DLH) != 0x00)
printf("UART_DLH ERROR!\n");
}
}
/********************************************************************
* PARAMETER: sysclk: 10(10MHZ)
* 18(18.07297MHZ)
* 21(21.6392MHZ)
* baudrate: 115200,57600,56000,43000,38400,19200,9600
* databit: 5,6,7,8
* trigerlevel: 1,4,8,14
* RETURN: HA_EOK
********************************************************************/
int init_uart1(U32 sysclk, U32 baudrate, U32 databit, U32 trigerlevel)
{
U32 baud, bit, triger, baudh, baudl;
baud = sysclk/16/baudrate;
baudh = baud >> 8;
baudl = baud & 0xff;
switch(databit)
{
case 5: bit = 0x80;
break;
case 6: bit = 0x81;
break;
case 7: bit = 0x82;
break;
case 8: bit = 0x83;
break;
default: ;
break;
}
*(RP)UART1_LCR = bit; //divisor latch has been accessed
*(RP)UART1_DLH = baudh;
*(RP)UART1_DLL = baudl;
read_reg(UART1_LCR) &= (~(0x1 << 7)); //divisor latch access disable
switch(trigerlevel)
{
case 1: triger = 0x0;
break;
case 4: triger = 0x0;
break;
case 8: triger = 0x0;
break;
case 14: triger = 0x0;
break;
}
*(RP)UART1_FCR = triger;
*(RP)UART1_IER = 0x00; /* disable all the interrupts */
return E_OK;
}
int uart1_int_en(int recie, int thrie)
{
if(recie == 1)
read_reg(UART1_IER) |= 0x1; /*received data available interrupt enable*/
else
if(recie == 0)
read_reg(UART1_IER) &= ~0x1; /*interrupt disable*/
if(thrie == 1)
read_reg(UART1_IER) |= (0x1 << 1); /*transmitter holding register empty interrupt enable*/
else
if(thrie == 0)
read_reg(UART1_IER) &= ~(0x1 << 1); /*transmitter holding register empty interrupt disable*/
return E_OK;
}
/***************interrupt handler for UART1***************/
extern int thr_isr_uart1(void)
{
U32 i;
U32 a = 0x30;
// printf("UART transmiter holding register handler!\n");
for(i=0; i<100; i++,a++)
*(RP)UART1_THR = a;
return E_OK;
}
extern int rda_isr_uart1(void)
{
U32 i;
U32 a;
// printf("UART receive data available handler!\n");
for(i=0; i<8; i++)
{
a = *(RP)UART1_RBR;
printf("%ld\n", a);
}
return E_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -