如何访问存储器映射外设的SFR(特殊功能寄存器)。
我怎样才能确定编译器不会弄乱字节序?
例如,如何访问地址0x00080
的32位寄存器,以及这些位如何映射?请不要羞于进入细节和低级别。
答案 0 :(得分:1)
大多数工具链或芯片供应商都会提供目标特定的头文件,并支持此功能。但是,如果您需要创建自己的,那么您可以定义:
volatile uint32_t* TMR0_ADDR = 0x00080 ;
#define TMR0 (*TMR0_ADDR) ;
您可以直接指定TMR0:例如:
TMR0 = 0x80000000 ;
关于位如何映射,asme和它们用于存储器(它们都是在所有存储器映射之后),因此0x00000001设置LSB,0x80000000设置MSB。如果要映射寄存器中的各个位字段,则可以使用位域结构(而不是上面的uint32_t
) - 但是,位域结构的实现是编译器特定的,因此您为一个生成的目标特定标头编译器可能无法移植到其他人。这就是为什么你应该尽可能使用工具链提供的标题。
答案 1 :(得分:0)
这取决于您使用的编译器,许多编译器提供 at 关键字,可用于放置变量,然后可用于访问sfr:
volatile uint32_t sfrVariable _at_ 0x00080;
sfrVariable = 0;
如果您使用GCC,它不会允许您这样做,在这种情况下您将不得不使用:
#define sfrVariable (*(volatile uint32_t *) 0x00080)
sfrVariable = 0;
默认情况下,编译器将运行little-endian,但大多数uint不受其影响,因为它已经是一个小端类型。