如何写入和读取32位寄存器的特定位

时间:2017-12-01 14:18:26

标签: c memory-management

我是位新操作并试图尝试一点点的新手。

假设我有一个32位寄存器,其构造如下:

Bit 31:12 RESERVED
Bit 11    CONFIG1
Bit 10    CONFIG2
Bit 9:0   DATA

已存在将数据写入寄存器的函数:

 #define WR_REG_32(address, value)    (*((volatile u32 *)(address)) = (value))

我想在第10位(CONFIG2)写入值0x0。该值应采用例如:

的格式
0x00005000 

那么,如何知道使用什么十六进制值来向Bit 10写入值0x0而不触及其他位?

另外,最简单的方法是从32位寄存器中读取0到9位的值吗?

1 个答案:

答案 0 :(得分:1)

您需要首先读取寄存器以写入相同的位,但位10强制为零。

要强制位为零,位10,必须在当前值和所有位到1 - 除了位10(零)之间使用按位ViewModelNode

AND

newValue = currentValue & ~(1<<10) 运算符反转位。 ~是按位AND。使用宏,

&

value = RD_REG_32(address) ; To read the current value WR_REG_32(address, value & ~(1<<10)) 读取当前值。

要读取位0~9,将其他位设为0

RD_REG_32

另请阅读Eric的评论如下。您的体系结构可能会影响您处理32位值的方式。