博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于寄存器操作的指针问题
阅读量:4112 次
发布时间:2019-05-25

本文共 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=(    ) 

[cpp] 
  1. #include <stdio.h>  
  2.   
  3. int main()  
  4. {  
  5.     unsigned char *p1;  
  6.     unsigned long *p2;  
  7.   
  8.         p1 = (unsigned char*)0x1000;  
  9.         p2 = (unsigned long*)0x2000;  
  10.       
  11.     printf("%x\n", p1 + 5);  
  12.     printf("%x\n", p2 + 5);  
  13.   
  14.     return 0;  
  15. }  

解析: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/

你可能感兴趣的文章
Longest Common Prefix -最长公共前缀
查看>>
Letter Combinations of a Phone Number
查看>>
Single Number II --出现一次的数(重)
查看>>
Valid Parentheses --括号匹配
查看>>
Remove Element--原地移除重复元素
查看>>
Remove Duplicates from Sorted Array--从有序数组中移除重复元素
查看>>
Count and Say
查看>>
Gas Station
查看>>
Palindrome Partitioning --回文切割 深搜(重重)
查看>>
Valid Palindrome 简单的回文判断
查看>>
Pascal's Triangle -- 生成杨辉三角
查看>>
Pascal's Triangle II 生成杨辉三角中的某行
查看>>
Minimum Depth of Binary Tree -- 二叉树的最小深度 DFS 加剪枝
查看>>
Climbing Stairs 爬楼梯方法 动态规划
查看>>
Merge Two Sorted Lists 合并两个有序链表
查看>>
pow(x,n) 为什么错这么多次
查看>>
Jump Game 动态规划
查看>>
Binary Tree Maximum Path Sum 自底向上求解(重重重重)
查看>>
Subsets 深搜
查看>>
Subsets II
查看>>