弱问:写驱动时对寄存器的C语言操作

FrankLee1985 2008-05-08 09:42:40
最近在看别人写的驱动时总是遇到一些C语言用法,句子符号能看懂,但实际的意思不明白,如下语句:
// LCD_PWREN(GPG4)
s2440IOP->GPGCON &= ~(3 << 8);
s2440IOP->GPGCON |= (1 << 8);
s2440IOP->GPGDAT |= (1 << 4);
// LCD _nRESET control
s2440IOP->GPBCON = (s2440IOP->GPBCON & ~(3<<2)) |(1<<2);
s2443IOP->GPBDAT |= (1<<1);
我知道这是对GPG和GPB的寄存器操作,但直接赋值不就行了吗?为什么要用这种格式写?这样写是否是对寄存器的某一位进行的单独操作?请大侠们指点。
...全文
232 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
忘不了Melody 2011-07-16
  • 打赏
  • 举报
回复
???
fengxiasha 2008-05-11
  • 打赏
  • 举报
回复
解释的真好,学习中
Heaven_Redsky 2008-05-10
  • 打赏
  • 举报
回复
楼上解释的很详细了
补充一句
有的时候一个寄存器的含义和内容十分复杂
在操作的时候并不知道它现在所有位的值,而只能确定我们想修改的位
这样的话就不能用楼主所说的赋值的操作了 必须用这种方法
CedarDiao 2008-05-10
  • 打赏
  • 举报
回复
s2440IOP->GPGCON &= ~(3 < < 8);
是对这个寄存器的bit[8]和bit[11]置零。

s2440IOP->GPGCON ¦= (1 < < 8);
是对这个寄存器的bit[8]置1。

s2440IOP->GPGDAT ¦= (1 < < 4);
是对这个寄存器的bit[4]置1。

以此类推,其实这是典型的先读后写操作,就是因为某些寄存器里我们有时候只需要改变某一位或某几位而不能动其他的位,所以才这样用。
至于(1 < < 8) 和(1 < < 4)这样的写法一目了然,一眼就能看出来是在对第几位进行操作,纯粹是为了阅读方便。
xp4105 2008-05-09
  • 打赏
  • 举报
回复
个人习惯问题
其次这样写比较明了,因为大家都习惯这么看啊

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