Chinaunix首页 | 论坛 | 博客
  • 博客访问: 844687
  • 博文数量: 321
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 936
  • 用 户 组: 普通用户
  • 注册时间: 2013-02-23 11:25
文章分类

全部博文(321)

文章存档

2017年(1)

2016年(10)

2015年(61)

2014年(187)

2013年(62)

分类: 嵌入式

2013-03-12 21:36:12

(缓存寄存器(64字节)和移位寄存器)mini2440===3个串口。

补充:

1主要作用:uprintf平台往终端打印信息,终端向平台输入信息

2、波特率:每秒传输几位的数据115200bps(bit per seconds)

3PC机跟开发板发出的都是TTL(正逻辑),而在二者传输过程中,用到的都是EIA电平(负逻辑),所以要经过MAX232芯片进行电平转换;串口都是EIA电平(负逻辑 -15~-5为(1),+5~+15为(0),所以要经过MAX232转换为TTL,补充:TTL正逻辑,>0.41<0.40)

4、串口线:直连和交叉线。网线:直连线,用万用表测相通则是直连线,不通说明是交叉,因为一个TX,一个RX。交叉线:直接接上去两台电脑就可以通讯。我们开发板是交叉线。

两端的插头上有1-9的标号,如果用万用表测相对应号码的针都是短通的,就是直连线。 

不是一对一通的就是交叉。交叉就是收-发,发-收,一样设备用平行就会发-发,收-

5、因为挂载PCLK,所以是外部总线,相对慢。

6、每个通道有两个FIFO,用来发送和接收。使用FIFO==64byteUTXH0buffer的地址,如果是FIFO,则是入口地址,非FIFO,就是准确的buffer地址。FIFO模式:缓存只有一个字节(包含在64字节里面)FIFO模式:缓存有64个字节

串行通信的原理

实际上包含一个通信协议,包含选哪个串口0,波特率多少115200,一帧数据包括什么(起始位,数据位,停止位1,奇偶校验位无),硬件控制流无。PC机设置成什么配置(标准),开发板也要设置成什么配置,因为只有当两端遵守同样的规则,才能进行数据交换。



  RSTXD0通过电平解码芯片转换成TXD(发送)

  RSRXD0通过电平解码芯片转换成RXD(接收)


1.将数据放在buffer,数据将自动复制到移位寄存器(shift),然后串行发出。(1个起始位,5-8数据位,1个奇偶校验位,以及1-2停止位)。

发送:发送器可以产生单帧发送期间强制串行输出为逻辑 状态的断点状态,完成发送当前发送字后发送断点信号。在发出断点信号后,其不断发送数据到 Tx  FIFO (非FIFO 模式情况下 Tx。由行控制寄存器(ULCONn)指定。

接收:断点状态表明 RxDn 的输入保持为逻辑 状态的时间长于单帧传输时间。 

当其在 字时间期间(此间隔在字宽位的设置随后)并且在 FIFO模式中 Rx FIFO 为非空时不接收任何数据时发生接收超时状态。

保持寄存器)中接收移位寄存器也同理。

2.通过两根线TXDnRXDn,可以找到对应的I/0口,从而得到GPHCON

(备注:配置寄存器不能影响其他位,这里只是粗略的写出结果);

GPHCON=(2<<4)|(2<<6)设置为(TXD,RXD;

ULCON=(0<<6)|(0<<3)|(0<<2)|38位数据/帧);

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(),清空缓存

阅读(1356) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~