外部IC寄存器的位定义
宏定义法:即常量操作
方法1:用#define来定义,方便省事,缺点:系统不做检查
方法2:用enum来定义,可以像#define一样定义常量,同时系统做检查。既可以定义某个位也可以定义几个位的组合,备注:enum中标识不可以重复,但后面的值可以重复。
/*枚举法定义寄存器,枚举中的值可以重复但名称不能重复*/
// 通信寄存器bit定义
1 enum 2 { 3 /* 寄存器选择 RS2 RS1 RS0 */ 4 REG_COMM = (0 << 4), /* 通信寄存器 */ 5 REG_SETUP = (1 << 4), /* 设置寄存器 */ 6 REG_CLOCK = (2 << 4), /* 时钟寄存器 */ 7 REG_DATA = (3 << 4), /* 数据寄存器,16位 */ 8 REG_TEST = (4 << 4), /* 测试寄存器 8位*/ 9 REG_NODO = (5 << 4), /* 无操作 */ 10 REG_OFFSET = (6 << 4), /* 偏移(满标度校准)寄存器24位 */ 11 REG_GAIN = (7 << 4), /* 增益(零标度校准)寄存器,24位 */ 12 13 /* 读写操作 */ 14 WRITE = (0 << 3), /* 写操作 */ 15 READ = (1 << 3), /* 读操作 */ 16 17 WAIT_MODE =(1 << 2), 18 WAIT_NONE =(0 << 2), 19 /*STBU =0X40 等待和掉电模式*/ 20 /* 通道 */ 21 CH_1 = (0 << 0), /* AIN1+ AIN1- */ 22 CH_2 = (1 << 0), /* AIN2+ AIN2- */ 23 CH_3 = (2 << 0), /* AIN1- AIN1- */ 24 CH_4 = (3 << 0) /* AIN1- AIN2- */ 25 }; 26 27 /* 设置寄存器bit定义 */ 28 enum 29 { 30 MD_NORMAL = (0 << 6), /* 正常模式 */ 31 MD_CAL_SELF = (1 << 6), 32 /* 自校准模式,消除偏移和增益误差。上电执行一次,单极性是内部将IN+/-短接,时间是6倍输出速率,然后读数据到校准BUF中t=6 ×1/输出频率 ;tRdy=9 ×1/输出频率*/ 33 MD_CAL_ZERO = (2 << 6), /* 校准0刻度模式 环境变化时执行0校准和满校准到对应的校准buf中,3 ×1/输出频率*/ 34 MD_CAL_FULL = (3 << 6), /* 校准满刻度模式,tconv=3 ×1/输出频率,tRdy=4 ×1/输出频率 */ 35 36 GAIN_1 = (0 << 3), /* 增益 */ 37 GAIN_2 = (1 << 3), /* 增益 */ 38 GAIN_4 = (2 << 3), /* 增益 */ 39 GAIN_8 = (3 << 3), /* 增益 */ 40 GAIN_16 = (4 << 3), /* 增益 */ 41 GAIN_32 = (5 << 3), /* 增益 */ 42 GAIN_64 = (6 << 3), /* 增益 */ 43 GAIN_128 = (7 << 3), /* 增益 */ 44 45 /* 无论双极性还是单极性都不改变任何输入信号的状态,它只改变输出数据的代码和转换函数上的校准点 */ 46 BIPOLAR = (0 << 2), /* 双极性输入 */ 47 UNIPOLAR = (1 << 2), /* 单极性输入 */ 48 49 BUF_NO = (0 << 1), /* 输入无缓冲(内部缓冲器不启用) */ 50 BUF_EN = (1 << 1), /* 输入有缓冲 (启用内部缓冲器) */ 51 52 FSYNC_0 = 0, /* 由1到0,从已知时间点(下一个时钟)开始采样 */ 53 FSYNC_1 = 1 /* 不启用即不采样,处于复位状态 */ 54 }; 55 56 /* 时钟寄存器bit定义 */ 57 enum 58 { 59 CLKDIS_0 = (0<<4), /* 时钟输出使能 (当外接晶振时,必须使能才能振荡) */ 60 CLKDIS_1 =(1<<4), /* 时钟禁止 (当外部提供时钟时,设置该位可以禁止MCK_OUT引脚输出时钟以省电 */ 61 62 /* 63 2.4576MHz(CLKDIV=0 )或为 4.9152MHz (CLKDIV=1 ),CLK 应置 “1”。 64 1MHz (CLKDIV=0 )或 2MHz (CLKDIV=1 ),CLK 该位应置 “0” 65 */ 66 67 CLKDIV= (1<<3), 68 CLK = (1<<2), 69 70 CLK_4_9152M = (0x03<<2), /*CLK=1*/ 71 CLK_2_4576M = (0x01<<2), /*CLK=1*/ 72 CLK_1M = (0x00<<2), /*CLK=0*/ 73 CLK_2M = (0x02<<2), /*CLK=0*/ 74 75 FS_50HZ = (0<<0)|CLK, /*2ms输出一个数字*/ 76 FS_60HZ = (1<<0)|CLK, 77 FS_250HZ = (2<<0)|CLK, 78 FS_500HZ = (3<<0)|CLK, 79 80 FS_20HZ = (0<<0), 81 FS_25HZ = (1<<0), 82 FS_100HZ = (2<<0), 83 FS_200HZ = (3<<0), 84 85 /* 86 提高TM7705 精度的方法: 87 当使用主时钟为 2.4576MHz 时,强烈建议将时钟寄存器设为 84H,此时数据输出更新率为10Hz,即每0.1S 输出一个新数据。 88 当使用主时钟为 1MHz 时,强烈建议将时钟寄存器设为80H, 此时数据输出更新率为4Hz, 即每0.25S 输出一个新数据 89 */ 90 // ZERO_0 = 0x00, 91 // ZERO_1 = 0x80 92 };
变量定义法:这样相当于定义了变量,通过修改变量和使用变量方法:参考
/*用结构体变量方法定义*/ Typedef union{ uint_16 Reg_Bit16; struct{ { // 低字节低位,低字节高位,高字节低位,高字节高位 uint_16 bit0:0; // uint_16 bit1:1; // uint_16 bit2:2; // uint_16 bit3:3; // uint_16 bit4:4; // uint_16 bit5:5; // uint_16 bit6:6; // uint_16 bit7:7; // uint_16 bit8:8; // uint_16 bit9:9; // uint_16 bit10:1; // uint_16 bit10:10; // uint_16 bit11:11; // uint_16 bit12:12; // uint_16 bit13:13; // uint_16 bit14:14; // uint_16 bit15:15 // }Bits; }; Extern volatile Reg_XXX @(REG_BASE + 0x00000039);// #define FunBit Reg_XXX.Bits.bit0 // 寄存器的第0位 /*寄存器级别的使用,然后用宏定义定义其组合位定义*/ struct Reg_Bit8 { // 低字节低位,低字节高位,高字节低位,高字节高位 uint_8 busy/0 :1; // 7 写0,读busy uint_8 RegType :3; // 6:4 uint_8 W/R :1; // 3 Write/read uint_8 Waitmode :1; // 2 uint_8 Chnl :4; // 1:0 通道 }; union Communicate_REG { uint_8 all; struct Reg_Bit8 bit; }; struct Reg_Bit8 { // 低字节低位,低字节高位,高字节低位,高字节高位 uint_8 WorkMODE :2; // 7:6 保留 uint_8 Gain :3; // 5:3 uint_8 POLAR :1; // 2 0=双极性 uint_8 UseBUF :1; // 1=输入缓冲处理高阻抗源 uint_8 FSYNC :1; // 0=从下一个点采样;1停止采样 }; union Config_REG { uint_8 all; struct Reg_Bit8 bit; }; struct Reg_Bit8 { // 低字节低位,低字节高位,高字节低位,高字节高位 uint_8 rsvd :3; // 7:5 保留=000 uint_8 CLKDIS :1; // 4 禁止=1 uint_8 CLKDIV :1; // 3 uint_8 CLK :1; // 2 uint_8 FS :2; // 1:0和CLK一起决定输出速率 }; union CLK_REG { uint_8 all; struct Reg_Bit8 bit; }; /* 通信寄存器bit定义 */ /* 寄存器选择 RS2 RS1 RS0 */ #define REG_COMM (0 << 4) /* 通信寄存器 */ #define REG_SETUP (1 << 4) /* 设置寄存器 */ #define REG_CLOCK (2 << 4) /* 时钟寄存器 */ #define REG_DATA (3 << 4) /* 数据寄存器,16位 */ #define REG_TEST (4 << 4) /* 测试寄存器 8位*/ #define REG_NODO (5 << 4) /* 无操作 */ #define REG_OFFSET (6 << 4) /* 偏移(满标度校准)寄存器24位 */ #define REG_GAIN (7 << 4) /* 增益(零标度校准)寄存器,24位 */ /* 读写操作 */ #define WRITE (0 << 3) /* 写操作 */ #define READ (1 << 3) /* 读操作 */ #define WAIT_MODE (1 << 2) #define WAIT_NONE (0 << 2) /*通道 */ #define CH_1 (0 << 0) /* AIN1+ AIN1- */ #define CH_2 (1 << 0) /* AIN2+ AIN2- */ #define CH_3 (2 << 0) /* AIN1- AIN1- */ #define CH_4 (3 << 0) /* AIN1- AIN2- */ }; /* 设置寄存器bit定义 */ #define MD_NORMAL (0 << 6) /* 正常模式 */ #define MD_CAL_SELF (1 << 6) /* 自校准模式,消除偏移和增益误差。上电执行一次,单极性是内部将IN+/-短接,时间是6倍输出速率,然后读数据到校准BUF中t=6 ×1/输出频率 ;tRdy=9 ×1/输出频率*/ #define MD_CAL_ZERO (2 << 6) /* 校准0刻度模式 环境变化时执行0校准和满校准到对应的校准buf中,3 ×1/输出频率*/ #define MD_CAL_FULL (3 << 6) /* 校准满刻度模式,tconv=3 ×1/输出频率,tRdy=4 ×1/输出频率 */ #define #define GAIN_1 (0 << 3) /* 增益 */ #define GAIN_2 (1 << 3) /* 增益 */ #define GAIN_4 (2 << 3) /* 增益 */ #define GAIN_8 (3 << 3) /* 增益 */ #define GAIN_16 (4 << 3) /* 增益 */ #define GAIN_32 (5 << 3) /* 增益 */ #define GAIN_64 (6 << 3) /* 增益 */ #define GAIN_128 (7 << 3) /* 增益 */ /* 无论双极性还是单极性都不改变任何输入信号的状态,它只改变输出数据的代码和转换函数上的校准点 */ #define BIPOLAR (0 << 2) /* 双极性输入 */ #define UNIPOLAR (1 << 2) /* 单极性输入 */ #define BUF_NO (0 << 1) /* 输入无缓冲(内部缓冲器不启用) */ #define BUF_EN (1 << 1) /* 输入有缓冲 (启用内部缓冲器) */ #define FSYNC_0 0 /* 由1到0,从已知时间点(下一个时钟)开始采样 */ #define FSYNC_1 1 /* 不启用即不采样,处于复位状态 */ }; /* 时钟寄存器bit定义 */ enum { #define CLKDIS_0 (0<<4) /* 时钟输出使能 (当外接晶振时,必须使能才能振荡) */ #define CLKDIS_1 (1<<4) /* 时钟禁止 (当外部提供时钟时,设置该位可以禁止MCK_OUT引脚输出时钟以省电 */ /* 2.4576MHz(CLKDIV=0 )或为 4.9152MHz (CLKDIV=1 ),CLK 应置 “1”。 1MHz (CLKDIV=0 )或 2MHz (CLKDIV=1 ),CLK 该位应置 “0” */ CLKDIV= (1<<3), CLK = (1<<2), #define CLK_4_9152M = (0x03<<2)/*CLK=1*/ #define CLK_2_4576M = (0x01<<2)/*CLK=1*/ #define CLK_1M = (0x00<<2) /*CLK=0*/ #define CLK_2M = (0x02<<2)/*CLK=0*/ #define FS_50HZ = (0<<0)|CLK/*2ms输出一个数字*/ #define FS_60HZ = (1<<0)|CLK #define FS_250HZ = (2<<0)|CLK #define FS_500HZ = (3<<0)|CLK #define FS_20HZ = (0<<0) #define FS_25HZ = (1<<0) #define FS_100HZ = (2<<0) #define FS_200HZ = (3<<0) /*提高TM7705 精度的方法: 当使用主时钟为 2.4576MHz 时,强烈建议将时钟寄存器设为 84H,此时数据输出更新率为10Hz,即每0.1S 输出一个新数据。 当使用主时钟为 1MHz 时,强烈建议将时钟寄存器设为80H, 此时数据输出更新率为4Hz, 即每0.25S 输出一个新数据*/ // #define ZERO_0 0x00 // #define ZERO_1 0x80 }; /*模块层级的使用*/ struct TM7705_REGS { union Communicate_REG volatile ComReg; // Config_REG volatile ConfigReg; union CLK_REG volatile ClkReg; uint_16 volatile DataReg; }TM7705;