我是嵌入式系统编程的新手,并试图走自己的路。使用带有数据表的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。
