【ARM】控制寄存器的几种方式

来源:互联网 发布:淘宝上的qq号能买吗 编辑:程序博客网 时间:2024/06/07 06:41

定义一个指向寄存器地址的指针

原理:利用强制类型转换将寄存器的地址强转为一个指向无符号整形的指针,并将其赋给一个指针变量。之后的操作可以转换为对指针的操作。

unsigned int * GPX2CON = (unsigned int *)0x11000c40;* GPX2CON = 0x10000000;

利用宏定义

原理:与上一种方法原理相同,最终都是对一个指向无符号整形的指针进行操作。不同之处在于强转之后直接对指针解除引用,从而不必定义指针变量。同时,利用宏定义,可以简化代码编写。

#define GPX2CON (*(unsigned int *)0x11000c40)GPX2CON = 0x10000000;

也可以再增加一层宏定义,在定义大量寄存器时可以简化代码。

#define __REG(x) (*(volatile unsigned int *)(x))#define GPX2CON __REG(0x11000c40)GPX2CON = 0x10000000;

结构体+宏定义

原理:因为当结构体中所有的成员变量的数据类型都相同的时候,结构体是紧密排列的,即在地址上是连续的。利用这个特性,当我们使用结构体指针操作其中的成员时,编译器会自动计算每个成员的地址。因此,如果让这个指针指向某个寄存器的首地址,就可以对之后的连续几个寄存器进行操作。
这种方式有一定的局限性,只有一些特定的场合,比如我们要操作的某个模块的相关寄存器在内存上连续分布。幸运的是,厂商早已帮我们想好了,因此大多数情况下这些寄存器的地址都是连续的。

typedef struct{    unsigned int CON;    unsigned int DAT;    unsigned int PUD;    unsigned int DRV;}gpx2;#define GPX2 (*(gpx2 *)0x11000c40)GPX2.CON = 0x10000000;