采用位域结构体的形式访问寄存器


Register.h文件

#ifndef _REGISTER_H_
#define _REGISTER_H_

//step1:定义各个寄存器的位,这里以TCR寄存器为例来说明是如何实现按位操作的。
//	     作为示例,其他几个寄存器只是象征性地写几位。
//===================================================================================================
//TIM寄存器的位定义
struct TIM_BITS	//这个寄存器是象征性地写几位
{
	unsigned int bit0:1;
	unsigned int bit1:1;
	unsigned int bit2:1;
	//…………
};

//PRD寄存器的位定义
struct PRD_BITS	//这个寄存器是象征性地写几位
{
	unsigned int bit0:1;
	unsigned int bit1:1;
	unsigned int bit2:1;
	//…………
};

//TCR寄存器的位定义
struct TCR_BITS
{
	unsigned int rsvd1:4;
	unsigned int TSS:1;
	unsigned int TRB:1;
	unsigned int rsvd2:4;
	unsigned int SOFT:1;
	unsigned int FREE:1;
	unsigned int rsvd3:2;
	unsigned int TIE:1;
	unsigned int TIF:1;
};

//TPR寄存器的位定义
struct TPR_BITS	//这个寄存器是象征性地写几位
{
	unsigned int bit0:1;
	unsigned int bit1:1;
	unsigned int bit2:1;
	//…………
};

//TPRH寄存器的位定义
struct TPRH_BITS	//这个寄存器是象征性地写几位
{
	unsigned int bit0:1;
	unsigned int bit1:1;
	unsigned int bit2:1;
	//…………
};
//===================================================================================================


//step2:共用体声明,以便访问(位域)结构体定义的各个成员
//===================================================================================================
union TIM_REG
{
	unsigned int	all;
	struct TIM_BITS bit;
};

union PRD_REG
{
	unsigned int	all;
	struct PRD_BITS bit;
};

union TCR_REG
{
	unsigned int	all;
	struct TCR_BITS bit;
};

union TPR_REG
{
	unsigned int	all;
	struct TPR_BITS bit;
};

union TPRH_REG
{
	unsigned int	 all;
	struct TPRH_BITS bit;
};
//===================================================================================================


//step3:当每个寄存器的位域结构体类型和共用体的定义都建立起来了,就可以定义这个寄存器类型了,
//		 这里定义CPU定时器的各个寄存器。(操作定时器需要好几个寄存器)
//===================================================================================================
struct CPUTIMER_REGS
{
	union  TIM_REG  TIM;	//定时器的计数寄存器
	union  PRD_REG  PRD;	//定时器的周期寄存器
	union  TCR_REG  TCR;	//定时器的控制寄存器
	unsigned int    rsvd1;	//保留
	union  TPR_REG  TPR;	//定时器的预定标寄存器低位
	union  TPRH_REG TPRH;	//定时器的预定标寄存器高位
};
//===================================================================================================

#endif


Register.c文件
#include "Register.h"

volatile struct CPUTIMER_REGS CpuTimer0;

//这里只是示例性的代码
int ConfigTimer0(void)
{
	CpuTimer0.TCR.bit.TSS = 1;  //访问一个单独位域的示例
	CpuTimer0.TCR.all = 1;		//访问整个TCR寄存器的示例
	
	//…………

	return 0;
}


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值