c - 从 32 位寄存器读入 16 位

标签 c assembly embedded arm

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

谢谢, 尼科

最佳答案

如果手册说先访问 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);

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

#define REGL (*(volatile uint16_t *) 0x1234)
#define REGH (*(volatile uint16_t *) 0x1236)

关于c - 从 32 位寄存器读入 16 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9895934/

相关文章:

memory - 从 16 位硬件寄存器读取

c - 移位何时会导致未定义的行为

debugging - 如何使用 Visual Studio 调试 amd64 上的未对齐访问?

c++ - C/C++ 中的并行数据到串行 : Implementing a multiplex

c - 为什么指针的值在转换后会发生变化?

c++ - C++如何处理不确定格式的数字和字符?

embedded - 固件工程师可以从软件工程师那里学到什么?

optimization - llvm 使用库函数进行优化

c - 这个构造 (int) { 1 } 是如何调用的?

c - 在 c 中使用指针时出现段错误(核心转储)