微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > LPC11XX.h头文件解析

LPC11XX.h头文件解析

时间:11-13 来源:互联网 点击:

行结构体与地址对映的,是第六行的语句,现单独把它剔出来进行讨论。该语句如下:

#define LPC_SYSCON((LPC_SYSCON_TypeDef *) LPC_SYSCON_BASE)

首先来看,(LPC_SYSCON_TypeDef *) LPC_SYSCON_BASE是把LPC_SYSCON_BASE(即SYSCON的基址)强行转换为一个LPC_SYSCON_TypeDef结构体的指针类型。根据前面的定义,LPC_SYSCON_BASE的值是0x40048000(LPC_APB0_BASE + 0x48000),而强行把它转换为一个LPC_SYSCON_TypeDef结构体的指针类型,则这个结构体的首地址就是LPC_SYSCON_BASE的基址(0x40048000)。这样一来,结构体LPC_SYSCON_TypeDef内部各成员变量的地址,就是以这个基址(0x40048000)为参考点的偏移地址了。

首地址对映了,那偏移量怎么实现呢?这就与结构体中成员变量定义的数据类型有关了。回顾一下上面的SYSCON这个结构体中,成员变量都用的是“unsignedint”型来定义,占用4个字节的空间,而观察上面的“system control模块内所有寄存器的分布情况表”可以看出,它的每个寄存器之间正好是4个字节(或是4的正数倍)的地址偏移,所以只要用“unsignedint”型来定义成员变量,寄存器的偏移地址就自动适应了。如果遇到保留地址,则可以通过定义“unsignedint”型的空数组来避开,以保证后面成员变量的地址偏移正确。另外,由于LPC1114是32的结构,所以它的寄存器也是32位的,刚好是4个字节,这也是为何每个寄存器之间是4个字节地址偏移量的原因。在表中还可以看出寄存器的读写属性,这与前面结构体定义中的“__I”、“__IO”、“__O”等就可以联系起来了。

接下来,通过define语句来把刚才的结构体指针取个“别名”,即LPC_SYSCON。这时LPC_SYSCON就是这个结构体指针类型了,通过“LPC_SYSCON->”的方式就可以来引用它内部的成员变量(即system control模块内的各个寄存器)了。这样一来,就可以把底层的地址用高级语言的名称来表示,非常直观,比如前面例子中的要让PLL输入选择外部晶体振荡,执行语句“LPC_SYSCON->SYSPLLCLKSEL = 0x00000001;”就可以了,但如果没有这种地址对映,就必须写成“MOV0x40048040,#0x00000001”,这当然就非常不直观了,不查手册还不知道地址0x40048040是什么寄存器。

上述只是通过SYSCON这个结构体来进行讨论的,其它的结构体定义没有讨论。但它们所采用的方法是一样的,读者可参考上面对SYSCON结构体的分析方法来自行研究,这里就不再赘述了。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top