c - 在 32 位 Controller 上访问 SFR(特殊功能寄存器)

标签 c embedded

如何访问内存映射外设的 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/

相关文章:

c - c语言中的外部和全局

iOS int类型默认值问题

web-services - 物联网设备如何连接到服务器

c - 具有最小参数的可变参数函数

c - 如何将函数作为参数传递?

c - 在平面二进制文件中包含 char 数组的内容

c - 具有交错模式的 STM32 ADC 上的奇怪问题

embedded - QEMU 作为固件测试的嵌入式模拟器

将 atmega 32 代码转换为 atmega 16 代码

c - 指针减法混淆