我是位新操作并试图尝试一点点的新手。
假设我有一个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位的值吗?
答案 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位值的方式。