宏定义寄存器设置函数


本文讲述了如何通过宏定义的方法来新建设置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, &regValue);\
	pReg = (Reg##regNum *)&regValue;\
    pReg->bitMember = memVal;\
    regWrite(regNum, &regValue);\
    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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AllenSun-1990

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值