从32位寄存器读取16位

Fal*_*ata 5 c embedded assembly arm

我正在尝试从特定寄存器中读取某些值.该手册指定我必须首先访问16位LSB访问,然后访问16位MSB访问.我是否只是一次读取所有32位,然后根据需要分别屏蔽剩余的16 msb/lsb?或者有没有办法只读16位拳.

谢谢,Neco

oua*_*uah 8

如果手册说要首先访问16位LSB然后再访问16位MSB,请按照手册中的说明进行操作.

例如(小端):

#define REG (*(volatile uint32_t *) 0x1234)

uint16_t val_hi, val_lo;

val_lo = *((volatile uint16_t *) &REG);
val_hi = *((volatile uint16_t *) &REG + 1);
Run Code Online (Sandbox Code Playgroud)

请注意,编译器有时也会提供HI和LO标识符来访问LSB或MSB,REG例如:

#define REGL (*(volatile uint16_t *) 0x1234)
#define REGH (*(volatile uint16_t *) 0x1236)
Run Code Online (Sandbox Code Playgroud)

  • 然而,这并不保证寄存器可以在读取lo和hi之间改变的意义上的"原子性". (2认同)