寄存器 订阅
寄存器的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。一个触发器可以存储1位二进制代码,故存放n位二进制代码的寄存器,需用n个触发器来构成。 [1]  按照功能的不同,可将寄存器分为基本寄存器和移位寄存器两大类。基本寄存器只能并行送入数据,也只能并行输出。移位寄存器中的数据可以在移位脉冲作用下依次逐位右移或左移,数据既可以并行输入、并行输出,也可以串行输入、串行输出,还可以并行输入、串行输出,或串行输入、并行输出,十分灵活,用途也很广。 [1] 展开全文
寄存器的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。一个触发器可以存储1位二进制代码,故存放n位二进制代码的寄存器,需用n个触发器来构成。 [1]  按照功能的不同,可将寄存器分为基本寄存器和移位寄存器两大类。基本寄存器只能并行送入数据,也只能并行输出。移位寄存器中的数据可以在移位脉冲作用下依次逐位右移或左移,数据既可以并行输入、并行输出,也可以串行输入、串行输出,还可以并行输入、串行输出,或串行输入、并行输出,十分灵活,用途也很广。 [1]
信息
定    义
有限存贮容量的高速存贮部件
相    关
中央处理器
分    类
指令寄存器(IR) 程序计数器(PC)
中文名
寄存器
属    性
信息科学
外文名
Register
寄存器基本含义
寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。其实寄存器就是一种常用的时序逻辑电路,但这种时序逻辑电路只包含存储电路。寄存器的存储电路是由锁存器或触发器构成的,因为一个锁存器或触发器能存储1位二进制数,所以由N个锁存器或触发器可以构成N位寄存器。寄存器是中央处理器内的组成部分。寄存器是有限存储容量的高速存储部件,它们可用来暂存指令、数据和位址。 [2]  在计算机领域,寄存器是CPU内部的元件,包括通用寄存器、专用寄存器和控制寄存器。寄存器拥有非常高的读写速度,所以在寄存器之间的数据传送非常快。 [2]  Cortex-M4总共有18个寄存器,相比传统ARM(如ARM7/ARM9/Cortex-A系列)的38个寄存器已减少很多,减少了内核核心面积(Die-size)。 [2]  对于编译器非常友好易用,例如:包含灵活的寄存器配置,任意寄存器之间可实现单周期乘法,任意寄存器可以作为数据、结构或数组的指针。此外,Cortex-M4还包含4个特殊功能寄存器PRIMASK、FAUI。TMASK、BASEPRI和CONTROL。 [2] 
收起全文
精华内容
下载资源
问答
  • 寄存器

    千次阅读 2018-08-08 18:37:35
    1.寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。在中央处理器的算术及逻辑...

           1.寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。在中央处理器的算术及逻辑部件中,存器有累加器(ACC)

           2.包括通用寄存器、专用寄存器和控制寄存器

          3.分类

    数据寄存器- 用来储存整数数字(参考以下的浮点寄存器)。在某些简单/旧的CPU,特别的数据寄存器是累加器,作为数学计算之用。

    地址寄存器- 持有存储器地址,用来访问存储器。在某些简单/旧的CPU里,特别的地址寄存器是索引寄存器(可能出现一个或多个)。

    通用目的寄存器(GPRs) - 可以保存数据或地址两者,也就是说它们是结合数据/地址 寄存器的功用。

    浮点寄存器(FPRs) - 用来储存浮点数字。

    常数寄存器- 用来持有只读的数值(例如0、1、圆周率等等)。

    向量寄存器- 用来储存由向量处理器运行SIMD(Single Instruction, Multiple Data)指令所得到的数据。

    特殊目的寄存器- 储存CPU内部的数据,像是程序计数器(或称为指令指针),堆栈寄存器,以及状态寄存器(或称微处理器状态字组)。

    指令寄存器 register)- 储存现在正在被运行的指令。

    索引寄存器(index register)- 是在程序运行时用来更改运算对象地址之用。

    PORT1的控制寄存器PORT1的控制寄存器在某些架构下,模式指示寄存器(也称为“机器指示寄存器”)储存和设置跟处理器自己有关的数据。由于他们的意图目的是附加到特定处理器的设计,因此他们并不被预期会成为微处理器世代之间保留的标准。

    有关从随机存取存储器提取信息的寄存器与CPU(位于不同芯片的储存寄存器集合)

    存储器缓冲寄存器(Memory buffer register)

    存储器数据寄存器(Memory data register)

    存储器地址寄存器(Memory address register)

    存储器型态范围寄存器(Memory Type Range Registers)[1]

    向量寄存器[2]

    4.工作原理

    1、一个典型的CPU由运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连。

    区别:

    内部总线实现CPU内部各个器件之间的联系。

    外部总线实现CPU和主板上其它器件的联系。

    8086CPU有14个寄存器 它们的名称为:

       AX、BX、CX、DX、SI、DI、SP、BP、

       IP、CS、SS、DS、ES、PSW。

    8086CPU所有的寄存器都是16位的,可以存放两个字节,一个字节8位。

    AX、BX、CX、DX 通常用来存放一般性数据被称为通用寄存器。

    一个16位寄存器所能存储的数据的最大值为多少? 

    因为每一位存放的数据是0或1,那么最大的数值自然就是 1111 1111 1111 1111(2),也就是2^16-1。

     

    2、通用寄存器(重点)

    8086上一代CPU中的寄存器都是8位的,为保证兼容性,

    这四个寄存器都可以分为两个独立的8位寄存器使用。
    AX可以分为AH和AL;
    BX可以分为BH和BL;
    CX可以分为CH和CL;
    DX可以分为DH和DL。

    AX的低8位(0位~7位)构成了AL寄存器,高8位(8位~15位)构成了AH寄存器。

    AH和AL寄存器是可以独立使用的8位寄存器,如果当成是8位寄存器使用,那么他们就是独立的,没有任何关系。

    一个8位寄存器所能存储的数据的最大值是多少?二进制数值 1111 1111 ,也就是 2^8-1。

    3、字在寄存器中的存储

    注意:在进行数据传送或运算时,要注意指令的操作数的位数要匹配。

    4、物理地址的表示(重点)

    CPU访问内存单元时要给出内存单元的地址,所有的内存单元构成的存储空间是一个一维的线性空间。

    我们将这个唯一的地址称为物理地址。

    不同的CPU有不同的形成物理地址的方式。

    (1)16位结构的CPU

    8086内部为16位结构,它只能传送16位的地址,表现出的寻址能力却只有64K。

    8086外部有20位地址总线,可传送20位地址,寻址能力为1M。

    那么,8086CPU如何用内部16位的数据,转换成20位的地址呢?

    8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。

    段地址+偏移地址 -> 地址加法器 -> 20位的物理地址。

    地址加法器合成物理地址的方法:段地址×16+偏移地址=物理地址

    “段地址×16”有一个更为常用的说法就是数据左移4位。(二进制位)

    二进制的数据左移4位,意味着乘以2^4=16。

    这样做的目的主要是为了弥补内部总线16位的缺陷而设计的。

    5、关于段空间

    内存没有分段,段的划分来自于CPU,

    由于8086CPU用“(段地址×16)+偏移地址=物理地址”的方式给出内存单元的物理地址,

    使得我们可以用分段的方式来管理内存。

    以后,在编程时可以根据需要,将若干地址连续的内存单元看作一个段,

    用段地址×16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。

    (1)段地址×16 必然是 16的倍数,所以一个段的起始地址也一定是16的倍数;

    (2)偏移地址为16位,16 位地址的寻址能力为 64K,所以一个段的长度最大为64K。

    CPU可以用不同的段地址和偏移地址形成同一个物理地址。

    如果给定一个段地址,仅通过变化偏移地址来进行寻址,最多可以定位多少内存单元?

    因为偏移地址16位,变化范围为0~FFFFH,仅用偏移地址来寻址最多可寻64K个内存单元。

    比如:给定段地址1000H,用偏移地址寻址,CPU的寻址范围为:10000H~1FFFFH。

    6、地址的描述

    在8086PC机中,存储单元的地址用两个元素来描述。即段地址和偏移地址。

    “数据在21F60H内存单元中。”对于8086PC机的两种描述:

    (a)数据存在内存2000:1F60单元中;

    (b)数据存在内存的2000段中的1F60H单元中。

    可根据需要,将地址连续、起始地址为16的倍数的一组内存单元定义为一个段。

     

    7、段寄存器就是提供段地址的。

    8086CPU有4个段寄存器: CS、DS、SS、ES。

    CS和IP是8086CPU中最关键的寄存器,它们指示了CPU当前要读取指令的地址。

    CS为代码段寄存器,IP为指令指针寄存器。

    在 8086CPU 加电启动或复位后( 即 CPU刚开始工作时)CS和IP被设置为CS=FFFFH,IP=0000H。

    即在8086PC机刚启动时,CPU从内存FFFF0H单元中读取指令执行。

    FFFF0H单元中的指令是8086PC机开机后执行的第一条指令。

    8、修改CS,IP

    mov指令不能用于设置CS、IP的值,8086CPU没有提供这样的功能。

    8086CPU为CS、IP提供了另外的指令来改变它们的值:转移指令

    JMP 段地址:偏移地址

    JMP 2AE3:3

    功能:用指令中给出的段地址修改CS,偏移地址修改IP。CS = 2AE3H, IP = 0003H。

    仅修改IP的内容:

    jmp 某一合法寄存器

    jmp ax   (类似于 mov IP,ax)

    功能:用寄存器中的值修改IP。

    8086机中,任意时刻,CPU将CS:IP指向的内容当作指令执行。

    9、关于debug指令(Win7没有这个指令,XP才有)

    R命令查看、改变CPU寄存器的内容;

    D命令查看内存中的内容;

    E命令改写内存中的内容;

    U命令将内存中的机器指令翻译成汇编指令;

    T命令执行一条机器指令;

    A命令以汇编指令的格式在内存中写入一条机器指令。

     

     

    展开全文
  • 寄存器PLC地址与寄存器modbus协议地址

    万次阅读 多人点赞 2017-10-24 22:25:28
    寄存器PLC地址指存放于控制器中的地址,这些控制器可以是PLC,也可以使触摸屏,或是文本显示器。PLC地址一般采用10进制描述,共有5位,其中第一位代码寄存器类型。第一位数字和寄存器类型的对应关系如表1所示。PLC...

           寄存器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。 因为数据类型已经包含在功能码中了, 西门子的 i0.0的 modbus 地址实际上为000000, i2.0的 modbus 地址为 000016(或十六进制数16#0010) ,而不是010017。

    3)、无论V寄存器还是M寄存器,里面的不同数据类型(VB、VW、VD、MB、MW、MD)都是基于寄存器内存总字节地址为偏移地址。

    4)、在数据报文中,所有的modbus地址都是从0开始的。也就是首次出现的数据项在报文中的地址为0。比如:(All data addresses in Modbus messages are referenced to zero. The first occurrence of a data item is addressed as item number zero.)

    5)、Modbus地址实际上分为两种情况。
    第一种情况:PLC作Modbus主站,Modbus地址和PLC手册里的地址一致,例如作主站的S7-200的MBUS_MSG指令用于向Modbus从站发送请求消息,和处理从站返回的响应消息。要读取从站(另一台S7-200)的I0.0开始的地址区时,它的输入参数Addr(Modbus地址)为10001。S7-200从站保持寄存器的V区起始地址为VB200时,要读取从站VW200开始的V存储区时,保持寄存器的地址是40001。
    第二种情况:PLC作从站,PLC不用管什么Modbus地址,等着主站来读写它的地址区就是了。
    主站的计算机软件(例如DCS或组态软件)的编程人员需要编写实现Modbus通信的程序,首先需要确定Modbus RTU的报文结构。他们一般不熟悉PLC,因此PLC的编程人员往往需要和上位机软件的编程人员一起来讨论Modbus的报文结构。
    最容易出问题的就是报文里Modbus地址与PLC存储区地址的对应关系。
    S7 PLC手册给出的Modbus地址与Modicon公司和GE公司PLC使用的地址相同,是基于1的地址,即同类元件的首地址为1。而西门子PLC采用的是基于0的地址,即同类元件的首地址为0。Modbus报文中西门子PLC的Modbus地址也采用基于0的地址。
    PLC系统手册中的Modbus地址的最高位用来表示地址区的类型,例如I0.0的Modbus地址为10001。因为地址区类型的信息已经包含在报文的功能码中了,报文中S7-200的I0.0的Modbus地址不是10001,而是0。报文中其他地址区的Modbus地址也应按相同的原则处理。例如当S7-200从站保持寄存器的V区起始地址为VB200时,VW200对应的保持寄存器在报文中的Modbus地址为0,而不是40001。

     

    施耐德plc modbus地址对照表

    000001至000XXX是实际输出,对应%QX0.0-%QXX.X
    010001至010XXX是实际输入,对应%IX0.0-%IXX.X
    030001至030032是模拟量寄存器,对应%AIW0,16位一路依次类推
    040001至040XXX是保持寄存器,对应%MX0.0-%MXX.X,1对1,要是%MW就对应16位,依次类推。施耐德PLC中  W表示字 16位,D表示双字 32位。比如:%MW10和%MD10。B表示字节 8位,X表示位。比如:%MB0和%MX0.0~%MX0.7

    %MW10.4
    %MW10是指一个字,一个字分为2个字节,一个字节8个位,也就是说%MW10中有16个位,从%MW10.0~%MW10.15。
    %QW0.5.1.0.10
    Q是输出 ,0是机架,5是0号机架的第五个模块,1是第五号模块的第一个通道,0是第一个通道的第0个字,10是第0个字的第10个位。

    无论MX、MB、MW、MD都是基于内存总字节地址为偏移地址,也就是以%MB之后的地址为偏移地址。

    施耐德plc寄存器地址对应的modubs地址
    寄存器地址 modubs 说明 公式
    %QX1.0 000001.0 开关量输出 %QXx.y=000001+x.y
    %IX1.0 010001.0 开关量输入 %IXx.y=010001+x.y
    %AIW0 030001 模拟量输入 %AIWx=030001+x
    %MD40 0400801 保持寄存器 %MDx.y=040001+x*2.y
    %MW50.0         040051.0 保持寄存器 %MWx.y=040001+x.y
    %MX100.0 040051.0 保持寄存器 %MXx.y=040001+x/2.y
    注意:
    1、%MX100.0表示某个字节地址,因为%MW50这个地址中包含了%MB100、%MB101,%MX100.0其实是%MW50的第0位即40051.0
    2、%MD40表示双字,%MD40对应的首地址是%MW*2,也就是%MW80,%MD40对应的modbus地址为0400801

     

    西门子s7系列plc modbus地址对照表


            例如:地址:40040;对应S7200地址:VW78;对应S7300地址:DB1.DBW78;


    三菱FX系列PLC modbus地址对照表

    OMRON PLC地址转MODBUS协议对照表
    将OMRON PLC接入支持MODBUS协议的上位DCS系统中,通过ASC模块可满足用户的这一需求。具体方法参考:

    https://wenku.baidu.com/view/3ff1d16da5e9856a5712601d.html

    台达PLC寄存器地址与Modbus寄存器地址对照表
    https://wenku.baidu.com/view/f884db6d102de2bd97058836.html

    永宏PLC寄存器Modbus地址表
    https://wenku.baidu.com/view/4843e77c30126edb6f1aff00bed5b9f3f90f72c8.html
     

    信捷PLC寄存器Modbus地址表

    展开全文
  • 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这几个相关的特殊地址,进行赋值或修改数值的操作。有点像打篮球,不论进攻时有怎样花哨的运球与传切配合,最后都要完成把球放入篮筐的动作,才能得分。
    在这里插入图片描述

    展开全文
  • 寄存器和移位寄存器详解

    千次阅读 2020-04-17 08:50:53
    文章目录寄存器的定义寄存器的分类寄存器的工作原理移位寄存器的定义和分类多功能双向移位寄存器典型的集成电路 寄存器的定义 寄存器的分类 寄存器的工作原理 移位寄存器的定义和分类 多功能双向移位...

    寄存器的定义

    在这里插入图片描述

    寄存器的分类

    在这里插入图片描述

    寄存器的工作原理

    在这里插入图片描述
    在这里插入图片描述

    移位寄存器的定义和分类

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    多功能双向移位寄存器

    在这里插入图片描述
    在这里插入图片描述

    典型的集成电路

    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • DS 寄存器和 ES 寄存器: DS 数据段寄存器(Data Segment) ES 附加段寄存器(Extra Segment) 特点 1 属于段寄存器,不能直接保存数据,只能通过其他的段寄存器保存数据。 2 他们两个一个没有明显的区别,但是DS 是...
  • 一个典型CPU是由运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连。 区别:内部总线实现CPU内部各个器件之间的联系 外部总线实现CPU与主板上其它器件的联系。(地址,数据,控制) 8086CPU有14个寄存器...
  • 汇编语言:寄存器相关概念初理解(通用寄存器、段寄存器、专用寄存器) 1.寄存器分类 一图抵千言: 2.详细介绍及注意事项 (1)AX BX CX DX被称为通用寄存器(可被分割为2个8位寄存器),存放数据的,数据寄存器(16...
  • 寄存器介绍

    万次阅读 多人点赞 2017-04-19 19:37:25
    寄存器介绍
  • PC寄存器

    千次阅读 2020-10-07 13:13:56
    JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器寄存器存储指令相关的现场信息,CPU只有把数据装载到寄存器才能够运行。 这里,并非是广义上所指的物理寄存器,或许将其翻译...
  • SS 寄存器和 SP 寄存器: SS 寄存器:Stack Segment (堆栈段寄存器) SP 寄存器:Stack Pointer(堆栈指针寄存器) 这两个寄存起是为了访问内存用的,SS为段寄存器,SP为偏移。 SP受PUSH和POP两个指令的影响。 PUSH ...
  • Modbus寄存器地址规则

    万次阅读 2019-08-09 00:32:31
    Modbus协议定义的寄存器地址是5位十进制地址,即: 线圈(DO)地址:00000~09999 触点(DI)地址:10000~19999 输入寄存器(AI)地址:30000~39999 输出寄存器(AO)地址:40000~49999 由于上述各类地址是...
  • 数据寄存器:AX,BX,CX,DX 地址指针寄存器:SP,BP 变址寄存器:SI,DI 1, 指针寄存器:主要提供全部或部分偏移量 16位: SP堆栈指针寄存器 BP基址指针寄存器 SP:存放堆栈段中栈顶单元的偏移量 BP:存放堆栈段中...
  • 通过3个问题理解寄存器及其操作。 什么是寄存器(就是个数字)? 简单可以理解为能够通过软件改写数值、控制硬件的一个32bit的数字。多个数字一起控制一个外设。 这个数值在哪? 这个数字要被存起来,就一定有一...
  • GPIO寄存器

    2020-08-30 13:56:37
    每组IO口有10个寄存器组成,如果芯片有GPIOA~GPIOI,9个组那么一共有90个寄存器 如果配置一个IO口需要2个位,那么刚好32位寄存器配置一组IO口16个IO口 如果配置一个IO口只需要1个位,一般高16位保留 BSRR寄存器32位...
  • 寄存器总结

    千次阅读 2019-10-14 22:55:10
    寄存器种类 编程结构(图为8086结构):即程序员与使用者(用户可以看到的) 具体结构 为什么程序和用户可以看到这些寄存器呢???? 从程序员的角度来看是比较容易理解的,程序员对这些寄存器可见,是因为他们...
  • mips寄存器

    千次阅读 2019-12-01 17:03:49
    mips体系结构有 : 32个通用寄存器,2个特殊寄存器(整数乘除法寄存器), 32个浮点寄存器。 pc : 程序计数器,在mips体系结构下,pc不是一个通用寄存器。 通用寄存器寄存器编号 助记符 用途 0 zero 不管...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 98,376
精华内容 39,350
关键字:

寄存器