📄 serial.c
字号:
#include <stdarg.h>
#include <assert.h>
#include "config.h"
#include "GFD_reg.h"
#include "TypeDef.h"
#include "serial.h"
#define DBG_ERROR(void)
//#define DBG_Port UART0_ID
U32 GetBaseAddr(U32 Channel)
{
switch (Channel)
{
case (UART0_ID):
return (U32)BASE_UART0;
break;
case (UART1_ID):
return (U32)BASE_UART1;
break;
default:
assert(1);
return ER_;
break;
}
}
void setTriger( U32 Channel, U8 RevLevel, U8 TranLevel )
{
U8 tmpRevLev, tmpTranLev;
switch(RevLevel) //设置接收触发级
{
case TrigLev_Rev_1:
tmpRevLev = msk_TrigerLever_Rev_1;
break;
case TrigLev_Rev_4:
tmpRevLev = msk_TrigerLever_Rev_4;
break;
case TrigLev_Rev_8:
tmpRevLev = msk_TrigerLever_Rev_8;
break;
case TrigLev_Rev_14:
tmpRevLev = msk_TrigerLever_Rev_14;
break;
default:
DBG_ERROR();
break;
}
switch(TranLevel) //设置发送触发级
{
case msk_TrigerLever_Tra_0:
tmpTranLev = msk_TrigerLever_Tra_0;
break;
case msk_TrigerLever_Tra_2:
tmpTranLev = msk_TrigerLever_Tra_2;
break;
case msk_TrigerLever_Tra_4:
tmpTranLev = msk_TrigerLever_Tra_4;
break;
case msk_TrigerLever_Tra_8:
tmpTranLev = msk_TrigerLever_Tra_8;
break;
default:
DBG_ERROR();
break;
}
REG8( GetBaseAddr(Channel) + Offset_LineControl ) \
&= (msk_TrigerLever_Tra_ZI & msk_TrigerLever_Rev_ZI);
REG8( GetBaseAddr(Channel) + Offset_LineControl ) \
|= (tmpRevLev |tmpTranLev);
REG8( GetBaseAddr(Channel) + Offset_IntEnable ) \
|= msk_INT_EN_TranData; //发送FIFO触发级中断使能
REG8( GetBaseAddr(Channel) + Offset_IntEnable ) \
|= msk_INT_EN_RevData; //接收FIFO触发级中断使能
}
void setDataBit(int Channel, char databit)
{
U8 tmpDataBit;
switch(databit) //设置数据位比特数
{
case 5:
tmpDataBit = msk_DataBit_5;
break;
case 6:
tmpDataBit = msk_DataBit_6;
break;
case 7:
tmpDataBit = msk_DateBit_7;
break;
case 8:
tmpDataBit = msk_DateBit_8;
break;
default:
break;
}
REG8( GetBaseAddr(Channel) + Offset_LineControl ) &= msk_DataBit_ZI;
REG8( GetBaseAddr(Channel) + Offset_LineControl ) |= tmpDataBit;
}
void setBaudRate (int Channel, short baudrate)
{
U8 baudh; //波特率高8 位
U8 baudl; //波特率低8 位
/* get correct divisor */
baudh = ((CLOCK_SPEED_Hz / (baudrate * 16)) & 0xFF00)>>8;
baudl = (CLOCK_SPEED_Hz / (baudrate * 16)) & 0x00FF;
REG8( GetBaseAddr(Channel) + Offset_LineControl ) |= msk_DivisorSel; //允许波特率寄存器被访问
REG8( GetBaseAddr(Channel) + Offset_Divisor_High ) = baudh; //将计算后的波特率高8 位写入
REG8( GetBaseAddr(Channel) + Offset_Divisor_Low ) = baudl; //将计算后的波特率低8 位写入
REG8( GetBaseAddr(Channel) + Offset_LineControl ) &= ~msk_DivisorSel; //关闭波特率寄存器访问
}
void serial_init ( U32 Channel,
U32 BaudRate, U32 DataBit,
U32 TrigerLever_Rev, U32 TrigerLever_Tra,
BOOL StopBit,
BOOL ParityEnable,
BOOL EvenParity,
BOOL StickParity,
BOOL Break)
{
setBaudRate(Channel, BaudRate);
setDataBit( Channel, DataBit);
setTriger( Channel, TrigerLever_Rev, TrigerLever_Tra);
(StopBit) ? setStopBit(Channel) : clearStopBit(Channel);
(ParityEnable) ? setParityBit(Channel) : clearParityBit(Channel);
(EvenParity) ? setEvenParity(Channel) : setOddParity(Channel);
(StickParity) ? setStickParity(Channel) : clearStickParity(Channel);
(Break) ? setBreakBit(Channel): clearBreakBit(Channel);
}
void serial_putc (U32 Channel, const U8 c)
{
/* wait for room in the transmit FIFO */
while(!(REG8( GetBaseAddr(Channel) + Offset_LineStauts ) & msk_T_FIFO_Empty));
REG8( GetBaseAddr(Channel) + Offset_FIFO_Tran ) = c;
/*
to be polite with serial console add a line feed
to the carriage return character
*/
if (c=='\n')
{
serial_putc(Channel, '\r');
}
}
void serial_puts ( U32 Channel, const U8 *s)
{
while (*s)
{
serial_putc (Channel, *s++);
}
}
/*
* Read a single byte from the serial port. Returns 1 on success, 0
* otherwise. When the function is succesfull, the character read is
* written into its argument c.
*/
U8 serial_tstc ( U32 Channel )
{
return ( REG8( GetBaseAddr(Channel) + Offset_LineStauts ) & msk_DataReady);
}
/*
* Read a single byte from the serial port. Returns 1 on success, 0
* otherwise. When the function is succesfull, the character read is
* written into its argument c.
*/
U8 serial_getc ( U32 Channel )
{
char rv;
while(1)
{
rv = serial_tstc(Channel);
if(rv > 0)
{
return REG8(GetBaseAddr(Channel) + Offset_FIFO_Rev);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -