共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网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |