宏定义法:直接就是常量操作

方法1:用#define来定义,方便省事,缺点:系统不做检查

方法2:用enum来定义,可以像#define一样定义常量,同时系统做检查。既可以定义某个位也可以定义几个位的组合,备注:enum中标识不可以重复,但后面的值可以重复。

/*枚举法定义寄存器,枚举中的值可以重复但名称不能重复*/
// 通信寄存器bit定义
enum
{
/* 寄存器选择 RS2 RS1 RS0 */
REG_COMM = (0 << 4), /* 通信寄存器 */
REG_SETUP = (1 << 4), /* 设置寄存器 */
REG_CLOCK = (2 << 4), /* 时钟寄存器 */
REG_DATA = (3 << 4), /* 数据寄存器,16位 */
REG_TEST = (4 << 4), /* 测试寄存器 8位*/
REG_NODO = (5 << 4), /* 无操作 */
REG_OFFSET = (6 << 4), /* 偏移(满标度校准)寄存器24位 */
REG_GAIN = (7 << 4), /* 增益(零标度校准)寄存器,24位 */

/* 读写操作 */
WRITE = (0 << 3), /* 写操作 */
READ = (1 << 3), /* 读操作 */

WAIT_MODE =(1 << 2),
WAIT_NONE =(0 << 2),
/*STBU =0X40 等待和掉电模式*/
/* 通道 */
CH_1 = (0 << 0), /* AIN1+ AIN1- */
CH_2 = (1 << 0), /* AIN2+ AIN2- */
CH_3 = (2 << 0), /* AIN1- AIN1- */
CH_4 = (3 << 0) /* AIN1- AIN2- */
};

/* 设置寄存器bit定义 */
enum
{
MD_NORMAL = (0 << 6), /* 正常模式 */
MD_CAL_SELF = (1 << 6), /* 自校准模式,消除偏移和增益误差。上电执行一次,单极性是内部将IN+/-短接,时间是6倍输出速率,然后读数据到校准BUF中t=6 ×1/输出频率 ;tRdy=9 ×1/输出频率*/
MD_CAL_ZERO = (2 << 6), /* 校准0刻度模式 环境变化时执行0校准和满校准到对应的校准buf中,3 ×1/输出频率*/
MD_CAL_FULL = (3 << 6), /* 校准满刻度模式,tconv=3 ×1/输出频率,tRdy=4 ×1/输出频率 */

GAIN_1 = (0 << 3), /* 增益 */
GAIN_2 = (1 << 3), /* 增益 */
GAIN_4 = (2 << 3), /* 增益 */
GAIN_8 = (3 << 3), /* 增益 */
GAIN_16 = (4 << 3), /* 增益 */
GAIN_32 = (5 << 3), /* 增益 */
GAIN_64 = (6 << 3), /* 增益 */
GAIN_128 = (7 << 3), /* 增益 */

/* 无论双极性还是单极性都不改变任何输入信号的状态,它只改变输出数据的代码和转换函数上的校准点 */
BIPOLAR = (0 << 2), /* 双极性输入 */
UNIPOLAR = (1 << 2), /* 单极性输入 */

BUF_NO = (0 << 1), /* 输入无缓冲(内部缓冲器不启用) */
BUF_EN = (1 << 1), /* 输入有缓冲 (启用内部缓冲器) */

FSYNC_0 = 0, /* 由1到0,从已知时间点(下一个时钟)开始采样 */
FSYNC_1 = 1 /* 不启用即不采样,处于复位状态 */
};

/* 时钟寄存器bit定义 */
enum
{
CLKDIS_0 = (0<<4), /* 时钟输出使能 (当外接晶振时,必须使能才能振荡) */
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),

CLK_4_9152M = (0x03<<2),/*CLK=1*/
CLK_2_4576M = (0x01<<2),/*CLK=1*/
CLK_1M = (0x00<<2), /*CLK=0*/
CLK_2M = (0x02<<2),/*CLK=0*/

FS_50HZ = (0<<0)|CLK,/*2ms输出一个数字*/
FS_60HZ = (1<<0)|CLK,
FS_250HZ = (2<<0)|CLK,
FS_500HZ = (3<<0)|CLK,

FS_20HZ = (0<<0),
FS_25HZ = (1<<0),
FS_100HZ = (2<<0),
FS_200HZ = (3<<0),

/*
提高TM7705 精度的方法:
当使用主时钟为 2.4576MHz 时,强烈建议将时钟寄存器设为 84H,此时数据输出更新率为10Hz,即每0.1S 输出一个新数据。
当使用主时钟为 1MHz 时,强烈建议将时钟寄存器设为80H, 此时数据输出更新率为4Hz, 即每0.25S 输出一个新数据
*/
// ZERO_0 = 0x00,
// ZERO_1 = 0x80
};

变量定义法:这样相当于定义了变量,通过修改变量和使用变量方法:参考https://wenku.baidu.com/view/f19d87727fd5360cba1adb45

/*用结构体变量方法定义*/
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
#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;

转载于:https://www.cnblogs.com/jieruishu/p/10843016.html

