精华内容
下载资源
问答
  • modbus 协议中,操作数01(读线圈状态)对应的地址是怎么定义的?是位地址还是寄存器地址? 我答 分享 举报 1个回答 #公告#关于优质视频活动排行榜提前发放的处理公告 1丝冷风 2012-03-27 关注 功能码01...

    modbus 协议中,操作数01(读线圈状态)对应的地址是怎么定义的?是位地址还是寄存器地址?

     我来答 

    分享

     举报

    1个回答

    #公告# 关于优质视频活动排行榜提前发放的处理公告

    1丝冷风 
    2012-03-27

    关注

    功能码01(读线圈状态)对应的地址是线圈的地址(即位地址),若要求其所在的寄存器地址,计算如下:
    线圈的位地址/16=整数商(即寄存器地址)+余数(即位偏移地址)

    追问

    除以几是不是应该看是几位的cpu啊?如果是16位的就除以16,如果是32位的就应该除以32呢?

    追答

    modbus 协议的数据寄存器长度是16位,与CPU无关。
    展开全文
  • 通过3个问题理解寄存器及其操作。 什么是寄存器(就是个数字)? 简单可以理解为能够通过软件改写数值、控制硬件一个32bit...寄存器是实现软硬件接口,几乎所有硬件功能控制都通过操作寄存器来实现,..

    经常听说会操作寄存器很重要,也确实如此,比如某些功能库函数不能实现,或者库函数效率很低时,就只能直接操作寄存器实现。

    通过3个问题就能理解寄存器及其操作。

    什么是寄存器(就是个数字)?

    简单可以理解为能够通过软件改写数值、控制硬件的一个32bit的数字。多个数字一起控制一个外设。

    这个数值在哪?

    这个数字要被存起来,就一定有一个存储的地址,地址可以通过单片机的数据手册查到。

    如何改写这个数值?

     有了地址,可以设置一个指针指向此地址,然后写入数据。有库可以直接写寄存器名字进行操作。

     

    详细解读:

    1、什么是寄存器(就是个数字)?

    寄存器是实现软硬件的接口,几乎所有的硬件功能控制都是通过操作寄存器来实现的,库函数也只是将寄存器操作封装起来方便调用,一些复杂操作库函数可能无法实现,就只能操作寄存器。

    一个寄存器32bit,按规则修改这个32bit数值就能控制硬件,通常一个外设需要多个寄存器控制。

    2、这个数值在哪?

    因为ARM单片机是统一编址的,寄存器像内存一样,内存中每个数据都有一个存储的地址,寄存器也是,只是寄存器的地址是固定的,你只能修改指定地址的数字才能控制硬件。

    如何查找寄存器:以控制GPIO的寄存器为例。

    (1)首先要有《stm32中文参考手册》这个网上很多,随便一搜就有。

    (2)在目录中可以看到各种外设,比如下面这些有RCC、GPIO、DMA、ADC等

    (3)展开目录,基本每一个外设的章节都有一个寄存器描述

    (4)查看寄存器详细描述。

    这里有三个关键点,了解这三点就知道改寄存器的规则了。

    ①偏移地址

    这个寄存器叫CRL,的具体地址并没有直接给出,而是以具体地址=基地址+偏移地址的形式计算的。基地址可以在2.3存储器映像这一章找到

    为什么要这样?因为GPIO有多组,GPIOA、GPIOB。。。。每一组都有这个寄存器,且功能相同,只是位置不一样。

    这样就比较方便在程序上的定义与使用,定义一个结构体,结构体数据形式和寄存器一样,只需要指定结构体基地址,就比较容易进行寄存器读写,而不用指定每个寄存器地址。

    ----------|----------|----------|----------|----------|           
       GPIOA  |   GPIOB  |   GPIOx  |  GPIOF   |  ....    | |
    ----------|----------|----------|----------|----------| |
       CRL    |   CRL    |   CRL    |   CRL    |   CRL    | |
    ----------|----------|----------|----------|----------| |
       CRH    |   CRH    |   CRH    |   CRH    |   CRH    | |
    ----------|----------|----------|----------|----------| |
       IDR    |   IDR    |   IDR    |   IDR    |   IDR    | ↓
    ----------|----------|----------|----------|----------| 地址4字节递增
       ...    |          |          |          |          | 
    
    typedef struct
    {
      vu32 CRL;
      vu32 CRH;
      vu32 IDR;
      ...
    } GPIO_TypeDef;
    
    

    ②这两条方框是干嘛的

    仔细看方框上有数字1-15和16-31这就是之前说的,每个寄存器是一个32bit数字。

    1bit或几个bit组合在一起用于设置功能,比如③号框圈起来的30和31bit,这2bit一起决定一个功能。

    ③每bit数字具体功能

    那么③里的2bit是什么功能,就要看下面的具体描述,这些描述功能的文字应该很熟悉了吧。

    3、怎么修改这些寄存器

    现在我们知道了这些寄存器的功能和地址,那么下一步就是修改它的数值了。做开发时我们主要还是使用固件库(只是掺杂一点直接修改寄存器操作),而库文件中定义了这些寄存器的地址,我们只需要通过他的名字访问他就行。

    就比如上图中的GPIOx_CRL,这是一个通用名,比如要控制GPIOA的这个寄存器那么具体操作如下

    GPIOA->CRL = 0x44444444;

     其实操作寄存器并不难,难点是了解每个外设各个寄存器的作用。要完全了解一个外设的寄存器,可以通过寄存器例程手册中的寄存器描述,结合实践加深对外设控制的理解。

    扩展:

    1、stm32固件库库是如何实通过寄存器名字操作寄存器的?

    要理解这个问题需要有良好的C语言基础,理解起来还是比较简单的。

    每一组控制GPIO的几个寄存器地址是连续的,按4字节递增(每个寄存器占4字节)。

    那么我们只需要定义一个结构体,成员变量都定义为32位无符号整形变量,成员的数量就是寄存器的数量。以GPIO为例

    typedef struct
    {
      __IO uint32_t CRL;
      __IO uint32_t CRH;
      __IO uint32_t IDR;
      __IO uint32_t ODR;
      __IO uint32_t BSRR;
      __IO uint32_t BRR;
      __IO uint32_t LCKR;
    } GPIO_TypeDef;
    
    GPIO_TypeDef *GPIOA;
    GPIOA = GPIOA的基地址;
    
    GPIOA->ODR = 0x11114444;   
    通过GPIOA这个指针访问对应的寄存器地址。
    编译器会自动计算ODR相对GPIOA基地址的具体地址。

    2、一些给寄存器赋值的小技巧。

    通常我们只想修改32bit中的某一位,清零或者置1

    GPIOA->CRL |= 1<<6; 将bit6设为1
    
    GPIOA->CRL |= (1<<6+1<<7);GPIOA->CRL |= (0x3<<6); 将bit6和7设为1
    
    GPIOA->CRL &= ~(1<<6); 将bit6清零
    
    GPIOA->CRL &= ~(1<<6+1<<7);GPIOA->CRL &= ~(0x3<<6); 将bit6和7清零

     

    展开全文
  • 介绍两部分内容:什么存储器映射什么是寄存器寄存器映射 为了让大家对存储器与寄存器有一个更清楚认识,并且为之后使用 C 语言访问 STM32 寄存器内容打下基础。等明白了如何使用 C 语言封装底层寄存器,也就...

    介绍两部分内容:

    • 什么是存储器映射
    • 什么是寄存器及寄存器映射

    为了让大家对存储器与寄存器有一个更清楚的认识,并且为之后使用 C 语言来访问 STM32 寄存器内容打下基础。等明白了如何使用 C 语言封装底层寄存器,也就为后面学习库函数的开发做好了铺垫。什么是存储器映射
    程序存储器、数据存储器、寄存器和I/O端口排列在同一顺序的4GB地址空间内。这就是我们曾提到过的被控总线的连接部分,而编程时就是操作这一块地方。存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程称为存储器映射,如果再分配一个地址就叫重映射。 STM32F103ZET6 数据手册中存储器映射图如下所示。

    ad4e0a39de1dea604ab10aa6335a5d80.png


    从上图中可以看到 ARM 把这 4GB 的存储器空间平均分成了 8 块区域,每块区域的大小是 512MB,这个容量是非常大的,因此芯片厂商就在每块容量范围内设计各自特色的外设。但是每块区域容量占用越大,芯片成本就越高,所以说我们使用的 STM32 芯片都是只用了其中一部分。ARM 在对这 4GB 容
    量分块的时候是按照其功能划分,每块都有它特殊的用途。
    在这 8 个 Block 里面,要特别注意Block0、Block1 和 Block2 这 3 个块。因为其中包含了 STM32 芯片的内部 Flash、RAM 和片上外设。下面还是根据存储器映射图内信息来简单的介绍下这3个 Block 里面的具体区域功能划分。

    • Block0 内部区域功能划分

    Block0 主要用于设计片内的 FLASH, STM32F103 系列芯片内部 FLASH 最大是 512KB,我们使用的 STM32F103ZET6 的 FLASH 是 512KB。要在芯片内部集成更大的 FLASH 或者 SRAM 都意味着芯片成本的增加,所以往往片内集成的FLASH 都不会太大。512KB 的 FLASH 已经足够我们一般的应用开发。从图中可以看到 Block0 内部又划分了好多个功能块,我们按地址从低到高顺序依次介绍。
    0x0000 0000-0x0007 FFFF:取决于 BOOT 引脚,为 FLASH、系统存储器、SRAM 的别名。
    0x0008 0000-0x07FF FFFF:预留。
    0x0800 0000-0x0807 FFFF:片内 FLASH,我们编写的程序就放在这一区域

    0x0808 0000-0x1FFF EFFF:预留。
    0x1FFF F000-0x1FFF F7FF:系统存储器,里面存放的是 ST 出厂时烧写好的isp 自举程序,用户无法改动。使用串口下载的时候需要用到这部分程序。
    0x1FFF F800-0x1FFF F80F:选 项 字 节 ,用 于 配 置 读 写 保 护 、BOR 级别、软件/硬件看门狗以及器件处于待机或停止模式下的复位。当芯片不小心被锁住之后,我们可以从 RAM 里面启动来修改这部分相应的寄存器位。
    0x1FFF F810-0x1FFF FFFF:预留。

    • Block1 内部区域功能划分

    Block1用于设计片内的SRAM, 例如STM32F103ZET6 的 SRAM是64KB。从存储器映射图中可以看到 Block1 内部又划分了几个功能块,我们按地址从低到高顺序依次介绍。
    0x2000 0000-0x2000 FFFF:SRAM,容量为 64KB。
    0x2001 0000-0x3FFF FFFF:预留。

    • Block2 内部区域功能划分

    Block2 用于设计片内外设, 根据外设总线速度的不同, Block2 被划分为 AHB和 APB 两部分, APB 又被分成 APB1 和 APB2 总线。 这些都可以在上面存储器映射图中可看到。下面我们按地址从低到高顺序依次介绍。
    0x4000 0000-0x4000 77FF:APB1 总线外设。
    0x4000 7800-0x4000 FFFF:预留。
    0x4001 0000-0x4001 3FFF:APB2 总线外设。
    0x4001 4000-0x4001 7FFF:预留。
    0x4001 8000-0x4002 33FF:AHB 总线外设。
    0x4002 4400-0x5FFF FFFF:预留。
    在Block3、Block4、Block5中包含了FSMC扩展区域,可用于扩展如 SRAM,NORFLASH 和 NANDFLASH 等的外部存储器。什么是寄存器及寄存器映射
    简单来说,通过给特定功能的内存单元起一个别名,此别名即所谓的寄存器。寄存器映射就是给(已分配好地址且有特定功能的)内存单元起别名的过程。

    d939b70dd05a2cbf3f85ba5fa25b8bdb.png
    嵌入式开发直播课 - 深度剖析STM32第四讲:DMA专题讲解 - 创客学院直播室www.makeru.com.cn
    4a1745fa2b7bcefbaef82d231f2dcdc1.png
    展开全文
  • 在熟悉SD/MMC相关寄存器之前,我们先看看SD卡的内部架构是怎么样的,如下图所示: 2.SD/MMC相关寄存器的介绍 从上图中总结出:SD卡内部有7个寄存器. 一、OCR,CID,CSD和SCR寄存器保存卡的配置信息; 二、RCA...

    1.SD卡内部架构

    在熟悉SD/MMC相关寄存器之前,我们先来看看SD卡的内部架构是怎么样的,如下图所示:

    2.SD/MMC相关寄存器的介绍

    从上图中总结出:SD卡内部有7个寄存器.

    一、OCR,CID,CSD和SCR寄存器保存卡的配置信息;

    二、RCA寄存器保存着通信过程中卡当前暂时分配的地址(只适合SD模式);

    三、CSR寄存器卡状态(Card Status)和SSR寄存器SD状态(SD Status)寄存器保存着卡的状态(例如,是否写成功,通信的CRC校验是否正确等),这两个寄存器的内容与通信模式(SD模式或SPI模式)相关.

    四、MMC卡没有SCR和SSR寄存器.

    下面分别对7个寄存器中比较重要的寄存器详细解释一下,分别是CID、CSD、SCR、OCR、RCA这5个寄存器。

    2.1. Card Identification Register(CID)

    这个 CID 寄存器有 16 字节长,如下表所示,它包含了本卡的特别识别码(ID 号)。 这些信息是在卡的生产期间被编程(烧录),主控制器不 能修改它们的内容。 注意:SD卡的 CID 寄存器和 MMC 卡的 CID 寄存器在记录结构上是不同的。

    2.2.Card Specific Data Register(CSD)

     

    这个描述数据寄存器(CSD)有 128 字节长,如下表所示,此卡的包含了访问该卡数据时的必要配置信息。“cell type”栏内定义了CSD的区域是只读(R)、一次编程(R/W)或可擦除的(R/W/E)[“R/W”是指可以多次擦写,“R/W(1)”是指只能一次写入,不可擦除]。该张表中所显示的值都对应真实的CSD结构中的各自区域和编码。CSD区域的样式是依照栏标记(和一个复选标记√)的样式。注意SD卡内的 CSD寄存器和MultiMedia卡的CSD寄存器有着不同的结构。

    在SD3.0协议中,CSD分为版本1.0和版本2.0,版本1.0对应标准容量的SD卡,版本2.0对应高容量和超高容量的SD卡。

     

    CSD Version 2.0的如下:

    2.3.SD card Configuration Register (SCR)

    除了 CSD 寄存器外,还有一个配置寄存器的名字是:SD 卡配置寄存器(SCR)。SCR 提供了SD 卡的一些特殊特性在这张卡内。它的大小是64 位。这个寄存器内容由制造商在生产厂内设置,MMC卡没有SCR。

    SCR_STRUCTURE 关于SD卡内的物理级说明中SCR结构的版本号。

    SD_SPEC描述这张SD卡在物理级上所支持的说明版本。

    DATA_STAT_AFTER_ERASE 定义了数据在擦除后的状态。是“0”或“1”中的任何一个(这要依赖卡的供应商)。

    SD_SECURITY 描述了该卡所支持的安全算法。0:无 1:安全协议1.0 安全说明版本 0.96 2:安全协议2.0 安全说明版本 1.0 - 1.01。其他保留

    SD_BUS_WIDTHS描述该卡所支持的所有数据总线宽度。从SD 卡支持最少1 位或4 位宽度这两种总线模式开始,任何SD 卡都将最少要设置0 和2 这两个位(即SD_BUS_WIDTH = 0101 ),1.4位保留。

    2.4.Operating Conditions Register (OCR)

    这个 32 位的工作条件寄存器储存了卡的 VDD 电压轮廓图。任何标准的 SD 卡主控制器可以使用 2V 至 3.6V 的工作电压来让 SD 卡能执行这个电压识别操作(CMD1)。而访问存储器的阵列操作无论如何都需要 2.7V 至 3.6V 的工作电压。OCR 寄存器显示了在访问卡的数据时所需要的电压范围。OCR 寄存器的结构描述:

    2.5.RCA寄存器
    该16位卡地址寄存器保存了在卡识别过程中卡发布的器件地址。该地址用于在卡识别后主机利用该地址与卡进行通信。该寄存器只有在SD总线模式下才有效。

    转载于:https://www.cnblogs.com/King-Gentleman/p/8947963.html

    展开全文
  • 图中的这些地址看着官方给出的文档算出来的,这样做的缺点很明显,就是每一次都要算,算每一个寄存器的位置,实际上我们可以寄存器映射做到同样的效果。首先我们先定义所有外设的基地址的宏:那么这个地址从哪...
  • 时钟设置关键性寄存器

    千次阅读 2016-03-30 15:27:53
    这一节内容,是来熟悉和时钟系统相关的寄存器。 APLL_LOCK,MPLL_LOCK ,EPLL_LOCK, VPLL_LOCK, 这四个PLL可以简单记为xPLL_LOCK,都用来控制对应锁定周期, 下图数据手册相关介绍,没涉及具体怎么去...
  • 首先注意:BX一个通用寄存器,里面存放不一定就是一个基地址,也可以放偏移量或者其他临时数据。 通用寄存器:A/B/C/D X 4个,SP,BP,SI,DI 4个 专用寄存器:SP,IP和FLAGS 3个16位寄存器。 疑问:SP到底通用...
  • 地址线扩展成了32位,这和数据线宽度一致。因此,在32位机里其实并不需要采用“物理地址=段:偏移”这种地址表达方式。原来在16位机里规定 每一个段不大于64kb在32位机里也不是必要。所以,对于32位机讲...
  • 所有操作,最终目的都操作寄存器stm32编程实质上修改寄存器的32位的具体的值单片机sfr P0=0x80; //关键字sfr 声明地址和名称的映射 P0=0x00; //将0x00赋值给P0口的8位(51单片机一组IO为8位)STM32GPIOA->ODR=0x...
  • 在熟悉SD/MMC相关寄存器之前,我们先看看SD卡的内部架构是怎么样的,如下图所示: 2.SD/MMC相关寄存器的介绍 从上图中总结出:SD卡内部有7个寄存器. 一、OCR,CID,CSD和SCR寄存器保存卡的配置信息; 二...
  • 第二章 寄存器 ...因为要解决内部总线16位,但地址总线20位的差异问题),这两个寄存器的值共同决定一个具体的内存单元,并将从这个内存单元开始的一段连续地址当作“代码段”,也就是说这一块区域被人为...
  • 大家都知道我们可以使用C语言写一段程序控制硬件工作,但你知道其工作原理吗?1c语言在实际运行中,都以汇编指令方式运行,由编译器...硬件会把硬件上各种寄存器(外行可以理解为访问硬件接口或者操作硬件...
  • 在使用Modbus协议编程的时候,会遇到诸如40001、10001之类的地址,比如前面的文章《实例:S7-200 SMART通过Modbus-RTU读取温湿度传感器数据》,读取温湿度传感器的寄存器地址用的40001,这究竟代表什么意思呢?...
  • 程序是怎么跑起来

    千次阅读 2018-05-06 10:39:00
    内存保存命令和数据场所,通过地址来标记和指定。地址由整数值表示。CPU很内存由许多晶体管组成电子部件,通常称为IC(Integrated Circuit,集成电路)。CPU内部由寄存器、控制器、运算器、和时钟四个部分...
  • 再查看函数f2:参数a、b用栈传递,它们地址都存放在ss寄存器中:局部变量c值在这里用si寄存器存储,因为c正好int型,那么子函数里定义局部变量寄存器存储吗?我们在这里加一条赋值语句...
  • 借鉴某Q群大佬的解答,若有不当...首先,计算机不知道这件事的,所有数据本质上都二进制 根据你定义的类型解释的,计算机把指令寄存器指向的内容当作指令,把数据寄存器的东西当成数据 程序的加载启动由操作...
  • 一串二进制代码实际上按照每8位(1个字节)为单位放在存储器(内存)中的存储单元中。 一个存储单元由一堆电子... CPU有专门的寄存器存放程序运行的地址,然后CPU根据这个地址去内存中取指(一些老的电脑一...
  • 概念介绍 逻辑地址 计算机自己用于管理程序的地址,其包含段首地址,和偏移地址. 对于8088说,其需要管理的1M个空间, 那么实际上作为16位的cpu,2^16即,一个...段寄存器的地址*16 就是真是情况下的段首的物理地址. 如果
  • 我感觉十章好像前面汇总,在前面我们也看到函数调用机制,在这函数名称函数内存地址,这个使我惊讶。还有讲到循环机制和条件分支,像这我学C#同学,或许这俩个不会陌生,毕竟开头俩章讲的是就是它俩...
  • 对于计算机了解少之又少,学了计算机以后对CPU了解也只是一点点,就知道CPU(中央处理器)相当于计算机大脑,其他更加深刻理论,只是懵懵懂懂,读了这本书第一章才知道CPU内部寄存器、控制器、运算...
  • 若想无可替代,必须与众不同 - 每日一句上一节在buddy system中我们了解了内核中对于页框的高效利用方式,那么现在我们就来研究我们给内核的地址空间内核究竟是怎么去使用了? 这里我们在简单描述一下地址空间的...
  • 直接相加还是不能匹配20位的地址线的访问能力,因此,INTEL公司变通了一下,人为地将这个组合寻址设计成:在它们组合时,让段寄存器左移四位(假设DS1234H,左移4位就变成了12340H,至于它内部怎么实现我们不用管...
  • 其中pc为程序计数器,指向下一条需要执行的指令的地址,DPTR为数据指针寄存器,这两个变量的长度都为16位,这51单片机内部结构决定的,无法改变。所以这两个指针的寻址能力都为64K。这样看来,两类存储器的扩展...
  • 对8086地址的理解.

    2014-03-29 22:28:00
    尤其是怎么结算出来. 晚上就找了个视频看.果然容易懂些. 首先就是Intel8086有一些硬件上设计. (果断记不清楚地址总线是20位和什么是16位了.先google下.) 维基大神是这样说: 所有内部寄存器、...
  • 8086cpu在任意时刻,cpu将cs:ip内容全部当做指令执行,在内存中指令和数据没有任何区别. cpu只有只有工作时候才将有信息当做指令有信息当做数据. 1.1:cpu根据什么将内存中信息当做指令执行? ;cpu将...
  • 如果你只知道CPU是中央处理器话,那可能对你并没有什么用,那么作为程序员我们,必须要搞懂就是CPU这家伙是如何运行,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序运行机制。...
  • 接上文,另一个获取内存容量方法bios 0x15中断子功能0...低于15MB内存以1KB为单位大小记录,单位数量在寄存器AX和CX中记录,其中AX和CX一样,所以在15MB空间以下实际内存容量=AX*1024。AX、C...
  • 很明显在实际使用过程中我们不会这样去用,对于通讯说主站发送数据通常只有两个功能,一读取从站寄存器地址的状态也就是从从站读取数据,二向从站写入数据。那么主站要怎么发送数据从站才能知道,主站...

空空如也

空空如也

1 2 3 4 5
收藏数 93
精华内容 37
关键字:

寄存器的地址是怎么来的