还是北京蓝海微芯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);
文章评论(0条评论)
登录后参与讨论