本文共 1594 字,大约阅读时间需要 5 分钟。
在arm单片机寄存器操作中,会有这样的指针操作,以GPIO的一个寄存器为例
#define GPBCON (*(volatile unsigned long*)0x50000010)
然后 给GPBCON操作
GPBCON =(1<<5*2);
其实
我们常见的是这样的
int a;
int *p;
p=&a;
*p=0x100;相当于a=0x100;
我们可以这样写:
int *p;
p=(int *)0x50000010;//强制类型转换为int *
那么*p就是*((int*)0x50000010)
所以我们想把一个数值写入一个地址空间:
就像如下方式
#define wirte(value) ((*(volatile unsigned long *) (Addr)) = ((volatile unsigned long)(value)))
或者
volatile unsigned long *p=(volatile unsigned long *) Addr;
p=value;
再来看下面的一个例子:
若有 unsigned char *p1; unsigned long *p2; p1 = (unsigned char *)0x1000; p2 = (unsigned long *)0x2000; 请问 p1+5=( ) p2+5=( )
解析:p1指向字符型,一次移动一个字符型,1个字节;p1+5后移5个字节,16进制表示为5;
p2指向长整型,一次移动一个长整型,4个字节,p2+5后移20字节,16进制表示为14。
{ char每次移动1个字节;short移动2个字节;int ,long ,float移动4个字节;double移动8个字节}
于是我们韦东山老师写的配置13个SDRAM寄存器可以这样写:#define MEM_CTL_BASE 0x48000000
/* 设置控制SDRAM的13个寄存器 */
void memsetup() { int i = 0; unsigned long *p = (unsigned long *)MEM_CTL_BASE; /* SDRAM 13个寄存器的值 */ unsigned long const mem_cfg_val[]={ 0x22011110, //BWSCON 0x00000700, //BANKCON0 S3C6410的数据手册上BANKCON0 的为 地址:0x48000004 0x00000700, //BANKCON1 地址:0x48000008 0x00000700, //BANKCON2 ... 0x00000700, //BANKCON3 .... 0x00000700, //BANKCON4 0x00000700, //BANKCON5 0x00018005, //BANKCON6 0x00018005, //BANKCON7 0x008C07A3, //REFRESH 0x000000B1, //BANKSIZE 0x00000030, //MRSRB6 0x00000030, //MRSRB7 }; for(; i < 13; i++) p[i] = mem_cfg_val[i]; //指针p+1= 0x48000004,刚好配置寄存器的数值就写入地址空间 }
转载地址:http://wyrsi.baihongyu.com/