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;
}