宏定义寄存器设置函数

来源:互联网 发布:origin8软件 编辑:程序博客网 时间:2024/05/18 02:17

本文讲述了如何通过宏定义的方法来新建设置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

原创粉丝点击