主题 : 请教位逻辑表达式的含义 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 14291
精华: 0
发帖: 9
金钱: 45 两
威望: 9 点
综合积分: 18 分
注册时间: 2010-02-06
最后登录: 2011-12-06
楼主  发表于: 2010-08-14 15:46

 请教位逻辑表达式的含义

我是初学的,直接对寄存器定义赋值可以理解,在标准的C语言中左移,右移,与,或,非都可以理解
在ARM中,结合一些特殊的数字,一些运算符,位操作,表达式,却搞的我一头雾水,恳请大家赐教

#define    En485Tx()    (rGPEDAT |= 1<<13)
#define    En485Rx()    (rGPEDAT &= ~(1<<13))

static __inline void set_io(void)
{
    rGPHCON &= ~(0xf<<12);
    rGPHCON |= 0xa<<12;        //TXD2,RXD2
    rGPHUP  |= 3<<6;        //Uart port pull-up disable

    rGPGCON &= ~((3<<4)|(3<<12));
    rGPGCON |= (1<<4)|(1<<12);
    rGPGDAT &= ~(1<<2);
    rGPGDAT |= 1<<6;
    
    rGPECON &= ~(3<<26);
    rGPECON |= 1<<26;
    En485Rx();
    //-------------------set UART--------------------//
    //选择功能管脚
    //GPH0 -> nCTS0
    //GPH1 -> nRTS0
    //GPH2 -> TXD0
    //GPH3 -> RXD0
    //GPH4 -> TXD1
    //GPH5 -> RXD1
    //GPH6 -> nRTS1/TXD2
    //GPH7 -> nTXS1/RXD2
    rGPHCON = ( rGPHCON & (~(0xffff)) ) | (0xaaa0);//
    //上拉电阻
    rGPHUP = 0x0;    // The pull up function is enable
    
    //设置串口线性控制器寄存器
    rULCON0 |=      (0<<6)//No infra-red
                |(0<<5)//No panity(set 0xx)
                |(0<<2)//One stop bit per frame
                |(3<<0);//11 = 8-bit
    
    //设置串口控制寄存器
    rUCON0 |=  (0<<10)//00 = PCLK
             |(1<<9)//Tx interrupt Type = Level
             |(1<<8)//Rx interrupt Type = Level
             |(0<<7)//Rx Timer out disable
             |(1<<6)//Rx error status interrupt enable
             |(0<<5)//Loopback mode disable              
             |(0<<4)//Send break signal disable
             |(1<<2)//Transmit mode (01 = inerrupt request or polling mode)
             |(1<<0);//Receive mode (01 = interupt request or polling mode)

    //设置串口FIFO控制寄存器
    rUFCON0 |=   (3<<6)//Tx FIFO Trigger Level(11 = 48-byte)
                |(3<<4)//Rx FIFO Trigger Level(11 = 32-byte)
                |(1<<2)//Tx FIFO reset
                |(1<<1)//Rx FIFO reset
                |(1<<0);//FIFO Eable
    //设置串口波特率分频寄存器
[ 此帖被ywy811216在2010-08-14 15:52重新编辑 ]
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
1楼  发表于: 2010-08-14 18:10
驱动里的位操作和C语言的定义没有什么区别,无非只是加上了寄存器位的意义,这需要你看芯片的用户手册。至于符号,任何一本C语言的教材里定义都是一样的,没什么特别的。
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
come on
级别: 新手上路
UID: 34703
精华: 0
发帖: 41
金钱: 210 两
威望: 42 点
综合积分: 82 分
注册时间: 2010-12-20
最后登录: 2012-03-13
2楼  发表于: 2010-12-30 10:34
学习了!
级别: 骑士
UID: 9169
精华: 0
发帖: 249
金钱: 1330 两
威望: 299 点
综合积分: 498 分
注册时间: 2009-09-19
最后登录: 2017-08-14
3楼  发表于: 2010-12-30 14:58

 回 楼主(ywy811216) 的帖子

rGPHCON &= ~(0xf<<12); 就是将rGPHCON的12位到15位清零
rGPHCON |= 0xa<<12;        //TXD2,RXD2   就是将rGPHCON的12位到15位置为1010b
其实位操作很简单,主要是要熟练操作ARM的特殊控制寄存器位。