2

我想写一个字节来注册特定的内存地址(0x1228A432)

但是,该寄存器具有以下结构:

 Bits  |   Access   |   Name   | Reset  | Description |
[31:8] | Read only  | -------- | ------ |  Reserved   |
[7:0]  | Read-write | REG[7:0] | 0xXX   | ----------- |

请告诉我,如何在不“触及”保留位的情况下向该寄存器写入一个字节?

EDIT1:我的目标是 Cortex A9。我可以使用 256 位值(例如 0xFF)成功读取/写入板载 DDR2 内存

EDIT2:我曾经通过以下方式使用 DDR2 内存:

// First stage
static unsigned char *p = 0;
char * argv1="0x60000000";
unsigned long address=strtoul(argv1, 0, 0);
p = (unsigned char *) argv1;

// Second stage
char * argv4="FF";
int value=strtol(argv4,0,16);

// Third stage
int offset = 9;
p[offset]=value;

EDIT3:我发现了以下信息:

所有寄存器均为 32 位宽,不支持字节写入。写操作必须是字宽的,并且必须使用 read-modify-write 保留标记为保留的位。

4

3 回答 3

2

在汇编指令手册中查找 8 位写入指令(不确定是否存在)。如果是这样,请使用 uint8_t 分配给该内存位置 ( uint8_t volatile * const reg = (uint8_t volatile * const) 0x1228a432;)。

否则按照 Omkant 所说的去做。覆盖具有相同数字的位不应产生任何不需要的结果,因为它们在被覆盖之前没有“归零”。

他的 C 代码(这是为了更好的可读性的详细版本):

uint8_t your_8_bit_value = 0x42;
uint32_t volatile * const mem_map_register = (uint32_t volatile *) 0x1228a432;
*mem_map_register = (*mem_map_register & 0xFFFFFF00) | your_8_bit_value;
于 2012-10-22T07:41:19.417 回答
2

假设 32 位宽访问,保留位 [31:8] 的一种方法是读取值,将位 [7:0] 清零,按位或使用所需的值,然后将其写回寄存器.

类似的东西(从 RedX 窃取一点;)):

uint8_t your_8_bit_value = 0x42;
uint32_t volatile * const mem_map_register = (uint32_t volatile *) 0x1228a432;
*mem_map_register = (*mem_map_register & 0xFFFFFF00) | your_8_bit_value;

然而,我认为应该有更多关于您的硬件的信息。我看过几个数据表说,例如,您必须将所有 1 写入保留位(这意味着保留位保留以供将来使用,而 1 是安全默认值)等。因此,保留保留位并不总是很明显不受影响是正确的做法。

您应该找到有关您的硬件的更多详细信息 - 是否支持字节范围的写入,是否可能忽略对保留位的写入,或者应该全部为 0/1,等等。

于 2012-10-22T08:17:21.530 回答
0
[register value] = ([register value] | [00 00 00 FF]) & [FF FF FF XX]

在这里,xx 是从给定地址读取的一个字节,然后设置 24 位掩码。并对上面显示的值执行按位 & 我认为这应该有效

于 2012-10-22T07:22:51.073 回答