我想写一个字节来注册特定的内存地址(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。
答案 0 :(得分:1)
查找汇编指令手册以获取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;
答案 1 :(得分:1)
假设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等等。
答案 2 :(得分:0)
[register value] = ([register value] | [00 00 00 FF]) & [FF FF FF XX]
这里,xx是从给定地址读取的一个字节,然后设置一个24位的掩码。 然后执行按位&在上面显示的值 我认为这应该有用