如果想要使用uartlite这个模块,则需要其驱动程序,这些驱动程序中包含对寄存器的直接操作。赛灵思在BSP中提供了uartlite的驱动函数,但是感觉不好用,所以本文详细介绍uartlite的寄存器空间,以便于可以自己编写相应的驱动函数。
资料ID:PG142
文档查找软件:DocNav,在安装vivado时可以选择一并安装
uartlite的寄存器空间
用于操作uartlite的寄存器有4个,如下表所示。
其中的第一列是寄存器的地址偏移量,这里的偏移是针对设备基地址,即Baseaddress。
STAT_REG表示的是uartlite的状态寄存器。
CTRL_REG表示的是uartlite的控制寄存器。
Rx FIFO和Tx FIFO分别表示uartlite的接收和发送寄存器。
接下来将对这四个寄存器的使用方法进行详细介绍。
Tx FIFO
Tx FIFO是一个32位的寄存器,它的作用只有一个,那就是将要传输的数据写入该寄存器。然后该寄存器中的数据会被放入到一个叫做发送FIFO的缓冲区中,该缓冲区最多可以存放16个数据。然后就是发送缓冲区中的数据。
上图中,Data Bits表示一次传输的数据位数,可设置为5至8,图中显示的当Data Bits设置为8时,Tx FIFO这个寄存器中各个位的定义。这个0至7放置要传输的数据,其余位为保留位,即没有任何含义。
在使用过程中,如果发送缓冲区中已经有16个要发送的数据,此时如果再向此寄存器中写入数据,这时会产生一个总线错误并且该数据不会被写入缓冲区。这是一个只写寄存器,如果发送一个读信号,此时将会产生一个用0表示的读确认(猜想应该是读的结果是0)。
Rx FIFO
Rx FIFO也是一个32位的寄存器,它的作用也只有一个,那就是通过读取该寄存器的值来读取接收到的数据,注意,该寄存器读取的是接收缓冲区中的数据。类似于发送缓冲区,uartlite也包含一个接收缓冲区,缓冲区的大小也为16。
由图得,当Data Bits被设置为8时,0至7位表示接收到的数据,其余位为保留位。
当接收缓冲区中没有数据时,如果发送一个读请求到该寄存器,则会产生一个总线错误,并且读取的结果是未定义的。该寄存器是一个只读寄存器,当发送一个写信号时,将不会产生任何效果。
CTRL_REG
CTRL_REG也是一个32位寄存器,这32位中只有3位是有意义的,其余位均为保留位。各位的定义如下图。
第0位:当向该位写入1时,将会清除传输缓冲区中的数据
第1位:当向该位写入0时,将会清除接收缓冲区中的数据
第4位:当向该位写入1时,将会使能产生中断信号;当向该位写入0时,将使其不能产生中断信号文章来源:https://www.toymoban.com/news/detail-441924.html
Status Register
Status Register是一个32位的寄存器,该寄存器中0至7位是有意义的,其余位为保留位,如下图所示。
这里的描述意义都是非常清楚的,选第2位和第3位介绍一下,因为后面的示例程序会使用到。
第2位:当该位为0时,表示此时传输缓冲区不为空;当该位为1时,表示此时传输缓冲区为空。
第3位:当该位为0时,表示此时传输缓冲区没有满;当该位为1时,表示此时传输缓冲区已经满了。文章来源地址https://www.toymoban.com/news/detail-441924.html
示例程序:判断发送缓冲区的大小是否为16
#include "xil_printf.h"
#define BaseAddress 0x40600000//这里的uartlite基地址可以从xparameter.h文件中找到
#define RxOffset 0x0
#define TxOffset 0x4
#define STAT_REG 0x08
#define CTRL_REG 0x0C
int main()
{
/**********initialize uartlize***************/
*(volatile int *)(BaseAddress + CTRL_REG) &= 0xFFFFFFEF;//disable interrupt
*(volatile int *)(BaseAddress + CTRL_REG) |= 0x3;//clear Rx FIFO, clear Tx FIFO
/********************************************/
/*********transmit byte****************/
char a = 'A';
int i = 0;
while((*(volatile int *)(BaseAddress + STAT_REG) & 0x8) != 0x8)
{
i++;
*(volatile int *)(BaseAddress + TxOffset) = a;
}
while((*(volatile int *)(BaseAddress + STAT_REG) & 0x4) != 0x4);
if(i == 16)
{
print("i is equal 16!!!!!!!\r\n");
return 0;
}
else
{
print("i is not equal 16!!!!!!!\r\n");
return 1;
}
}
到了这里,关于Vivado中的IP核——uartlite详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!