arm: 使用结构体操作寄存器

使用结构体操作寄存器:

//寄存器赋值和取值的时候,要注意寄存器的长度,有的寄存器的值只有8位。
//还要注意,使用volatile修饰寄存器变量。volatile 参考http://www.cnblogs.com/mylinux/p/4630749.html
//addr.h
typedef unsigned int S3C24X0_REG32;

/* 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;

//nand.c
static S3C2410_NAND* s3c2410nand = (S3C2410_NAND *)0x4e000000;
//如此,s3c2410nand 表示寄存器组的起始地址 。
//&s3c2410nand->NFCMD 表示NFCMD寄存器的地址 。
//s3c2410nand->NFCMD 表示NFCMD寄存器的值 。
//寄存器赋值和取值的时候,要注意寄存器的长度,有的寄存器的值只有8位。
//还要注意,使用volatile修饰寄存器变量。

/* 读取数据 */
static unsigned char s3c2410_read_data(void)
{
    volatile unsigned char *p = (volatile unsigned char *)&s3c2410nand->NFDATA;
    return *p;
}

 

你可能感兴趣的:(ARM)