DSP

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

2019-07-13 21:00发布


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