全部博文(321)
分类: 嵌入式
2013-03-12 21:36:12
(缓存寄存器(64字节)和移位寄存器)mini2440===3个串口。
补充:
1、主要作用:uprintf平台往终端打印信息,终端向平台输入信息
2、波特率:每秒传输几位的数据115200bps(bit per seconds)。
3、PC机跟开发板发出的都是TTL(正逻辑),而在二者传输过程中,用到的都是EIA电平(负逻辑),所以要经过MAX232芯片进行电平转换;串口都是EIA电平(负逻辑 -15~-5为(1),+5~+15为(0),所以要经过MAX232转换为TTL,补充:TTL正逻辑,>0.4为1,<0.4为0)
4、串口线:直连和交叉线。网线:直连线,用万用表测相通则是直连线,不通说明是交叉,因为一个TX,一个RX。交叉线:直接接上去两台电脑就可以通讯。我们开发板是交叉线。
两端的插头上有1-9的标号,如果用万用表测相对应号码的针都是短通的,就是直连线。
不是一对一通的就是交叉。交叉就是收-发,发-收,一样设备用平行就会发-发,收-收
5、因为挂载PCLK,所以是外部总线,相对慢。
6、每个通道有两个FIFO,用来发送和接收。使用FIFO==64byte。UTXH0,buffer的地址,如果是FIFO,则是入口地址,非FIFO,就是准确的buffer地址。非FIFO模式:缓存只有一个字节(包含在64字节里面)FIFO模式:缓存有64个字节
串行通信的原理
实际上包含一个通信协议,包含选哪个串口0,波特率多少115200,一帧数据包括什么(起始位,数据位,停止位1,奇偶校验位无),硬件控制流无。PC机设置成什么配置(标准),开发板也要设置成什么配置,因为只有当两端遵守同样的规则,才能进行数据交换。
RSTXD0通过电平解码芯片转换成TXD(发送)
RSRXD0通过电平解码芯片转换成RXD(接收)
1.将数据放在buffer,数据将自动复制到移位寄存器(shift),然后串行发出。(1个起始位,5-8数据位,1个奇偶校验位,以及1-2停止位)。
发送:发送器可以产生单帧发送期间强制串行输出为逻辑 0 状态的断点状态,完成发送当前发送字后发送断点信号。在发出断点信号后,其不断发送数据到 Tx FIFO (非FIFO 模式情况下 Tx。由行控制寄存器(ULCONn)指定。
接收:断点状态表明 RxDn 的输入保持为逻辑 0 状态的时间长于单帧传输时间。
当其在 3 字时间期间(此间隔在字宽位的设置随后)并且在 FIFO模式中 Rx FIFO 为非空时不接收任何数据时发生接收超时状态。
保持寄存器)中接收移位寄存器也同理。
2.通过两根线TXDn和RXDn,可以找到对应的I/0口,从而得到GPHCON,
(备注:配置寄存器不能影响其他位,这里只是粗略的写出结果);
GPHCON=(2<<4)|(2<<6)设置为(TXD,RXD);
ULCON=(0<<6)|(0<<3)|(0<<2)|3(8位数据/帧);
rUCON0== (0<<10)|(0<<4)|(1<<2)|1;(分频器)(时钟选择PCLK)
UFCON=0x0(FIFO时能否);这里不使用FIFO,当然也可以使用
UBRDIVn=(int)(UART clock)/((baud rate*16)-1) =(pclk)50000000/(115200*16)-1=27-1=26;//在最后一页,第十一章。
注:取最接近的整数
后面的:状态寄存器用来读
3.判断buffer是否为空即读取UTRSTAT0->while(!(rUTRSTAT0 & 0x(1,2))):1->getch(获取键盘输入)2->putch(输出打印在屏幕)
4.Buffer里面没有回车'\r',,所以当你Uart_getch,输入回车(\r)时,里面要转化为'\n
while(!(rUTRSTAT0 & 0x1)); //wait until buffer register has a received data--noempty1
ch = rURXH0;
if(ch == '\r')
{
ch = '\n';
}
5.当你要输出字符的时候,Uart_putch,如果buffer是\n,则要输出\r\n,才能回车换行
if(ch == '\n')
Uart_putch('\r');
while(!(rUTRSTAT0 & 0x2)); //wait until buffer empty-1
6.如果你要删除字符,则要先退格,在用空格覆盖,(一种方法)
7.uart_printf(const char *fmt,...)//可以输出各种格式如%d,或%f,%x
{
va_list ap; // 初始化指向可变参数列表的指针
char buffer[20]={0};
int cnt;
va_start(ap,fmt);
cnt = vsprintf(buffer,fmt,ap);//将第一个可变参数的地址付给ap,即ap
//即ap指向可变参数列表的开始
buffer[cnt]='\0';
Uart_putstring(buffer);
va_end(ap);
}
注意:输入字符串要慢,否则出现乱码;有时候uart_printf出现乱码,可在前面加uart_getch(),清空缓存