在32位控制器上访问SFR(特殊功能寄存器)

时间:2014-07-13 19:08:45

标签: c embedded

如何访问存储器映射外设的SFR(特殊功能寄存器)。

我怎样才能确定编译器不会弄乱字节序?

例如,如何访问地址0x00080的32位寄存器,以及这些位如何映射?请不要羞于进入细节和低级别。

2 个答案:

答案 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不受其影响,因为它已经是一个小端类型。