共2条
1/1 1 跳转至页
UART0 两个不同的UART0初始化,功能一样.为什么要这样写.
问
周立功技术人员们:
您们好!
我在做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的初始化,每个人的风格都可能不同。
为何要强求一致呢?
您们好!
我在做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 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 | |
【FRDM-MCXN947评测】核间通信MUTEX被打赏50分 |