打印
[应用相关]

C语言操作寄存器

[复制链接]
967|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
skyred|  楼主 | 2021-10-15 14:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在嵌入式开发中,常常要操作寄存器,对寄存器进行写入,读出等等操作。每个寄存器都有自己固有的地址,通过C语言访问这些地址就变得尤为重要。


#define GSTATUS1        (*(volatile unsigned int *)0x560000B0)


在这里,我们举一个例子。这是一个状态寄存器的宏定义。首先,通过unsigned int我们能够知道,该寄存器是32位的。因为要避免程序执行过程中直接从cache中读取数据,所以用volatile进行修饰。每次都要重新读取该地址上的值。首先(volatile unsigned int*)是一个指针,我们就假设它为p吧。它存储的地址就是后面的0x560000B0,然后取这个地址的值,也就是*p,所以源代码变成了(*(volatile unsigned int *)0x560000B0),接下来我们就能直接赋值给GSTATUS1来改变地址0x560000B0上存储的值了。


/* NAND FLASH (see S3C2410 manual chapter 6) */
typedef struct {
    S3C24X0_REG32   NFCONF;
    S3C24X0_REG32   NFCMD;
    S3C24X0_REG32   NFADDR;
    S3C24X0_REG32   NFDATA;
    S3C24X0_REG32   NFSTAT;
    S3C24X0_REG32   NFECC;
} S3C2410_NAND;

static S3C2410_NAND * s3c2410nand = (S3C2410_NAND *)0x4e000000;

volatile unsigned char *p = (volatile unsigned char *)&s3c2410nand->NFSTAT;
有时候,你会看到这样一种情况的赋值。其实这和我们刚刚讲过的差不多。只不过这里是在定义了指针的同时对指针进行赋值。这里首先定义了结构体S3C2410_NAND,里面全部是32位的变量。又定义了这种结构体类型的指针,且指向0x4e000000这个地址,也就是此刻s3c2410nand指向了一个实际存在的物理地址。s3c2410nand指针访问了NFSTAT变量,但我们要的是它的地址,而不是它地址上的值。所以用&取NFSTAT地址,这样再强制转换为unsigned char型的指针,赋给p,就可以直接通过p来给NFSTAT赋值了。


使用特权

评论回复
沙发
huquanz711| | 2021-10-15 18:27 | 只看该作者
感谢楼主分享

使用特权

评论回复
板凳
kiwis66| | 2021-10-16 10:55 | 只看该作者
哦~~一直看这么定义,没仔细研究过~~

使用特权

评论回复
地板
tfqi| | 2021-11-5 09:49 | 只看该作者
现在基本都是这样操作的吧

使用特权

评论回复
5
qcliu| | 2021-11-5 09:51 | 只看该作者
现在极少看见汇编了

使用特权

评论回复
6
nawu| | 2021-11-5 09:52 | 只看该作者
呵呵  我偷懒 用cube生成

使用特权

评论回复
7
kxsi| | 2021-11-5 09:53 | 只看该作者
宏定义是不是一直占用资源啊

使用特权

评论回复
8
gwsan| | 2021-11-5 09:56 | 只看该作者
NFSTAT变量是一种什么变量啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

102

主题

740

帖子

3

粉丝