我有某个寄存器的内存地址(地址LCDCW1是C000)。
c codes:
#define LCDCW1 0xC000
*LCDCW1=0x31;
我只想将数据写入该寄存器。代码有问题,如何修改?
thx!
正如其他人所建议的那样,您可以声明一个适当的指针,即
volatile uint32_t *reg = (volatile uint32_t *)0xc000;
请注意,我已经添加了volatile
预选赛。在读取或写入硬件寄存器时,这始终是一个好主意,因为它可以确保您在 C 代码中执行的每次访问实际上都显示在生成的代码中。
不过,我通常更喜欢这样写宏
#define READ_LCDCW1() ...
#define WRITE_LCDCW1(value) ...
然后用适当的 gcc asms 填充这些内容。与直接使用指针相比,我更喜欢这些,因为:
- 我认为他们在代码中读得更好,识别我在做什么,读取寄存器,而不是关注我是如何做的。
- 某些寄存器需要多步骤过程才能从硬件读取。这很容易隐藏在这种风格的宏中,并且我的大部分代码仍然引用我感兴趣的寄存器,而不是硬件让我接触它们的复杂方式。
- 最后,通过使用
asm
s,我确切地知道如何访问寄存器。有时需要特殊的指令或地址空间来访问寄存器,而这些指令或地址空间通常无法由 C 编译器生成。
- 即使您不同意使用 asm 语句的动机,我仍然建议将寄存器访问包装在像这样的宏(或内联函数)中。
就您而言,最简单的定义应该是:
#define LCDCW1_ADDR 0xc000
#define READ_LCDCW1() (*(volatile uint32_t *)LCDCW1_ADDR)
#define WRITE_LCDCW1(val) ((*(volatile uint32_t *)LCDCW1_ADDR) = (val))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)