我是嵌入式系统编程的新手,并试图走自己的路。使用带有数据表的Stellaris LM4F120 LaunchPad 评估板LM4F120H5QR Microcontroller
,我发现可以获得一些寄存器的完整地址,您必须始终添加偏移量!我不明白它的重要性,因为我们可以直接使用完整地址!
例如配置端口 F(从
0x4002.5000
到 开始0x4002.5FFF
)及其引脚(使用 APB 总线)
- 通过在寄存器中将(位 5)设置为 1 来激活 clk 到该端口
RCGCGPIO
,它的基地址是0x400F.E000
偏移量,0x608
所以完整地址是0x400FE608
- 配置
GPIODIR
它的基地址0x4002.5000
与偏移量的reg,0x400
因此完整地址是0x4002.5400
- 配置
GPIODEN
它的基地址0x4002.5000
与偏移量的reg,0x51C
因此完整地址是0x4002.551C
- 配置
GPIODATA
它的基地址所在的reg,0x4002.5000
因此0x3FC
完整地址是0x4002.50x3FC
如果我能猜到这将是这里的偏移量用于使其不易出错,因为我们可以这样写:
#define GPIO_PORTF_BASE 0x40025000
#define GPIO_PORTF_DATA (*((volatile unsigned long *)(GPIO_PORTF_BASE + 0x3FC)))
#define GPIO_PORTF_DIR (*((volatile unsigned long *)(GPIO_PORTF_BASE + 0x400)))
#define GPIO_PORTF_DEN (*((volatile unsigned long *)(GPIO_PORTF_BASE + 0x51C)))
使用偏移量是否会增加可读性并使其更容易和简单,因为我们只需要写入偏移量即可获得所需的寄存器?
更新
我发现基地址比获取寄存器的完整地址更有用。
例如:
GPIODATA
控件0-7 pins
,它有 255 个寄存器,可以让我们单独配置每个引脚,甚至只需向基地址添加偏移量即可配置它们的组合,例如,如果我们要配置打开的红色 LED,Port F
我们直接写入地址base address 0x4002.5000 + offset 0x008
。