精华内容
下载资源
问答
  • 寄存器的地址怎么表示
    万次阅读 多人点赞
    2017-10-24 22:25:28

           寄存器PLC地址指存放于控制器中的地址,这些控制器可以是PLC,也可以使触摸屏,或是文本显示器。PLC地址一般采用10进制描述,共有5位,其中第一位代码寄存器类型。第一位数字和寄存器类型的对应关系如表1所示。PLC地址例如40001、30002等。
           寄存器modbus协议地址指通信时使用的寄存器地址,在实际编程中,由于寄存器PLC地址前缀的区分作用,所以只需说明后4位数,而且需转换为4位十六进制地址。例如PLC地址40001对应寻址地址0x0000,40002对应寻址地址0x0001,寄存器寻址地址一般使用16进制描述。再如,PLC寄存器地址40003对应协议地址0002,PLC寄存器地址30003对应协议地址0002。在实际编程中,由于前缀的区分作用,所以只需说明后4位数,而且需转换为4位十六进制地址。
           支持 Modbus 协议的设备或软件,使用时用户直接设置或看到的应 当是 Modbus 数据地址。Modbus 地址所访问的数据,是通过各种 “功能”读写而来。 功能码是 Modbus 地址的底层。 如果 Modbus 通 信的一方提供的所谓 Modbus 协议只有功能码,则需要注意了解此 功能号与 Modbus 地址间的对应关系。

           使用 modbus 地址时应注意下述问题:

     1)40001~4xxxx 是美国 modicon 公司和 ge 公司 plc 使用的 modbus 地址,它是基于1的地址,即同类元件的首地址为1。西门子 plc 的 modbus 地址是基于0的地址。 

    2)美国的 modbus 地址左起第2位用来表示元件的类型,例如 i0.0的 modbus 地址为010001。 因为数据类型已经包含在功

    更多相关内容
  • 寄存器的“地址”概念

    千次阅读 2017-03-09 10:21:07
    寄存器地址就是内存地址  分为 逻辑地址:  机器语言指令仍用这种地址指定一个操作数的地址或一条指令的地址。这种寻址方式在Intel的分段结构中表现得尤为具体,它使得MS-DOS或Windows程序员把程序分为...

    寄存器的地址就是内存地址 

    分为



    逻辑地址:
       机器语言 指令仍用这种地址指定一个操作数的地址或一条指令的地址。这种 寻址方式 在Intel的分段结构中表现得尤为具体,它使得MS-DOS或Windows程序员把程序分为若干段。每个逻辑地址都由一个段和偏移量组成。
      线性地址:
      线性地址是一个32位的 无符号整数 ,可以表达高达232(4GB)的地址。通常用16进制表示线性地址,其取值范围为0x00000000~0xffffffff。
      物理地址:
      也就是内存单元的实际地址,用于芯片级内存单元寻址。物理地址也由32位 无符号整数 表示。
      MMU是一种硬件电路,它包含两个部件,一个是分段部件,一个是分页部件,在本书中,我们把它们分别叫做分段机制和分页机制,以利于从逻辑的角度来理解硬件的实现机制。分段机制把一个逻辑地址转换为线性地址;接着,分页机制把一个线性地址转换为物理地址。
    展开全文
  • STM32寄存器的简介、地址查找,与直接操作寄存器

    万次阅读 多人点赞 2019-01-11 11:15:15
    寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。  简单来说,寄存器就是存放东西的东西。从名字来看,跟火车站寄存行李的地方好像是有关系的。只不过火车站行李寄存处,存放的行李;寄存器...

    什么是寄存器

    提到单片机,就不得不提到寄存器。根据百度百科介绍,寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址
    举个例子
      简单来说,寄存器就是存放东西的东西。从名字来看,跟火车站寄存行李的地方好像是有关系的。只不过火车站行李寄存处,存放的行李;寄存器可能存放的是指令、数据或地址。
      存放数据的寄存器是最好理解的,如果你需要读取一个数据,直接到这个寄存器所在的地方来问问他,数据是多少就行了。问寄存器这个动作,叫做访问寄存器。不同的数据会存放在不同的寄存器,例如引脚PA2与PB8的高低电平数据(1或0)肯定放在不同的寄存器里,那么怎么区分不同的寄存器呢?通过地址,不同的寄存器有不同的地址,就像老张行李寄存处在101号店铺,老王行李寄存处在258号店铺。
      指令、地址寄存器与数据寄存器类似,里边存放的都是0和1,毕竟单片机也只认识机器码,机器码都是0或1,只是特别的规定下,数据寄存器里面存放的0和1表示数据,指令寄存器里存放的表示指令。
      个人理解:给CPU存储东西的地方。等CPU转到寄存器这个地方的时候,就拿出寄存器里存放的东西,或是根据寄存器里的命令做一些事情。比如厨房就是个寄存器,负责做饭。仓库也是个寄存器,负责存东西。需要某些功能的时候,就要操作某个寄存器。可以把寄存器类比为,有特殊功能的地方,既然是个地方当然就有地址了,所以,可以把寄存器想象为特殊的地址。

    怎么找到某个寄存器的地址?查看数据手册。

    手册中没有直接给出所有的寄存器的地址,需要读者稍加计算。STM32给不同的寄存器分配了不同的地址,有点像划分了片区。在《STM32中文参考手册_V10》的第28页,有不同寄存器的地址范围。
      现在,假如我们想读取PB3引脚的电平,该怎么找到相关的寄存器?
    第一步,找到GPIOB的基地址
      也就是找到GPIOB的小区。结论是,所有GPIOB相关的寄存器,都住在0x4001 0C00到0x4001 0FFF范围内。
    GPIOB的地址
    第二步,找到端口输入寄存器的地址偏移
      找到存储数据的那个屋子,结论是0x4001 0C00+8 = 0x4001 0C08
    GPIOB_IDR的地址偏移
    第三步,找到知道数据的那个人
      PB3的数据位于从右往左数第4个。
    引脚PB3的数据
      而这个寄存器的位数是32位(虽然高16位没有用到),这就是32位的单片机的意思。每个寄存器都占据4字节,32位。而CPU的总线一次可以操作32位,所以比8位单片机厉害一点。
      经过这三步查找,我们可以做出以下结论:
    PB3的输入数据位于0x4001 0C08这个地址上,这个地址上存放数据的右起第4个位就是PB3引脚对应的高低电平。
      我们可以简单粗暴地直接访问这个地址:

     unsigned int *pGPIOB_IDR = (unsigned int *)0x40010C08;
     unsigned char PB3 = *pGPIOB_IDR & 0x8;//取出从右往左数的第4位
    

    直接访问的操作并不好用,每操作一个寄存器就必须去查看数据手册,然后找找这个寄存器的地址。
      意法半导体公司为了方便大家使用,就把这些寄存器都起了一目了然的名字,把寄存器与地址映射关系放在他们提供的头文件里。这个文件就是stm32f10x.h。

    直接操作寄存器来点亮LED。

    我的板子对应的LED是PB8。

    • 首先要配置时钟使能。

    为什么配置时钟?为了省电,默认的时钟都是关闭的。配置STM32的任何资源前,都必须首先使能时钟。
      配置哪个时钟?
    时钟的信息在参考手册里边,参考手册十分巨大,不用通读,就像一个字典,需要什么查什么。
      参考手册,搜索"时钟",在表1里可以看到。
    时钟控制名字叫做RCC,属于AHB总线。GPIOB属于APB2。
    在这里插入图片描述
      下图系统结构可以看到时钟的从属关系,此图位于手册P25页,十分重要。可以看出AHB总线包含RCC时钟控制,GPIO是属于APB2的。
    在这里插入图片描述
      我们已经知道,GPIO端口B的地址从0x4001 0C00开始。接下来只寻找时钟使能寄存器的地址:
      复位和时钟控制RCC的地址从0x4002 1000开始;
      可以在6.3.7小节找到APB2外设时钟使能寄存器(RCC_APB2ENR),偏移地址是0x18,所以APB2的地址就是0x4002 1018。
      看手册RCC_APB2ENR,位3是IOPBEN,名字是IO端口B时钟使能,就是我们想要的。把RCC_APB2ENR的位3赋值为1,就是开启GPIOB时钟。
    在这里插入图片描述

    • 配置为通用输出

    既然叫做IO,那么肯定就是可以输入,可以输出,到底是输入还是输出呢?
      控制LED需要输出高电平或是低电平,所以需要配置为输出。
      由于STM32的每个IO都需要4个位来配置,所以一个32位的寄存器最大只能配置8个IO(32位的单片机的寄存器就是32位的)。STM32中,用端口配置低寄存器(GPIOx_CRL)来配置引脚Px0-Px7, 用端口配置高寄存器(GPIOx_CRH)来配置引脚Px8-Px15。
      配置引脚PB8,使用的寄存器是GPIOB_CRH。下面我们来寻找这个寄存器的地址。
    在这里插入图片描述
      关于此寄存器的说明位于8.2.2小节。先看标题GPIOx,表示不管是PA,PB还是PE,都能用。
      偏移地址是0x04,意思是在基地址的基础上再加0x04,所以,对于GPIOB来说就是0x4001 0c04。如果配置PB0-PB7,那么需要的寄存器是低位的寄存器GPIOB_CRL,它的地址是0x4001 0c00。我们需要配置的寄存器是GPIOB_CRH。
      找到需要操作的寄存器后,把它配置为通用输出。
      复位值是0x4444 4444,并不是0x0000 0000。所谓的复位值,就是指如果没有操作这个寄存器时,寄存器存放的默认值。复位值按位拆分0x4 = 0b0100,0x表示16进制,0b表示二进制,也就是默认CNF 01,MODE 00,是浮空输入。
      我们需要的是输出高低电平,所以要设置为输出。输出模式又有好几种输出:
    在这里插入图片描述
      推挽输出:可以输出高,低电平,连接数字器件;推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止。
      开漏输出:输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行,适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内)。
      开漏是需要外接上拉电阻才可以输出高电平的,这里并不适合。所以需要设置为推挽输出。
      功能是否是复用呢?复用的意思是有别的功能在这个脚上,比如USB,CAN,串口等,所以这些个脚就可能有多个功能。暂时讲多了反而会迷惑,等用到了这些功能再讲解,我直接告诉大家,PB8没有复用。
      所以配置为输出模式,通用推挽输出。速度暂时不关注,随便填写一个50MHz吧,其它速度当然也可以。所以设置GPIOB_CRH的MODE8与CNF8为0b0011,即0x3。此寄存器中其它的位暂时不做修改,使用默认值,也就是GPIOB_CRH设置为:0x4444 4443。

    • 点亮LED需要输出低电平

    在单片机的编程中,要想做某件事,必须寻找相应的寄存器。在8.2.4小节,可以找到端口输出数据寄存器,就是我们需要的。我们需要输出0。但是中文手册有一个小小的BUG,0x0C写成了0Ch,可以参考英文原版。得知地址的偏移是0x0C,所以这个数据寄存器的地址就是0x4001 0C0C,把第8位写为0就行。默认就是0,但是也得学一下怎么写,万一是高电平点亮呢。
    在这里插入图片描述
    在这里插入图片描述

    • 使用直接赋值的方式写寄存器的地址

    在搞清楚我们要用的几个寄存器的地址,以及寄存器中需要装填的数值以后,现在用一个简单粗暴的方法来操作这些寄存器——直接操作。(注意,这段代码不是实用的代码,只是为了写出一个最简单的LED,有些部分是不可取的。)将main函数修改为:

        int main(void)
        {
            unsigned int *pRCC_APB2ENR = (unsigned int *)0x40021018;
            unsigned int *pGPIOB_CRH = (unsigned int *)0x40010c04;
            unsigned int *pGPIOB_ODR = (unsigned int *)0x40010c0c;
            *pRCC_APB2ENR = 0x00000008;
            *pGPIOB_CRH = 0x44444443;
            *pGPIOB_ODR = 0x00000000;
             return 0;             
        }
    

    C语言总是从main函数开始执行。
      定义几个指针,指向刚刚看到的地址。对于编译器来说,它并不知道0x40021018代表的是数据还是指针,所以用(unsigned int *)作强制的类型转换,告诉编译器0x40021018是个指针。指针可以理解为地址。操作指针,把这些地址存放的值修改。
      最后的return,代表main函数结束。

    总结

    我们写了一段另类的代码,直接操作寄存器的地址,就是想得到这么一个结论:不论代码怎么写,不论是寄存器,库函数,还是其他的操作系统,要在STM32F103这个单片机点亮LED灯,肯定需要把时钟和GPIO这几个相关的特殊地址,进行赋值或修改数值的操作。有点像打篮球,不论进攻时有怎样花哨的运球与传切配合,最后都要完成把球放入篮筐的动作,才能得分。
    在这里插入图片描述

    展开全文
  • 介绍西门子200的寄存器数据类型及表示方式,罗克韦尔以Micro为例介绍寄存器类型。 个人对罗克韦尔比较有好感,自定义成都很高。比较人性化。
  • 寄存器的七种寻址方式

    千次阅读 2020-04-08 23:00:24
    立即寻址方式: 操作数作为指令的一部分而直接写在指令中...把在指令中指出所使用寄存器(即:寄存器的助忆符)的寻址方式称为寄存器寻址方式。由于指令所需的操作数已存储在寄存器中,或操作的结果存入寄存器,这样,...

    立即寻址方式
    操作数作为指令的一部分而直接写在指令中,这种操作数称为立即数,这种寻址方式也就称为立即数寻址方式。立即数可以是8位、16位或32位,该数值紧跟在操作码之后。

    寄存器寻址方式
    指令所要的操作数已存储在某寄存器中,或把目标操作数存入寄存器。把在指令中指出所使用寄存器(即:寄存器的助忆符)的寻址方式称为寄存器寻址方式。由于指令所需的操作数已存储在寄存器中,或操作的结果存入寄存器,这样,在指令执行过程中,会减少读/写存储器单元的次数,所以,使用寄存器寻址方式的指令具有较快的执行速度。

    直接寻址方式
    指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址,这种寻址方式为直接寻址方式。如:MOV BX, [1234H]

    寄存器间接寻址方式
    操作数在存储器中,操作数的有效地址用SI、DI、BX和BP等四个寄存器之一来指定,称这种寻址方式为寄存器间接寻址方式。如:MOV BX,[DI]

    寄存器相对寻址方式
    操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)或变址寄存器(SI、DI)的内容和指令中的8位/16位偏移量之和。若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS;若有效地址用BP来指定,则其缺省的段寄存器为SS。如:MOV BX, [SI+100H]

    基址加变址寻址方式
    操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)和一个变址寄存器(SI、DI)的内容之和。如:MOV BX, [BX+SI]。

    相对基址加变址寻址方式
    操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)的值、一个变址寄存器(SI、DI)的值和指令中的8位/16位偏移量之和。如:MOV AX, [BX+SI+200H]。

    展开全文
  • Modbus寄存器地址规则

    万次阅读 2019-08-09 00:32:31
    Modbus协议定义的寄存器地址是5位十进制地址,即: 线圈(DO)地址:00000~09999 触点(DI)地址:10000~19999 输入寄存器(AI)地址:30000~39999 输出寄存器(AO)地址:40000~49999 由于上述各类地址是...
  • 【汇编语言】寄存器地址

    千次阅读 多人点赞 2021-03-04 18:40:57
    寄存器地址 主要内容: 一、寄存器 (1)透明寄存器 (2)可编程寄存器 1.通用寄存器 2.专用寄存器 二、地址 (1)存储模型 (2)存储空间分段管理 (3)物理地址与逻辑地址 (4)操作数寻址过程
  • 单片机外设(ram、寄存器)地址详解

    千次阅读 2020-01-05 13:01:13
    在学习汇编语言时,我们会接触到一些寄存器,比如R0、R1、还有栈指针寄存器SP、下一条指令寄存器PC 等等。这些寄存器是存在于内核(如CPU)之内的,这些寄存器是我们无法通过c语言访问到的,而只能用汇编语言操作。...
  • 1.STM32中的存储器映射地址(查STM32F429数据手册) /*片上外设基地址*/ #define PERIPH_BASE ((unsigned int)0x40000000) /*AHB1总线基地址*/ #define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000) /*GPIOB基...
  • 表示偏移地址寄存器

    千次阅读 2018-09-30 10:52:09
    8086寄存器中,只有bx,bp,si,di这四个寄存器可以用在[……]中表示偏移地址
  • Verilog中寄存器地址中有变量的解决方法 因为之前每次在寄存器地址中使用变量想动态的控制寄存器时,都会报错。 导致每次只能使用一个副本寄存器去暂存然后移位后控制固定的寄存器位置,但是这样写起来较为麻烦,...
  • 寄存器寻址入门

    2021-07-29 21:22:34
    图中的IR表示指令寄存器,它的内容是从主存中取出的指令.操作数S与寄存器Ri的关系为: 这种寻址方式具有两个明显的优点: (1)从寄存器中存取数据比从主存中存取快得多. (2)由于寄存器的数量较少,其地址码字...
  • Modbus 中3区和4区的地址表示含义如下: 30001-39999是输入寄存器,也就是我们常说的输入寄存器,只读。 40001-49999是保持寄存器,可以读写。 从上面的定义可以看出来,3区,4区的寄存器开始地址不是0,而是30001和...
  • Linux详解寄存器

    千次阅读 2022-04-19 22:03:39
    文章目录 Linux详解寄存器 前言 i386的寄存器 80386中寄存器变化 通用寄存器寄存器 状态和控制寄存器 控制寄存器 系统地址寄存器 调试寄存器和测试寄存器 调试寄存器 测试寄存器 Linux详解寄存器 前言 操作系统...
  •  存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给物理存储器分配逻辑地址的过程就称为存储器映射,通过这些逻辑地址就可以访问到相应的存储器的物理存储单元。如果给存储器再分配一个地址就叫存储器...
  • 寄存器名称 寄存器地址 相对GPIOB基址的偏移 GPIOB_CRL 0x4001 0C00 0x00 GPIOB_CRH 0x4001 0C04 0x04 GPIOB_IDR 0x4001 0C08 0x08 GPIOB_ODR 0x4001 0C0C 0x0C GPIOB_BSRR 0x4001 0C10 0x10 GPIOB_BRR 0x4001 0C14...
  • riscv寄存器各个地址含义

    千次阅读 2019-05-25 18:33:24
    初学须知,寄存器地址的使用 注意点: x0是常量0, 可以拿来做数字使用 但千万不能将其本身进行更改 很有可能会导致崩溃 其他位置对号入座使用即可! ...
  • 地址不是单纯的16进制数值,它表达的是内存空间。
  • 本文给自学单片机的朋友们总结了80C51单片机特殊功能寄存器SFR部分的基础知识,供读者参考学习
  • S7-200PLC寄存器寻址

    2022-06-13 00:20:23
    西门子S7-200访问所有存储区的方式,寄存器的用法汇总
  • 寄存器

    2020-02-23 21:24:19
    四种寄存器容量都为两个字节,是十六位寄存器表示范围0-65535,216 上述四种寄存器都可以分割成对应的2个8位寄存器, AX = AH + AL,高八位成为AH寄存器,H是high的意思,低八位是AL寄存器,L是low的意思 BX = BH...
  • 寄存器地址

    2019-10-08 22:30:06
    读芯片的寄存器定义文档的时候,每个寄存器都定义了各自的地址。这个地址看起来和内存的地址是一样一样的。那中间有什么关联呢?其实没啥大的关联,只不过寄存器地址和内存的地址都是在CPU的寻址空间中。简单的说...
  • 特殊功能寄存器地址映象表(一)>  <特殊功能寄存器地址映象表(二)>  <特殊功能寄存器地址映象表(三)>  几个常用的SFR  1、ACC:累加器,常常用A表示...
  • 本文主要关于ARM处理器的寄存器介绍
  • 计算机的容量对于存储单元个数乘以存储字长。 存储单元个数。就相当于存储体的行数。 存储字长。就相当于存储体的列数。 计算机的容量其实就是求它的总的位数。...可以表示地址单元的个数是二的n次方。这里就是我...
  • 寄存器就是内存中的一段特殊的地址
  • 是位地址还是寄存器地址? 我来答 分享 举报 1个回答 #公告#关于优质视频活动排行榜提前发放的处理公告 1丝冷风 2012-03-27 关注 功能码01(读线圈状态)对应的地址是线圈的地址(即位地址),若要求其所在...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 193,570
精华内容 77,428
关键字:

寄存器的地址怎么表示