原创 S3C2410 UART

2009-9-19 13:55 1934 2 2 分类: MCU/ 嵌入式

还是北京蓝海微芯2410开发板的初始化程序


首先是SerialSwitch(0); //作用是选择串口0
该函数的原型是:


/***************************************************************************
Function name: SerialSwitch
Parameter    : port : 串口选择参数,0:串口1 1:串口2 
Description  : 进行串口切换
Return      : 返回串口切换的参数,是串口1还是串口2
Argument     :
Autor & date :
****************************************************************************/


static U16 SerialPortSel;


U16 SerialSwitch(U16 port)
{
#ifdef SERIAL_PORTS_SWITCH
// U16 old_sel = SerialPortSel;
 
 SerialPortSel = port?1:0;
#else
 SerialPortSel = 0;
#endif
 return SerialPortSel;
}


然后顺序执行SerialChgBaud(115200); //设置UART的波特率为115200
该函数原型如下:


/***************************************************************************
Function name: SerialChgBaud
Parameter    : baud : 串口波特率参数
Description  : 设置串口的波特率
Return      : void
Argument     : 常用串口波特率范围:2400,4800,9600,19200,38400,115200等  
Autor & date :
****************************************************************************/
void SerialChgBaud(U32 baud)
{
 U32 mclk =  GetMasterClock();
 
 rUFCON0 = 0x0;  //FIFO disable
 rUFCON1 = 0x0;
 rUMCON0 = 0x0;
 rUMCON1 = 0x0;


//UART0
// rULCON0  = 0x7;  //Normal,No parity,2 stop,8 bit
 rULCON0  = 0x3;  //Normal,No parity,1 stop,8 bit
 rUCON0   = 0x245; //rx=edge,tx=level,disable timeout int.
,enable rx error int.,normal,interrupt or polling
 rUBRDIV0 = ((int)(mclk/16./baud + 0.5) -1);


//UART1
// rULCON1  = 0x7;  //Normal,No parity,2 stop,8 bit
 rULCON1  = 0x3;
 rUCON1   = 0x245;
 rUBRDIV1 = ((int)(mclk/16./baud + 0.5) -1);
}


该函数首先调用GetMasterClock();   获取PCLK频率


/***************************************************************************
Function name: GetMasterClock
Parameter    : void
Description  : 获得系统的PCLK频率
Return      : 返回系统的PCLK频率
Argument     :
Autor & date :
****************************************************************************/
U32 GetMasterClock(void)
{
 U32 clk;
 
 clk = GetCpuClock();
 
 if(rCLKDIVN&2)
  clk >>= 1;
  
 if(rCLKDIVN&1)
  clk >>= 1;
  
 return clk;
}


该函数又调用了GetCpuClock();
该函数原型如下:
/***************************************************************************
Function name: GetCpuClock
Parameter    : void
Description  : 获得系统的主频
Return      : 返回系统的主频
Argument     :
Autor & date :
****************************************************************************/
U32 GetCpuClock(void)
{
 return ClkPara.freq;
}


获得了系统的主频,返回GetMasterClock(void)函数,clk=200MHZ,然后根据rCLKDIVN寄存器
判断分频值,这里面是4分频,所以最终程序计算出clk=50MHZ,程序返回。


程序接着返回到SerialChgBaud(U32 baud)函数,



紧接着
rUFCON0 = 0x0;  //FIFO disable
rUFCON1 = 0x0;
这两个寄存器是UART的FIFO控制寄存器,FIFO被禁止了。


rUMCON0 = 0x0;
rUMCON1 = 0x0;
这两个是Modem控制寄存器


[7:5]保留位,必须为0,[4]AFC禁止,[3:1]保留位,[0] 高电平(nRTS无效)。
如果AFC使能位为1,则葫芦哦该位。在这个状态下,S3C2410将自动控制nRTS。如果AFC使能位为0,则nRTS
必须由软件控制。


rULCON0  = 0x3;  //Normal,No parity,1 stop,8 bit
这个寄存器是UART行控制寄存器,
[7]保留位
[6]0 正常模式
[5:3] 000 无奇偶校验
[2]0 一位停止位
[1:0] 11 8位数据位


rUCON0   = 0x245; //rx=edge,tx=level,disable timeout int.
,enable rx error int.,normal,interrupt or polling
//01001000101
[10] 0   波特率时钟源,使用PCLK,UBRDIVn=int[PCLK/(波特率)*16]-1  PCLK程序前面已经获取
[9]  1   发送中断请求类型选择 电平
[8]  0   接收中断请求类型选择 脉冲
[7]  0   RX超时中断使能控制  禁止
[6]  1   接收错误状态中断使能控制 使能
[5]  0   回送模式选择,正常模式
[4]  0   保留位
[3:2]  01  发送模式选择:确定将Tx数据写入UART发送缓冲寄存器的模式。 选择了中断请求或查询模式
[1:0]  01  接收模式选择:确定从UART接收缓冲寄存器读数据的模式。   中断请求和查询模式


rUBRDIV0 = ((int)(mclk/16./baud + 0.5) -1);  根据公式计算出波特率系数寄存器UBRDIVn的值。


rULCON1  = 0x3;        同rULCON0 
rUCON1   = 0x245;
rUBRDIV1 = ((int)(mclk/16./baud + 0.5) -1);


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
2
关闭 站长推荐上一条 /1 下一条