位和结构体寄存器访问方法(转)
1.2.1 传统#define 方法
- //*****************************************************************************
- //传统的头文件
- //*****************************************************************************
- //存储器映像地址寄存器
- #define CPUTIMER0_TIM (volatile unsigned long *)0x0C00
- //0xC00定时器0 计数器低位
- //0xC01定时器0 计数器高位
- #define CPUTIMER0_PRD (volatile unsigned long *)0x0C02
- //0xC02定时器0 周期寄存器低位
- //0xC03定时器0 周期寄存器高位
- #define CPUTIMER0_TCR (volatile unsigned int *)0x0C04
- //0xC04定时器0 控制寄存器
- //0xC05保留
- #define CPUTIMER0_TPR (volatile unsigned int *)0x0C06
- //0xC06定时器0 预定标寄存器低位
- #define CPUTIMER0_TPRH (volatile unsigned int *)0x0C07
- //0xC07定时器0 预定标寄存器高位
1.2.2 位域及结构体方法
- //*****************************************************************************
- //采用结构体形式的CPU 定时器头文件
- //*****************************************************************************
- struct CPUTIMER_REGS //仅仅定义了一个结构体类型CPUTIMER_REGS,还没有
- //定义变量
- { Uint32 TIM; //定时器计数寄存器
- Uint32 PRD; //定时器周期寄存器
- Uint16 TCR; //定时器控制寄存器
- Uint16 rsvd1; //保留
- Uint16 TPR; //定时器预定标寄存器低位
- Uint16 TPRH; //定时器预定标寄存器高位
- };
- //*****************************************************************************
- //采用结构体形式的CPU 定时器头文件
- //*****************************************************************************
- volatile struct CPUTIMER_REGS CpuTimer0Regs; //定义CpuTimer0Regs 是
- //一个具有CPUTIMER_REGS
- //类型的变量,下同
- volatile struct CPUTIMER_REGS CpuTimer1Regs;
- volatile struct CPUTIMER_REGS CpuTimer2Regs;
- //*****************************************************************************
- //DSP281x_headers\source\DSP281x_GlobalVariableDefs.c
- //*****************************************************************************
- //采用#pragma 编译器声明,将CpuTimer0Regs 变量分配到CpuTimer0RegsFile 数据
- //区。C 或C++采用不同的#pragma 声明方式。当对一个C++程序进行编译时,编译器自
- //动定义__cplusplus。
- #ifdef __cplusplus //用于 C++代码
- #pragma DATA_SECTION("CpuTimer0RegsFile");
- #else //用于C 代码
- #pragma DATA_SECTION(CpuTimer0Regs,"CpuTimer0RegsFile");
- #endif
- Volatile structCPUTIMER_REGS CpuTimer0Regs; //定义CpuTimer0Regs 是一
- //个具有CPUTIMER_REGS 类
- //型的变量
- //#ifdef、#else 及#endif 为预处理器条件编译指令。其中#ifdef 和#else 格式类似
- //C 中的if 和else。主要差异为预处理器不能识别标记代码块的大括号"{}",因此使用
- //#else(如果需要)和#end if(必须存在)来标记指令块。上面指令的含义为:如果采
- //用的是C++,则执行语句#pragma DATA_SECTION("CpuTimer0RegsFile");
- //倘若采用的是C,则执行语句#pragma DATA_SECTION(CpuTimer0Regs,
- //"CpuTimer0RegsFile");
- //*****************************************************************************
- //DSP281x_headers\include\DSP281x_Headers_nonBIOS.cmd
- //*****************************************************************************
- MEMORY /* 定义存储区域。注意:cmd 文件不可以用“//”注释符 */
- {
- PAGE 1: /* PAGE 1 在cmd 文件中表示数据区 */
- CPU_TIMER0 : origin = 0x000C00, length = 0x000008
- /* 将起始地址为0x0C00,长度为8 个单元的内存区域 */
- /* 定义为CPU 定时器0 寄存器存储区 */
- }
- SECTIONS /* 分配存储区域 */
- {
- CpuTimer0RegsFile : > CPU_TIMER0, PAGE = 1
- /* 将 CpuTimer0RegsFile 段分配到CPU_TIMER0 区域 */
- }
- //***********************************************
****************************** - //用户源文件
- //**************************************************
*************************** - CpuTimer0Regs.TCR.all = TSS_MASK; //访问TCR 寄存器示例
1.2.3 添加位域结构体
- //*****************************************************************************
- //DSP281x_headers\include\DSP281x_CpuTimers.h CPU 定时器头文件
- //*****************************************************************************
- struct TCR_BITS //定义一个TCR_BITS 结构体类型(不是变量)
- { Uint16 rsvd1:4; //3:0 保留,从最低位开始,顺序取位到最高位。取低4 位
- Uint16 TSS:1; //4 定时器开始/停止,取第5 位
- Uint16 TRB:1; //5 定时器重装,取第6 位
- Uint16 rsvd2:4; //9:6 保留,取第7 位到第10 位
- Uint16 SOFT:1; //10 仿真模式,取第11 位
- Uint16 FREE:1; //11 仿真模式,取第12 位
- Uint16 rsvd3:2; //12:13 保留,取第13 位到第14 位
- Uint16 TIE:1; //14 输出使能,取第15 位
- Uint16 TIF:1; //15 中断标志,取第16 位
- };
- //*****************************************************************************
- //DSP281x_headers\include\DSP281x_CpuTimers.h CPU 定时器头文件
- //*****************************************************************************
- union TCR_REG //定义共用体类型TCR_REG(不是变量)
- { Uint16 all;
- struct TCR_BITS bit; //bit 是一个具有TCR_BITS 结构体类型的变量
- };
- //all 和bit 是共用体的两个成员,它们都是16 位结构,占用内存的同一单元
- //*****************************************************************************
- //DSP281x_headers\include\DSP281x_CpuTimers.h CPU 定时器头文件
- //*****************************************************************************
- struct CPUTIMER_REGS
- { union TIM_GROUP TIM; //定时器计数寄存器,TIM 是一个具有 TIM_GROUP 共
- //用体类型的变量
- union PRD_GROUP PRD; //定时器周期寄存器
- union TCR_REG TCR; //定时器控制寄存器
- Uint16 rsvd1; //保留
- union TPR_REG TPR; //定时器预定标寄存器低位
- union TPRH_REG TPRH; //定时器预定标寄存器高位
- };
- //*****************************************************************************
- //用户源文件
- //*****************************************************************************
- CpuTimer0Regs.TCR.bit.TSS = 1; //访问一个单独的位域的示例
- CpuTimer0Regs.TCR.all = TSS_MASK; //访问整个寄存器的示例
- #define TCR_MASK 0x0010
- …
- CpuTimer0Regs.TCR.all = TCR_MASK;
- //*****************************************************************************
- //用户源文件
- //*****************************************************************************
- SysCtrlRegs.WDCR = 0x0068;
- //*****************************************************************************
- //用户源文件
- //*****************************************************************************
- CpuTimer0Regs.TCR.bit.TSS = 1; //1 = 停止定时器
- CpuTimer0Regs.TCR.bit.TRB = 1; //1 = 重装定时器
- CpuTimer0Regs.TCR.bit.SOFT = 1; //当SOFT=1 且FREE=1 时,定时器自由运行
- CpuTimer2Regs.TCR.bit.FREE = 1;
- CpuTimer2Regs.TCR.bit.TIE = 1; //1 = 使能定时器中断
- //*****************************************************************************
- //用户源文件
- //*****************************************************************************
- CpuTimer0Regs.TCR.all = TCR_MASK; //TCR_MASK 可在文件头部用#define 定义
1.2.4 共用体结构体位域的应用实例
- …
- Uint16 cont,g,s,b,q; //16 位无符号整型变量定义
- cont=0xfedc; //对cont 赋值
- …
- union //共用体类型定义
- { Uint16 i; //定义i 为16 位无符号整型变量
- struct //结构体类型定义
- {
- Uint16 low:4; //最低4 位在前。从最低4 位开始,取每4 位构成半字节
- Uint16 mid0:4;
- Uint16 mid1:4;
- Uint16 high:4; //最高4 位在后
- }HalfByte; //HalfByte 为具有所定义的结构体类型的变量
- }Count; //Count为具有所定义的共用体类型的变量
- g = Count.HalfByte.low; //将cont 的0~3 位赋值给g,g=0x000c
- s = Count.HalfByte.mid0; //将cont 的4~7 位赋值给s,s=0x000d
- b = Count.HalfByte.mid1; //将cont 的8~11 位赋值给b,b=0x000e
- q = Count.HalfByte.high; //将cont 的12~15 位赋值给q,q=0x000f
- union //共用体类型定义
- { Uint16 all; //定义all 为16 位无符号整型变量
- struct //结构体类型定义
- {
- Uint16 Bit1:1; //0 位Bit1 取寄存器最低位0 位,以下顺序取1 位直到最高位
- Uint16 Bit2:1; //1
- Uint16 Bit3:1; //2
- Uint16 Bit4:1; //3
- Uint16 Bit5:1; //4
- Uint16 Bit6:1; //5
- Uint16 Bit7:1; //6
- Uint16 Bit8:1; //7
- Uint16 Bit9:1; //8
- Uint16 Bit10:1; //9
- Uint16 Bit11:1; //10
- Uint16 Bit12:1; //11
- Uint16 Bit13:1; //12
- Uint16 Bit14:1; //13
- Uint16 Bit15:1; //14
- Uint16 Bit16:1; //15
- }bit; //bit为具有所定义的结构体类型的变量
- }CtrlBit; //CtrlBit 为具有所定义的共用体类型的变量
- CtrlBit.bit.Bit4 = 1;
- CtrlBit.bit.Bit8 = 1;
- CtrlBit.bit.Bit12 = 1;
- CtrlBit.bit.Bit16 = 1;
- CtrlBit.all = 0x8888;
浙公网安备 33010602011771号