这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » UART0 两个不同的UART0初始化,功能一样.为什么要这样写.

共2条 1/1 1 跳转至

UART0 两个不同的UART0初始化,功能一样.为什么要这样写.

院士
2006-09-17 18:14:16     打赏
UART0 两个不同的UART0初始化,功能一样.为什么要这样写.



关键词: UART0     两个     不同     初始化     功能     一样     为什么    

院士
2006-12-22 22:43:00     打赏
2楼
问 周立功技术人员们:
    您们好!
    我在做UART通信实验时,对UART0初始化有一个问题.在实验1中.初始化程序如下:
    /****************************************************************************
* 名    称:UART0_Ini()
* 功    能:初始化串口0。设置为8位数据位,1位停止位,无奇偶校验,波特率为115200
* 入口参数:无
* 出口参数:无
****************************************************************************/
#define  UART_BPS    115200            // 定义通讯波特率
void  UART0_Init(void)
{  
    uint16 Fdiv;

    U0LCR = 0x83;                        // DLAB = 1,可设置波特率
    Fdiv = (Fpclk / 16) / UART_BPS;        // 设置波特率
    U0DLM = Fdiv / 256;                            
    U0DLL = Fdiv % 256;                        
    U0LCR = 0x03;
}
     这个简单易懂,我能很好理解.
     但是在增补实验中,初始化的功能和实验1一样,但是他的程序如下:
   /* 定义串口模式设置数据结构 */
typedef  struct  UartMode
{   uint8 datab;             // 字长度,5/6/7/8
    uint8 stopb;             // 停止位,1/2
    uint8 parity;              // 奇偶校验位,0为无校验,1奇数校验,2为偶数校验
}   UARTMODE;

/****************************************************************************
* 名    称:UART0_Init()
* 功    能:初始化串口0。设置其工作模式及波特率。
* 入口参数:baud                波特率
*          set          模式设置(UARTMODE数据结构)
* 出口参数:返回值为1时表示初化成功,为0表除参数出错
****************************************************************************/
uint8  UART0_Init(uint32 baud, UARTMODE set)
{   uint32  bak;
   
    /* 参数过滤 */
    if( (0==baud)||(baud>115200) )
    {
        return(0);
    }
    if( (set.datab<5)||(set.datab>8) )
    {
        return(0);
    }
    if( (0==set.stopb)||(set.stopb>2) )
    {
        return(0);
    }
    if( set.parity>4 )
    {
        return(0);
    }

    /* 设置串口波特率 */
    U0LCR = 0x80;                            // DLAB位置1
    bak = (Fpclk>>4)/baud;
    U0DLM = bak>>8;
    U0DLL = bak&0xff;
   
    /* 设置串口模式 */
    bak = set.datab-5;                       // 设置字长度
    if(2==set.stopb)
    {
       bak |= 0x04;                            // 判断是否为2位停止位  
    }
    if(0!=set.parity)
    {
        set.parity = set.parity-1;
        bak |= 0x08;
    }
    bak |= set.parity<<4;                      // 设置奇偶校验
    U0LCR = bak;

    return(1);
}
    我不明白为什么要这样初始化.我把增补实验中UART0的初始化程序,改成了实验1中的那样,也可以正确的运行.
    您能和我说下为什么在增补实验UART0的初始化程序要那样写吗?他和实验1有什么不同吗? 1: re:前者是固字长度、停止位、无奇偶校验位的,代码简单。
后者通用性较好,代码有点复杂。
对于增补实验中UART0,使用那一个初始化函数都可以(效果是一样的)。
2: 还有点问题   那我在实际开发中,我该写哪种形式的初始化程序呢?简单的那个还是复杂通用性好的那个.
   简单的那个是不是有什么漏洞? 3: 典型的邯郸学步UART的初始化,每个人的风格都可能不同。
为何要强求一致呢?

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]