4# kkjiongquan
谢谢,请问你说的“这里的宏定义AT91_CAST没有什么意思,它对(a)没操作。”指的是#define AT91_CAST(a) (a) 中右边的(a)吧?那么下面程序中第五行的#define AT91_CAST(a) 是不是什么也没有定义呢?
我把这个arm9的头文件的一小段程序再列出来
#ifndef _ASSEMBLE_ //第一行
typedef volatile unsigned int AT91_REG; //硬件寄存器定义 第二行
#define AT91_CAST(a) (a) //第三行
#else //第四行
#define AT91_CAST(a) //第五行
#endif //第六行
然后有下面的语句
// *****************************************************************************
// SOFTWARE API DEFINITION FOR Error Correction Code controller
// *****************************************************************************
#ifndef __ASSEMBLY__
typedef struct _AT91S_ECC { //第十一行
AT91_REG ECC_CR; // ECC reset register 第十二行
AT91_REG ECC_MR; // ECC Page size register
AT91_REG ECC_SR; // ECC Status register
AT91_REG ECC_PR; // ECC Parity register
AT91_REG ECC_NPR; // ECC Parity N register
AT91_REG Reserved0[58]; //
AT91_REG ECC_VR; // ECC Version register
} AT91S_ECC, *AT91PS_ECC; // 第十九行
#else
#define ECC_CR (AT91_CAST(AT91_REG *) 0x00000000) // (ECC_CR) ECC reset register 第二十一行
#define ECC_MR (AT91_CAST(AT91_REG *) 0x00000004) // (ECC_MR) ECC Page size register
#define ECC_SR (AT91_CAST(AT91_REG *) 0x00000008) // (ECC_SR) ECC Status register
#define ECC_PR (AT91_CAST(AT91_REG *) 0x0000000C) // (ECC_PR) ECC Parity register
#define ECC_NPR (AT91_CAST(AT91_REG *) 0x00000010) // (ECC_NPR) ECC Parity N register
#define ECC_VR (AT91_CAST(AT91_REG *) 0x000000FC) // (ECC_VR) ECC Version register 第二十六行
#endif
// -------- ECC_CR : (ECC Offset: 0x0) ECC reset register --------
#define AT91C_ECC_RST (0x1 << 0) // (ECC) ECC reset parity // 第二十九行
// -------- ECC_MR : (ECC Offset: 0x4) ECC page size register --------
#define AT91C_ECC_PAGE_SIZE (0x3 << 0) // (ECC) Nand Flash page size
// -------- ECC_SR : (ECC Offset: 0x8) ECC status register --------
#define AT91C_ECC_RECERR (0x1 << 0) // (ECC) ECC error
#define AT91C_ECC_ECCERR (0x1 << 1) // (ECC) ECC single error
#define AT91C_ECC_MULERR (0x1 << 2) // (ECC) ECC_MULERR
// -------- ECC_PR : (ECC Offset: 0xc) ECC parity register --------
#define AT91C_ECC_BITADDR (0xF << 0) // (ECC) Bit address error
#define AT91C_ECC_WORDADDR (0xFFF << 4) // (ECC) address of the failing bit
// -------- ECC_NPR : (ECC Offset: 0x10) ECC N parity register --------
#define AT91C_ECC_NPARITY (0xFFFF << 0) // (ECC) ECC parity N
// -------- ECC_VR : (ECC Offset: 0xfc) ECC version register --------
#define AT91C_ECC_VR (0xF << 0) // (ECC) ECC version register //第四十二行
有个问题哈
第十一行到第十九行定义了一个有关寄存器的结构体,第二十一行到第二十六行定义了相应寄存器的地址,第二十九行到第四十二行定义了寄存器相应功能位的值,我的表述有错么?
我要对寄存器赋值的话比如这样可以么:AT91PS_ECC->ECC_CR=0x01,直接对结构体的元素赋值,我问了别人说不对,要根据这行#define ECC_CR (AT91_CAST(AT91_REG *) 0x00000000) // (ECC_CR) ECC reset register 代码,这样赋值 *ECC_CR=0x01 是对的,问题是那还要那个结构体干嘛?
第二十九行的“ #define AT91C_ECC_RST (0x1 << 0)”中, 可以写成这样么 “#define AT91C_ECC_RST 0x1 << 0 ”?没见过宏定义值加括号的呀
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
附件里面是这个头文件,谢谢
结束
|