本文讲述了如何通过宏定义的方法来新建设置CPLD寄存器类的函数。并且采用了位段的方法来更新寄存器的某几位。测试结果表明,结构体上面的成员变量,对应字节低位。结构体下面的成员变量,对应字节高位。使用时,最好在自己的环境上测试好。
#include
#include
static unsigned char RegBuf[5] = {0};
typedef struct Reg1Struct{
unsigned char func10:6;
unsigned char func11:2;
}Reg1;
typedef struct Reg2Struct{
unsigned char func20:1;
unsigned char func21:7;
}Reg2;
typedef struct Reg3Struct{
unsigned char func30:3;
unsigned char func31:5;
}Reg3;
typedef struct Reg4Struct{
unsigned char func40:4;
unsigned char func41:4;
}Reg4;
typedef struct Reg5Struct{
unsigned char func5:8;
}Reg5;
int regRead(int addr, unsigned char *data)
{
*data = RegBuf[addr];
return 0;
}
int regWrite(int addr, unsigned char *data)
{
RegBuf[addr] = *data;
printf("%s:write %x to reg %x \n", __FUNCTION__, *data, addr);
return 0;
}
#define REG_SET_FUNC(regNum, bitMember) \
unsigned char reg_set_##bitMember(unsigned char memVal)\
{\
Reg##regNum *pReg;\
unsigned char regValue = 0;\
regRead(regNum, ®Value);\
pReg = (Reg##regNum *)®Value;\
pReg->bitMember = memVal;\
regWrite(regNum, ®Value);\
return pReg->bitMember;\
}
REG_SET_FUNC(1,func10)
REG_SET_FUNC(1,func11)
REG_SET_FUNC(2,func20)
REG_SET_FUNC(2,func21)
REG_SET_FUNC(3,func30)
REG_SET_FUNC(3,func31)
REG_SET_FUNC(4,func40)
REG_SET_FUNC(4,func41)
REG_SET_FUNC(5,func5)
int main(void)
{
reg_set_func10(1);
reg_set_func11(1);
reg_set_func20(1);
reg_set_func21(1);
reg_set_func30(1);
reg_set_func31(1);
reg_set_func40(1);
reg_set_func41(1);
reg_set_func5(1);
return 0;
}
sunxk@146:~> ./func
regWrite:write 1 to reg 1
regWrite:write 41 to reg 1
regWrite:write 1 to reg 2
regWrite:write 3 to reg 2
regWrite:write 1 to reg 3
regWrite:write 9 to reg 3
regWrite:write 1 to reg 4
regWrite:write 11 to reg 4
regWrite:write 1 to reg 5