heefly 发表于 2008-03-04 17:19

菜鸟求助:I/O地址问题

小第对计算机底层和硬件的东西不是很了解,在看到一段串口初始化的代码中,

        outportb(0x2fb,0x80);
        outportb(0x2f8,0x30);       
        outportb(0x2fb,0x03);

串口地址为0X2F8 ,OUTPORTB 是将值写到一个地址中去,对2FB操作好象是设置它的比特率,可是
1。我不明白为什么是2FB设置他的比特率,
2。还有0X03代表的是9600,不知道这个是怎么算的。
3。这个是串口,对于其他的IO呢,如并口,GPIO,怎么进行设置?
4。对于计算机IO地址的分配,不知道是怎么样的一个原理,有哪方面的书可以介绍看一下。

各位大虾帮帮忙,先谢谢了

小瓶盖儿 发表于 2008-03-28 16:58

outportb(0x2fb,0x80);    //0x2fb告诉UART这条指令是命令,操作地址是0x80
      outportb(0x2f8,0x30);       //0x2f8告诉UART这条指令是数据,操作数是0x30,将0x30写入0x80;
      outportb(0x2fb,0x03);//同上

具体情况具体对待,就是这个样子~~~

helight 发表于 2008-07-17 17:16

关于pc io地址,你可以看看这篇文章
http://www.lupaworld.com/151392/viewspace_109014.html

system888net 发表于 2008-07-17 18:54

原帖由 heefly 于 2008-3-4 17:19 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
小第对计算机底层和硬件的东西不是很了解,在看到一段串口初始化的代码中,

        outportb(0x2fb,0x80);
        outportb(0x2f8,0x30);       
        outportb(0x2fb,0x03);

串口地址为0X2F8 ,OUTPORTB 是将值写到一个地址中 ...

对于串口通信:

波特率设置字的计算方法:
b=1843200/(16*baud_rate);

比如你要设置为9600波特率,那么b=1843200/(16*9600)=12(0xc)

这时设置应该是:
           mov dx,IOBASE//这里IOBASE 是你的0x2f8或3f8等...
           add dx,03h
           mov al,80h
           out dx,al
           mov ax,b   //   注意是给了ax,而不是al
           mov dx,IOBASE
           out dx,al   //al of b
           add dx,01h
           mov al,ah
           out dx,al    // ah of b
除此之外还有frameformat字节设置:
                  mov dx,IOBASE
           add dx,03h
           mov al,00h
           out dx,al
           mov al,frameformat
           and al,07fh
           out dx,al

           mov dx,IOBASE
           add dx,04h
           mov al,03h
           out dx,al

中断和收发也有很多文献介绍,这里就不重复了

[ 本帖最后由 system888net 于 2008-7-17 18:55 编辑 ]
页: [1]
查看完整版本: 菜鸟求助:I/O地址问题