我正在尝试从特定寄存器中读取某些值。该手册指定我必须首先访问16位LSB访问,然后访问16位MSB访问。我是否只是一次读取所有32位,然后根据需要分别屏蔽剩余的16 msb / lsb?或者是否有办法只读16位拳头。
谢谢, 尼哥
答案 0 :(得分:8)
如果手册说要首先访问16位LSB然后再访问16位MSB,请按照手册说的那样进行操作。
例如(小端):
#define REG (*(volatile uint32_t *) 0x1234)
uint16_t val_hi, val_lo;
val_lo = *((volatile uint16_t *) ®);
val_hi = *((volatile uint16_t *) ® + 1);
请注意,编译器有时也提供HI和LO标识符来访问LSB或MSB,例如示例中的REG
:
#define REGL (*(volatile uint16_t *) 0x1234)
#define REGH (*(volatile uint16_t *) 0x1236)
答案 1 :(得分:2)
目前还不清楚您使用的是哪种语言。我假设您在C中使用内联汇编。
我最熟悉NASM。使用i386的NASM语法:
mov eax, 0x12345678 ; load whatever value
mov bx, ax ; put LSW in bx
shr eax, 16 ; shift MSW to ax
; now ax = MSW, bx = LSW
我猜测气体(C)代码是这样的:
movl $0x12345678, %eax # load whatever value
movw %ax, %bx # put LSW in bx
shrl $16, %eax # shift MSW to ax
# now ax = MSW, bx = LSW