《嵌入式Linux与物联网软件开发——C语言内核深度解析》一2.3 位操作与寄存器
本节书摘来自异步社区《嵌入式Linux与物联网软件开发——C语言内核深度解析》一书中的第2章,第2.3节,作者朱有鹏 , 张先凤,更多章节内容可以访问云栖社区“异步社区”公众号查看。
2.3 位操作与寄存器 2.3.1 寄存器的操作一般来说,一个SOC片内外设由若干个寄存器控制,IO操作的寄存器与内存统一编址,如果我们要操作片内外设,那么就是操作片内外设的控制寄存器。因此,控制硬件就是读写寄存器(寄存器亦可理解为特定地址的内存)。
SOC中一个寄存器的数据宽度一般是32bit,每个bit可以配置为0或者1,单个bit或相邻几个bit一起控制片上外设某个属性的状态。单个bit最多控制两种状态,三个bit最多控制8种状态。因此寄存器的特定bit配置为0或1,就可以实现对硬件的控制。
然而,CPU对寄存器读写一般都是按照寄存器的数据宽度一起读写(部分寄存器可以按照位读取,这里不讨论),即32bit读出,32bit写入。假设我们只想修改寄存器其中某个属性的状态,即修改寄存器特定位。那么就只能先整体读出来,然后将需要修改的部分修改后,再将修改后的值整体写入寄存器中,即读-改-写三部曲。并且我们只能修改需要修改的位,不能影响其他位。对寄存器特定位的操作分三种情况:清零、置1和取反。
2.3.2 寄存器特定位清零用如果希望将一个寄存器的某些特定位变成0而不影响其他位,可以构造一个合适的1和0组成的数,和这个寄存器原来的值进行位与操作,就可以将特定位清零。假设原来32位寄存器REG1中的值为0xAAAAAAAA,我们希望将bit8~bit15清零而其他位不变,将这个数与0xFFFF00FF进行位与即可。
REG1 = 0xFFFF00FF;
经过上式的读-改-写后,REG1中的值为0xAAAA00AA,达到了特定位清零的目的。
2.3.3 寄存器特定位置1用|如果希望将一个寄存器的某些特定位变成1而不影响其他位,可以构造一个合适的1和0组成的数,和这个寄存器原来的值进行位或操作,就可以将特定位置1。假设原来32位寄存器REG1中的值为0xAAAA00AA,我们希望将bit8~bit15置1而其他位不变,将这个数与0X0000FF00进行位或即可。
REG1 |= 0x0000FF00;
经过上式的读-改-写后,REG1中的值为0xAAAAFFAA,达到了特定位置1的目的。
2.3.4 寄存器特定位取反用~如果希望将一个寄存器的某些特定位0变成1,而1变成0,即取反而不影响其他位,可以构造一个合适的1和0组成的数,和这个寄存器原来的值进行位异或操作,就可以将特定位取反。假设原来32位寄存器REG1中的值为0xAAAAAAAA,我们希望将bit8~bit15取反而其他位不变,将这个数与0X0000FF00进行位异或即可。
REG1 ^= 0x0000FF00;
经过上式的读-改-写后,REG1中的值为0xAAAA55AA,达到了特定位取反的目的。
学完本节,你会发现配置寄存器操作并没有想象的那么难,只要我们学会设置位操作的特定的构造数就行了。上面举的例子是bit8~bit15,很好算。但如果要构造一个bit1、bit3~bit5、bit15~bit17位为1的数。傻眼了?一步步来,先用二进制挨个排列好0011 1000 0000 0011 1010,再换算成十六进制0X0003803A,总算算出来了。是不是非要这么麻烦呢?我们既然已经学习了位运算,能不能用位运算构建一个构造数呢?
异步社区 异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
相关文章
- 记一次无法正常本地登陆Linux服务器(确定密码正确)
- 用 screenfetch 和 linux_logo 显示带有酷炫 Linux 标志的基本硬件信息
- 《嵌入式Linux与物联网软件开发——C语言内核深度解析》一1.4 内存编址和寻址、内存对齐
- 《嵌入式Linux与物联网软件开发——C语言内核深度解析》一1.5 C语言如何操作内存
- 《嵌入式Linux与物联网软件开发——C语言内核深度解析》一第2章 C语言位操作2.1 引言
- 《嵌入式Linux与物联网软件开发——C语言内核深度解析》一2.4 位运算构建特定二进制数
- 《嵌入式Linux与物联网软件开发——C语言内核深度解析》一2.5 位运算实战演练1
- 《嵌入式Linux与物联网软件开发——C语言内核深度解析》一导读
- 《Linux C编程从入门到精通》一第2章 在Linux中编写C语言代码2.1 Linux中C语言程序开发流程和工具介绍
- 记录一次实验室linux系统的GPU服务器死机故障的排查——Linux系统的Power States
- 虚拟机Linux 教程之Ubuntu安装教程【超多图】
- Linux 之 arm linux 板子与 ubuntu 使用 nfs 进行 mount 挂载进行文件传输的简单整理
- Linux 之 arm linux 与 windows 使用 tftp 进行文件传输的简单整理
- 【Linux】linux经常使用基本命令
- Linux学习笔记(25)linux批量管理
- Linux学习笔记(10)linux网络管理与配置之一——主机名与IP地址,DNS解析与本地hosts解析(1-4)
- Linux修改ip
- 每天一个linux命令(18):find 命令概览
- Linux 忘记密码怎么办,CentOS和Ubuntu重置密码方法
- 【Linux】linux下用python获取底层硬件信息接口