对于寄存器的设置,尤其是移位赋值的想法

        v_ADCregs->rADCCON=((1<<14)//AD预分频使能
            |(prescaler<<6)//分频因子设为49
            |(1<<3)//通道为AIN1
            |(0<<2)//Normal操作模式
            |(0<<1)//AD转换不能从读操作开始
            );

上面这段程序就是典型的移位赋值寄存器的操作。

下面的图是其对应的寄存器datasheet:

由上可见[13:6]这8个bit用来设置分频因子的,程序中用了49<<6这一句来进行设置,而49转为二进制是110001,只有6bit,而更为关键的是[13:6]这8bit的初始状态是0xFF,可参见上图,那么,采用49<<6对这8个bit赋值后应该会变成11110001,这就成了241了,不是49了!

所以我想,是不是这种移位赋值的方法只适用于初始状态为0的bit或bit组,如果初始状态不为零,恐怕不能直接用这种方法赋值,而需要将其先赋零后再采用这种方法赋值。


还有另外一种赋值寄存器的方法,就是直接赋值,比如一个16bit的寄存器,可以直接=0xf13c(随便写的,没有具体意义),但我觉得这种方法不适用于上面图中的ADCCON寄存器,为什么这么说?因为它的[15]位是表示AD转换状态的,是只读的(Read-only),我们不能赋,最后一位[0]是手动控制AD开始用的,我们不想目前不想赋,而用直接赋值的话不管写什么值总会影响到这两位。

不能用直接赋值,可以用另外一种移位赋值,就是“与非赋值法”,分析一下上面的程序,其实我们想要的结果无非是下面这样:

bit1514131211109876543210
X10011000100100X

X表示暂时忽略不管,先将需要取零的位赋值:

ADCCON &= ~((3<<12)|(7<<7)|(3<<4)|(3<<1));

再对其中需要取1的位赋值:

ADCCON |= ((1<<14)|(3<<10)|(1<<6)|(1<<3));

这样既得到了预期的效果,又没有影响到其他的位。

新手的胡思乱想,不当之处,还望高人指点。

转载于:https://www.cnblogs.com/wuqi1003/archive/2012/11/13/2768219.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值