第3 节 异步串口 UARTWord文档格式.docx
- 文档编号:18944696
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:11
- 大小:537.40KB
第3 节 异步串口 UARTWord文档格式.docx
《第3 节 异步串口 UARTWord文档格式.docx》由会员分享,可在线阅读,更多相关《第3 节 异步串口 UARTWord文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
为了和RS-232电压信令规范匹配,在FPGAI/O管脚和外部的RS-232连接器之间加入一个外部的电压转换缓冲器,比如MaximMAX3237。
UART内核使用负逻辑,FPGA内的变极器可以用来翻转任何RS-232信号的极性。
3.发送器逻辑
UART发生器包含一个7、8、或9位的txdata保持寄存器,和一个相应的7、8或9位的发送移位寄存器。
Avalon主外设通过Avalon从端口写txdata保持寄存器。
当没有串行的发送移位操作在进行,发送移位寄存器自动装载txdata寄存器。
发送移位寄存器直接提供TXD输出。
数据最低有效位最先移出到TXD。
以上的两个寄存器提供双重的缓冲。
当主外设之前写入的数据正在被从发送移位寄存器移出时,主外设可以写入txdata寄存器一个新的数据。
通过读状态寄存器的发送器就绪位(trdy)、发送器移位寄存器为空位(tmt)和发送器溢出错误位(toe),发送器主外设可以监控发送器的状态。
发送器逻辑按照RS-232规范的要求,在串行的TXD数据流中自动插入正确的开始位、停止位和奇偶校验位。
4.接收器逻辑
UART接收器包含一个7、8或9位的接收器移位寄存器和一个相应的7、8或9位的保持寄存器rxdata。
Avalon主外设通过Avalon从端口读rxdata保持寄存器。
每当一个新字符被完整接收,rxdata保持寄存器自动装载移位寄存器的内容。
rxdata寄存器可以保存之前接收到的字符,当后续的字符正在移入接收器移位寄存器。
主外设通过读状态寄存器的读就绪位(rrdy)、接收器溢出错误位(roe)、间断检测位(brk)、奇偶校验错误位(pe)和帧错误位(fe),来监控接收器状态。
接收器逻辑按照RS-232的规范要求,在串行的RXD数据流中自动检测正确的开始、停止和奇偶校验位。
接收器逻辑检查接收数据中的四种异常情况(帧错误、奇偶校验错误、接收器溢出错误和间断)。
并且设置相应的状态寄存器位(fe,pe,roe,orbrk)。
5.波特率生成
UART内核内部波特率时钟来自Avalon时钟输入,内部波特率时钟通过时钟分频器产生。
除数值来自下面两个值:
∙在系统生成时指定的一个常数值。
∙在divisor寄存器中存储的16位值。
divisor寄存器是一个可选的硬件特性,如果在系统生成时,没有使能divisor寄存器,除数值则是固定的,波特率就不能被改变了。
7.3.2在SOPCBuilder中实例化UART
实例化UART在硬件上产生至少两个I/O端口,RXD输入和TXD输出。
可选地,硬件也可能包括流控制信号,CTS输入和RTS输出。
下面讲述UART的配置
1.波特率选项
UART内核可以实现RS-232连接的任何标准的波特率。
波特率可以通过下面的两种方法进行配置:
∙固定的波特率—波特率在系统生成时被固定,并且不能通过Avalon从端口进行改变。
∙可变的波特率—基于存储在divisor寄存器中的时钟分频值,波特率可以改变。
主外设通过写入divisor寄存器新值来改变波特率。
波特率设置决定着复位之后默认的波特率。
波特率选项提供标准的预置值(如9600,57600,115200bps),用户也可以手动输入任何的波特率值。
波特率的值的用来计算适合的时钟除数值。
波特率和除数值之间的关系如下:
除数=int((时钟频率)/(波特率)+0.5)
波特率=(时钟频率)/(除数+1)
在SOPCBuilder中实例化UART时,如果选中了波特率可以通过软件改变的选项,UART内核硬件上包含了一个16的divisor(除数)寄存器,该寄存器的地址偏移量为4。
Divisor寄存器是可写的,所以波特率可以通过写入该寄存器一个新值来进行改变。
如果不选择这个选项,UART硬件则不包含divisor寄存器。
UART硬件实现一个不变的波特率除数,这个值在系统生成之后就不能被改变了。
此时,对地址偏移量为4的地址写操作没有任何结果,对该地址读操作返回一个未定义的结果。
2.数据位、停止位、奇偶校验位
UART内核的奇偶校验位、数据位和停止位是可配置的。
这些设置在系统生成时被确定,不能通过寄存器文件进行修改。
下面的设置是可用的,见表7-5。
当奇偶校验(Parity)设置为None,发送逻辑发送没有奇偶校验位的数据,并且接收逻辑认为输入的数据也不含奇偶校验位。
当奇偶校验设置为None,状态寄(status)存器pe(parityerror)位没有实现,它总是读0。
当奇偶校验设置为Odd或Even时,发送逻辑计算和插入需要的奇偶校验位到输出的TXD比特流中,接收逻辑检查输入的RXD比特流中的奇偶校验位。
如果接收器发现数据具有错误的奇偶校验,状态寄存器的pe位设置为1。
当奇偶校验设置为Even,如果字符具有偶数个1,奇偶校验位为0,否则奇偶校验位为1。
类似地,奇偶校验设置为Odd,奇偶校验位为0,如果字符具有奇数个1。
3.流控制
UART内核的设置有”IncludeCTS/RTSpins&
controlregisterbits”的选项。
如果选中这个选项,UART硬件包括
∙CTS_N(l负逻辑CTS)输入端口。
∙RTS_N(负逻辑RTS)输出端口。
∙status寄存器的CTS位。
∙status寄存器的DCTS位。
∙Control寄存器的RTS位。
∙control寄存器的IDCTS位。
基于这些硬件,Avalon主外设能够检测CTS和发送RTS流控制信号。
CTS输入和RTS输出端口直接连接到状态寄存器和控制寄存器的相应位上,对UART内核的其它部分没有直接的影响。
当IncludeCTS/RTSpinsandcontrolregisterbits选项没有选中,UART内核在硬件上就包括上面所列的。
控制/状态位CTS、DCTS、IDCTS和RTS都不进行实现。
它们读总是0。
4.Avalon流控制传输(DMA)
UART内核可选择实现具有流控制的Avalon传输。
这样,只有当UART内核准备好接收新的字符时,Avalon主外设才写数据;
只有当内核有可用的数据时,主外设才进行读数据。
UART内核也可以选择是否包含end-of-packet寄存器。
当选中Includeend-of-packetregister选项,UART内核包括:
在偏移量为5的地址,一个7、8或9位的endofpacket寄存器。
数据宽度由DataBits设置决定。
∙状态寄存器的eop位
∙控制寄存器的ieop位。
∙Avalon接口中的endofpacket信号,以支持来自和去往系统中的主外设的具有流控制的数据传输。
End-of-packet(EOP)检测允许UART内核终止同具有流控制的主外设之间的数据传输。
EOP检测可用于同DMA控制器一起使用,例如,实现UART自动写接收到的字符到存储器,直到在RXD数据流中遇到一个指定的字符。
终止(endofpacket)字符值由endofpacket寄存器决定。
当end-of-packet寄存器没有使能,UART内核不包括上面所列的资源。
写endofpacket寄存器没有结果,读则返回一个未定义的值。
7.3.3UART寄存器描述
应用程序访问UART内核使用HALAPI,不通过直接访问UART内核寄存器的方式。
通常,寄存器映射只是对编写内核的驱动程序才有用。
表8-6显示HAL内核的寄存器映射,设备驱动通过存储器映射寄存器控制内核和与内核通信。
有些寄存器和寄存器位是可选的,这些寄存器和寄存器位只有当在系统生成时使能了,才能在硬件中存在。
1.Rxdata寄存器
Rxdata寄存器保存由RXD输入接收到的数据。
当一个新的字符由RXD输入完全接收到,就被传输进入Rxdata寄存器,Status寄存器的rrdy(receivecharacterready)位置为1。
当Rxdata寄存器中的字符被读出后,Status寄存器的rrdy位置为0。
在rrdy位为1时(即前面的数据还没有读出),又有字符输入到rxdata寄存器,则发生接收溢出错误。
Status寄存器的roe(receiveroverrunerror)位置为1。
不管前一个字符是否已经被读出,新的字符总是被传输到Rxdata寄存器。
写Rxdata寄存器无效。
2.Ttxdata寄存器
Avalon主外设将要发送的字符写入Txdata寄存器。
直到发送器准备好发送一个新的字符时,字符才被写入Txdata寄存器,这由Status寄存器的TRDY位指示。
当字符写入Txdata寄存器时,TRDY位置为0。
当字符由Txdata寄存器传输到发生器移位寄存器之后,TRDY位置为1。
当TRDY为0时,写入字符到Txdata寄存器,结果是未定义的。
读Txdata寄存器返回一个未定义的值。
3.Status寄存器
Status寄存器每个单独的位反映UART内核的特定状态。
每个状态位是和control寄存器中相应的中断使能位相联系的。
可以在任何时候读Status寄存器。
读不会改变任何位的值。
写0到Status寄存器,将对DCTS、E、TOE、ROE、BRK、FE和PE位清零。
4.Control(控制)寄存器
Control寄存器包含控制UART内核操作的位,每一位控制UART内核的一个方面。
Control寄存器的值可以在任何时刻读取。
Control寄存器的每一位使能状态寄存器中相应位的中断。
当状态位和它的相应的中断使能位都是1时,内核产生一个中断请求。
例如,状态寄存器的pe为0,控制寄存器的ipe位为0。
当pe和ipe都为1是产生中断。
控制寄存器的位在表7-8中给出。
5.除数(divisor)寄存器(可选)
Divisor寄存器用来产生波特率时钟,采用的波特率由下面的公式决定:
BaudRate=(Clockfrequency)/(divisor+1)
Divisor寄存器是一个可选的硬件特性,如果BaudRateCanBeChangedBySoftware硬件选项没有使能,divisor寄存器就不存在。
这种情况下,写divisor没有任何结果,读divisor返回一个未定义的值。
.
6.包结束符(Endofpacket)寄存器(可选l)
Endofpacket寄存器的值决定可变长度的DMA传输的包结束字符。
复位之后,缺省的值是0,即是ASCII的null字符(\0)。
Endofpacket寄存器是一个可选的硬件特性。
如果Includeend-of-packetregister硬件选项没有使能,则endofpacket寄存器就不存在。
这种情况下,写endofpacket没有任何结果,读则返回一个未定义的值。
7.3.4中断行为
UART内核输出一个单独的中断请求(IRQ)信号给Avalon接口,这样就可以连接到系统中的主外设,如NiosII处理器。
主外设必须读status寄存器以确定中断的原因。
每一个中断情况,都同status寄存器中的一位和control寄存器中的一个中断使能位相联系。
当任何一种中断情况发生,与之相关的状态位被置为1,直到中断请求被确认。
当状态位和其相应的中断使能位为1时,产生IRQ输出。
主外设可以清除的状态寄存器来确认IRQ。
复位时,所有的中断使能位都设成0,所以,UART内核不能产生中断请求,直到主外设设置一个或多个中断使能位为1。
7.3.5软件编程
对于NiosII处理器的使用者,Altera提供HAL系统库驱动程序,用户可以使用ANSIC标准库函数来访问UART内核,例如使用printf()和getchar()函数。
7.3.5.1HAL系统库支持
Altera提供的驱动程序实现了HAL字符模式设备驱动程序,字符模式设备的驱动程序集成到了NiosII系统的HAL系统库中。
HAL用户应该使用熟悉的HALAPI和ANSIC标准库函数来访问UART,而不是通过访问UART寄存器的方式。
HAL用户可以使用ioctl()函数来控制UART硬件的相关方面。
对于NiosII处理器的用户,HAL系统库API提供完整的UART内核特性访问。
NiosII编程将UART内核当成一个字符模式设备处理,使用ANSIC标准库函数进行发送和接收数据。
驱动程序支持CTS/RTS控制信号。
下面的代码演示的是一个很简单的可能的使用,使用printf()打印一条消息到标准输出设备。
本例中,SOPCBuilder系统包含一个UART内核,HAL系统库已经配置成使用UART作为标准输出(stdout)设备。
例程:
打印字符到作为标准输出设备的UART内核
#include<
stdio.h>
intmain()
{
printf("
Helloworld.\n"
);
return0;
}
下面的代码演示了使用ANSIC标准库函数从UART设备读字符和向UART设备发送消
息。
本例中,SOPCBuilder系统包含一个UART内核uart1,该设备没有必要配置成stdout设备。
这种情况下,程序处理该设备就像HAL文件系统中的其它节点一样。
接收和发送字符
/*Asimpleprogramthatrecognizesthecharacters'
t'
and'
v'
*/
string.h>
char*msg="
Detectedthecharacter'
.\n"
;
FILE*fp;
charprompt=0;
fp=fopen("
/dev/uart1"
"
r+"
//Openfileforreadingandwriting
if(fp)
while(prompt!
='
)
{//Loopuntilwereceivea'
prompt=getc(fp);
//GetacharacterfromtheUART.
if(prompt=='
{//Printamessageifcharacteris'
fwrite(msg,strlen(msg),1,fp);
fprintf(fp,"
ClosingtheUARTfile.\n"
fclose(fp);
7.3.5.2驱动程序选项
为了满足不同类型系统的需求,UART驱动程序提供了两个版本:
快速版本(fastversion)和小型版本(smallversion.)。
默认使用快速的版本。
快速和小型版本驱动程序都完全支持C标准库函数和HALAPI。
快速驱动程序采用中断驱动的实现方法,这样当设备没有准备好发送或接收数据时,允许处理器执行其它的任务。
因为UART数据速率比处理器要慢,采用快速驱动程序因此可以提高系统的性能。
小型版本驱动程序采用的是查询实现方法,在发送和接收每一个字符之前,要等待UART硬件。
有两种方法来使能小型驱动程序:
在HAL系统库工程属性中使能小型版本。
这个选项会影响系统中所有的设备驱动程序。
指定预处理器选项如果用户要使用小型、查询版本的UART驱动程序,用户使用这个选项,这样不影响系统中-DALTERA_AVALON_UART_SMALL。
其它设备的驱动程序。
如果在硬件上使能了CTS/RTS流控制信号,快速的版本自动使用这些信号,而小型版本忽略这些信号。
7.3.5.3ioctl()操作
UART驱动程序支持ioctl()函数,允许基于HAL程序请求设备相关的操作。
表7-9定义了UART驱动程序支持的操作请求。
7.3.3.4软件文件
系统库中提供了UART内核底层硬件接口和HAL驱动程序。
应用程序开发人员不应该修改这些文件:
∙altera_avalon_uart_regs.h——定义了内核的寄存器映射,提供了符号常数来访问底层硬件。
文件中的常数只能被设备驱动程序函数使用。
∙altera_avalon_uart.h,altera_avalon_uart.c——这些文件实现了HAL系统库的UART内核设备驱动程序。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第3 异步串口 UART 异步 串口
![提示](https://static.bdocx.com/images/bang_tan.gif)