如何访问内存映射外设的 SFR(特殊功能寄存器)。
我如何确定编译器不会弄乱字节顺序?
例如,如何访问地址 0x00080
的 32 位寄存器,这些位是如何映射的?请不要羞于深入细节和低层次。
最佳答案
大多数工具链或芯片供应商都会提供一个目标特定的头文件来支持这一点。但是,如果您需要创建自己的,那么您可以定义:
volatile uint32_t* TMR0_ADDR = 0x00080 ;
#define TMR0 (*TMR0_ADDR) ;
您可以直接分配TMR0:例如:
TMR0 = 0x80000000 ;
关于位的映射方式,就像它们用于内存一样(它们毕竟是内存映射的),因此 0x00000001 设置 LSB,0x80000000 设置 MSB。如果你想在寄存器中映射单个位域,那么你可以使用位域结构(而不是 uint32_t
如上所述) - 但是位域结构的实现是特定于编译器的,因此你可以使用特定于目标的 header 为一个编译器生成的结果可能无法移植到其他编译器。这就是为什么您应该尽可能使用工具链提供的 header 。
关于c - 在 32 位 Controller 上访问 SFR(特殊功能寄存器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24726251/