外部IC寄存器的位定义相关推荐

  1. 2.4 特殊功能寄存器和位定义

    版权声明:本文为芝麻软件工作室原创文章,未经芝麻软件工作室允许不得转载. https://blog.csdn.net/softn/article/details/51823307 接下来的几节,我们会 ...

  2. 痞子衡嵌入式:改动i.MXRT1xxx里IOMUXC_GPR寄存器保留位可能会造成系统异常

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是改动i.MXRT1xxx里IOMUXC_GPR寄存器保留位可能会造成系统异常. 痞子衡的嵌入式技术交流群里有一位非常活跃的朋友(网名:文 ...

  3. 51单片机的LED的位定义(通俗易懂)

    51单片机的LED的位定义 一.位定义原理 二.代码实现 三.烧录演示 一.位定义原理 定义方法:sbit 位名=特殊功能寄存器^位置; sbit LED1 = P2^0; 符号"^&quo ...

  4. 结构体的空间分配和位定义

    目录 概述 空间分配 位定义 概述 本文收录结构体相关的知识点,将遇到的相关问题和找到的解释说明集中在一起,便于需要时快速查找. 空间分配 请计算以下两个结构体所占用的空间大小: struct CAT ...

  5. c语言stm8变量存储类型,STM8使用----STVD(COSMIC)定义变量指定其类型和位定义

    STM8使用----STVD(COSMIC)定义变量指定其类型和位定义 http://www.51hei.com/bbs/dpj-31009-1.html (出处: 单片机论坛) stm8 stvd下 ...

  6. 标志寄存器——标志位

    标志位简介: 标志寄存器,又称程序状态寄存器(它的内容是Program Status Word,PSW).这是一个存放条件码标志,控制标志和系统标志的寄存器. 6个状态标志位 CF-进位标志,加法时的 ...

  7. Python:闭包(简介、使用方法、nonlocal修改闭包内使用的外部变量)、装饰器(定义、作用、通用装饰器、多个装饰器、带参数的装饰器、类装饰器、装饰器方式添加WEB框架的路由)

    一.闭包的介绍 闭包可以保存函数内的变量 当闭包执行完毕,外部函数的变量才释放. # 闭包的作用:可以保存外部函数的变量 # 闭包的形成条件 # 1.函数嵌套 # 2.内部函数使用了外部函数的变量或者 ...

  8. 详解汇编里的单步中断-T使用寄存器标志位TF和IF

    debug利用CPU提供的单步中断功能 程序的正常执行 取指令 改变CS:IP 执行指令 取指令 DEBUG提供单步中断的中断处理程序,显示所有寄存器的内容后等待输入命令 使用-T命令,debug将T ...

  9. 为什么单片机只有可以整除8的特殊寄存器能够位寻址?

    这个问题困扰了我很久,上课没有好好听,网上搜别人讲的都是模模糊糊没有给出具体的原因. 我只好大胆猜想了.(以下是我的猜想,如果有错误,请指正) 我有一个猜测,就是这些寄存器就是被设计成可以位寻址的,被 ...

  10. c语言在函数内部宏定义,简单讲解C++的内部和外部函数以及宏的定义

    C++内部函数和外部函数 函数本质上是全局的,因为一个函数要被另外的函数调用,但是,也可以指定函数只能被本文件调用,而不能被其他文件调用.根据函数能否被其他源文件调用,将函数区分为内部函数和外部函数. ...

最新文章

  1. Oracle 数据库连接失败问题
  2. Vue + Element UI——滚动条el-scrollerbar和无限滚动指令v-infinite-scroll整合解决方案
  3. C++PrimerCH2
  4. 写给初中级前端工程师的进阶指南
  5. ext js如何动态更改xtype_K8S ConfigMap 用于动态应用程序的实践
  6. 【linux】RedHat 7.x 升级 openssh 为 8.x 版本
  7. 【50】了解new和delete的合理替换时机
  8. HttpClient下载图片不完整的解决办法
  9. html5标签含义元素周期表
  10. 服务端渲染技术之Nuxt.js的详细使用
  11. 测试学习-123-Linux性能测试监控CPU内存脚本(极简清爽)
  12. 焦作护理学校计算机应用专业,2019焦作中职学校名单大全
  13. 解除网卡绑定(多台电脑上网)
  14. python之parser.add_argument()输入是什么!!
  15. 台式计算机键盘进水了还能用,台式电脑键盘进水了怎么办
  16. java中for(int a:list)
  17. VirutualBox虚拟机内ubuntu扩充硬盘容量
  18. 求伯君—金山电脑公司总裁
  19. 半天速成Python超简网站
  20. 在线程中调用OpenFileDialog/SaveFileDialog报错处理方法

热门文章

  1. Chrome和Firefox的xpi与crx加载第三方dll
  2. MariaDB安装教程(保姆级)
  3. TUIO+激光投影互动制作解析
  4. acrobat支持日文粘贴复制
  5. 2023年华中科技大学金融专硕考研参考书、难度分析及备考经验
  6. wordpress搜索ajax,基于wordpress的ajax写法详解
  7. matlab gui矩阵计算器,matlab-gui矩阵计算器.doc
  8. 如何在知网下载PDF文件
  9. php工具箱怎么换php版本,最新php程序员工具箱 v1.0版本介绍
  10. 极路由 安装php,极路由B70刷固件详细步骤说明