精华内容
下载资源
问答
  • 前言 ´・ᴗ・` 微机系统的构成 外设 CPU结构 执行单元 BIU 寄存器 存储器组织结构 寻址方式 总结 ´◡`

    前言 ´・ᴗ・`

    • 本节主要以8086为例讲了CPU的一些内置寄存器及其作用 不要求记住 因为只有用到的时候这些名称才更加有意义
    • 笔者在玩嵌入式的时候 比如stm32 涉及深入的硬件debug 就遇到了内部寄存器级别的问题 所以这个也算是对嵌入式的铺垫
    • 本篇内容将会帮助你学习…
      • 0 8086 CPU的基本结构
      • 1 Intel 8086 寄存器种类 作用
      • 2 寄存器之间部分相互联系
      • 3 存储器 内存的CPU寻址方法

    微机系统的构成

    这里我们提纲挈领的明白 接下来我们学习的部分到底是属于哪里
    大部分简单的单片机乃至复杂的PC 其实组成结构都是相近的 可以说都从那个简单的8086进化而来
    意味着我们掌握8086 就可以一通百通
    姑且给简单的计算机(现在就是嵌入式的单片机了)起个名字:微机

    • 微机系统
      • 硬件系统
        • 微机(可以理解为电脑)
          • CPU
          • 存储器 (内存)
          • IO 接口
          • 总线 Bus
        • 外设 perpherial
      • 软件系统
        • 系统软件(OS操作系统自带的)
        • 应用软件 就是我们自己安装的

    接下来的部分 聚焦 CPU以及与存储器的联动

    外设

    外设(perpherial 直译 外围的 相对于CPU当然是外围的) 就是我们CPU控制的外围设备

    简单而言 你用树莓派控制一个LED灯 你可以认为树莓派是CPU, LED灯是外设
    这两者的桥梁就是一个接口(interface)
    我们说任何接口 都是有 沟通的桥梁的意思
    IO设备与CPU的接口就是IO(input output输入输出) 接口

    为啥叫 输入输出接口呢? 因为信息是双向的啊 既有输入也有输出
    比如,
    CPU想通过+5V的信号让灯亮 就是CPU往接口输入+5V的信号 然后LED自然就接受到了这个+5V然后亮起来了咯
    当然 外设除了我们给它供电的(灯 舵机)
    也有反馈信息的 比如传感器(sensor)
    这个时候 在CPU的角度上看 接口是输出信息的(来源于传感器)
    所以 接口可以发送或者接收信息 所谓输入 输出接口
    (当然 设置这个接口的功能是输入还是输出 是推挽输出还是端口复用 都是我们编程序控制的)

    所以CPU和外设的关系可以简单地看成这样:
    在这里插入图片描述
    接口有很多种 为了适用于 或者说驱动(drive)不同的外设 这里大致看看了解就好
    在这里插入图片描述

    CPU

    物理意义上 就是分为内部与外部

    • 外部:
      存储器就是我们熟知的内存
      CPU只负责计算 当然还有少量的寄存器存储计算结果的 但是容量很少
      在这里插入图片描述
      前面讲了IO端口(就是IO接口 一个意思)那么这玩意在哪里呢?属于CPU 这是肯定的
      就在主板上:)一堆集成电路里面 是和CPU配套的电路 但不属于CPU:)
      再问个简单的问题:为啥内存能够和CPU直接连接 为啥硬盘不行?
      CPU频率动不动几个GHZ 内存也是如此,但是硬盘?喵喵喵?慢的一批啊
      所以只有内存跟得上CPU的speed 还有显存(可能比内存还快) 同理。
      • 地址总线address bus
        我们CPU访问IO端口或者访问存储单元(在内存里面的),需要通过地址来找到他们的位置 这时需要地址总线 传地址(地址码)。这是单向的
      • 数据总线data bus
        顾名思义 就是传数据 但是请注意 程序也是数据 指令也是数据 单纯的0001H也是数据
      • 控制总线control bus
        管理上面两个总线的 一般是传送控制指令 或者外设反馈状态信息 (不用深究)
      • 总线宽度的影响
        地址线宽度影响寻址能力 就是内存可以划分成一个个字节位单位的存储单位 那你需要给每个字节都来个标号 这就是地址 类似每个人家的门牌号
        220B=10241024B=1MB2^{20}B=1024*1024B=1MB 20位的地址就可以对应1024*1024个字节 其他同理
        在这里插入图片描述
        内部:
        在这里插入图片描述
        在这里插入图片描述

    CPU结构 单元化 功能性的视角

    实际上 我们嵌入式等常见的应用(各种调试工具)看待CPU 都是以功能的角度看待其内部结构的
    我们可以理解CPU为大型机房 自然机房里面有很多服务器 类似一个个单元(unity)
    CPU也是如此 由一个个单元组成 其中

    名称 英文 中文
    EU execution 执行单元
    ALU arithmetic 算术单元
    BIU bus interface 总线接口单元

    在这里插入图片描述
    我们之前说 接口是CPU与外设的桥梁
    而CPU内部与接口对接的就是BIU 总线接口单元

    注意 我们常常说CPU做了什么 其实具体实现,是靠这一个个单元,他们功能几乎相同,所以我们抽象出一个集合体。就类似 阿里的服务器机房 是响应所有访问阿里服务的请求的主体 具体干活的是服务器 不是机房

    执行单元

    执行单元就是执行我们汇编程序的第一站 类似CPU处理程序的接口

    比方我们做一个加法运算 汇编可能就写

    mov ax, 0EA04H      
    mov bx, 4ae0H     
    
    add ax, bx
    

    在这里插入图片描述
    注意图上那个AH AL 那就是16位寄存器AX的高8位和低八位
    也就是 我们的加数 都在通用寄存器里面存着呢
    那么EU 包含的东西 就是我们汇编程序里面的参数 操作指令等 可谓是与程序最相关的单元

    当然 EU只是执行了 解释程序的功能 也就是把参数放好 指令放好(放到寄存器里面方便BIU的进一步操作)

    BIU

    BIU就是接手EU工作的 它调用EU之前修改的寄存器(EU把程序参数存放好了) 然后具体的去找
    比如 找指令 找立即数
    这个“找”的过程 就是寻址 寻找地址 然后去使用

    之后 把运算结果通过 外部总线(就是这条线与接口相连),再通过接口 最终传到外设上 比如传递高电平 灯就亮了

    有没有注意一个好玩的事情:我们所有寄存器都是16位的 那么 20位的地址 到底怎么出来的呢?地址加法器扮演一个什么角色?

    我们可以利用两个16位的寄存器值相加 得到20位
    当然不是直接相加 可以移位操作一波
    这就是8086寻址的基本套路 后面会细讲

    所谓的“两个“寄存器 一个是 段寄存器(segment register),一个是专用寄存器
    听起来有点奇怪 其实就是 存储器太大了 我们将它分段处理 非常类似我们硬盘的分区
    那么我们找数据就是 先定位分区(我们就用到段寄存器的值),
    定位分区后,内部定位,就需要知道具体是多少字节到多少字节,比如000FF - 字节 00FFF是存放电影的,打比方 ,这就是指针寄存器的值了
    你可以和 在一栋楼里面去找你女朋友为例
    整栋楼是存储器 我们分成10段 也就是10层楼
    具体在几楼 请看段寄存器的值 比方说是5楼
    到了5楼 哪个门牌号呢?
    请看指针寄存器的值 比方说01
    那么 地址就是 501

    后面还会设计到“”的概念 你需要知道 汇编找(定位)数据 都是先定位段 再定位段内的地址
    接下来我们会细讲 具体有哪些 指针寄存器和段寄存器 分别用在哪些场合

    寄存器

    相信前面在BIU EU中看到了不少寄存器了
    我们将寄存器大致分下类:

    • 通用寄存器 general purpose —— 存储任何指令的地址和数据的寄存器
      • AX adder 累加寄存器
      • BX base 基址寄存器
      • CX count 计数寄存器
      • DX data 数据寄存器
    • 专用寄存器 —— 与段寄存器合作 完成寻址
      • 指针寄存器
        • IP instruction point 指令指针寄存器
        • SP stack 堆栈指针寄存器
      • 变址寄存器
        • SI source 源变址寄存器
        • DI destination 目标变址寄存器
    • 段寄存器 segment
      • CS code 代码段寄存器
      • DS data 数据段寄存器
      • ES extra 附加段寄存器
      • SS stack 堆栈段寄存器
    • 标志寄存器 FLAGS 也就是flag
      • 作用
        • 反映指令执行结果(比如做加法 是否进位 是否溢出等)
        • 控制指令形式
      • 构成
        • 状态标志
          • CF carry 进位 标志位
          • OF overflow 溢出 标志位
          • ZF zero 结果是否为零
          • SF sign 符号
          • PF 结果的奇偶性
          • AF auxiliary 辅助进位(不用管)
        • 控制标志
          • DF direction
          • TF trap

    存储器组织结构 寻址方式

    前面稍微提到 是专用寄存器与段寄存器的合作 产生20位地址 才能进行寻址 接下来看表:

    寄存器名称 举例 地址名称 形象描述
    段寄存器 CS DS ES SS 基地址 段地址 女朋友住几楼
    专用寄存器 IP SP SI DI 偏移地址 有效地址(EA) 女朋友家门牌号

    我们用16位的段地址 指示数据在哪一段 总共有16段
    用16位的偏移量 也就是门牌号 指示 数据具体位置相对于每一段的开头 偏移了多少
    比如 门牌号510的偏移量是10,因为 相对于每层楼的开头500,差了10户人家
    偏移量也称为有效地址(EA)
    那么 具体16位的EA 能够对应多少户人家呢?答案是216 B = 64KB
    所以 一段(segment)= 64KB 也就是大概64000户人家

    这里 也把 段地址:有效地址 称为逻辑地址 就是一种键值对
    而真正得到的数据地址 也就是女朋友门牌号 称为物理地址
    一个物理地址可以对应多个逻辑地址 反过来 一个逻辑地址对应一个物理地址
    因为 逻辑地址 通过 加法 得到物理地址 加法组合无穷 结果唯一

    具体操作 我们就会
    段地址*16 + 有效地址 = 物理地址
    乘16是为了 将段地址 左移4位
    在这里插入图片描述
    当然 物理地址还可以继续划分 毕竟要寻址的内容特别复杂 可能是指令 可能只是个数据 我们大致这么分类:

    • 取指令寻址 CS+IP
    • 堆栈寻址
      • SS+SP
      • SS+BP
    • 存储器寻址
      • DS+SI
      • DS+DI

    段寄存器

    我们看一条指令吧

    MOV [0], al;
    

    这个[0]指代的是存储器(对CPU来说是“存储器”,其实就是内存)的地址,这条指令是想让AL寄存器的值传到偏移地址为0H(也就是第一个字节)那边去
    问题来了 我们知道偏移地址 那段地址计算机咋知道的呢
    他会去DS 数据段寄存器里面找

    类似强盗藏宝约定个地方,到时候去老地方分赃一样,我们约定数据(在内存的数据)的段地址 一定放在DS里面 当数据操作指令(读取或者写入内存的数据 比如刚刚写的MOV)执行的时候,就会去DS看看:)

    所以 我们想让AL寄存器的值传到物理地址为1000H:0H这个位置该怎么办呢?

    MOV bx, 1000H;
    MOV ds,bx;
    MOV [0],al;
    

    为啥要用bx这个中介呢?多此一举?

    事实上 段寄存器地位很特殊 你看看 很多指令都需要执行的时候看段寄存器的脸色
    因此 intel设计的规则就是 不能直接把常数放进段寄存器
    你放进通用寄存器就可以

    这里 所谓常数 在汇编的世界叫做立即数

    总结 ´◡`

    这些是我其他学习的部分 希望能帮到你

    • 想学习数据库嘛? 不妨从MySQL入手
      MySQL专栏

    • python这么火 想要深入学习python 玩一下简单的应用嘛?可以看我专栏 还在持续更新中哦:
      python应用

    • 小孩子才做选择 大人全都要!对后端感兴趣吗?收下它吧:)
      手把手带你学后端(服务端)

    • 谢谢大佬支持! 萌新有礼了:)

    展开全文
  • 寄存器 存储器 锁存器

    千次阅读 2016-03-06 10:56:21
    寄存器 转载出处:http://blog.sina.cn/dpool/blog/s/blog_a05b986d0101545c.html?vt=4 21个特殊功能寄存器(52系列是26个)不连续地分布在128个字节的SFR存储空间中,地址空间为80H-FFH,在这片SFR空间中,包含有...

                                                                寄存器

    转载出处:http://blog.sina.cn/dpool/blog/s/blog_a05b986d0101545c.html?vt=4

    21个特殊功能寄存器(52系列是26个)不连续地分布在128个字节的SFR存储空间中,地址空间为80H-FFH,在这片SFR空间中,包含有128个位地址空间,地址也是80H-FFH,但只有83个有效位地址,可对11个特殊功能寄存器的某些位作位寻址操作(这里介绍一个技巧:其地址能被8整除的都可以位寻址)。
    在51单片机内部有一个CPU用来运算、控制,有四个并行I/O口,分别是P0、P1、P2、P3,有ROM,用来存放程序,有RAM,用来存放中间结果,此外还有定时/计数器,串行I/O口,中断系统,以及一个内部的时钟电路。在单片机中有一些独立的存储单元是用来控制这些器件的,被称之为特殊功能寄存器(SFR)。这样的特殊功能寄存器51单片机共有21个并且都是可寻址的列表如下(其中带*号的为52系列所增加的特殊功能寄存器):

    单片机寄存器X

    单片机寄存器
    单片机寄存器
    单片机寄存器
    分别说明如下:
    1、ACC---是累加器,通常用A表示
      这是个什么东西,可不能从名字上理解,它是一个寄存器,而不是一个做加法的东西,为什么给它这么一个名字呢?或许是因为在运算器做运算时其中一个数一定是在ACC中的缘故吧。它的名字特殊,身份也特殊,稍后在中篇中我们将学到指令,可以发现,所有的运算类指令都离不开它。自身带有全零标志Z,若A=0则Z=1;若A≠0则z=0。该标志常用作程序分枝转移的判断条件。
    2、B--一个寄存器
      在做乘、除法时放乘数或除数,不做乘除法时,随你怎么用。
    3、PSW-----程序状态字。
      这是一个很重要的东西,里面放了CPU工作时的很多状态,借此,我们可以了解CPU的当前状态,并作出相应的处理。它的各位功能请看下表:
    单片机寄存器
    下面我们逐一介绍各位的用途
    CY:进位标志。
      8051中的运算器是一种8位的运算器,我们知道,8位运算器只能表示到0-255,如果做加法的话,两数相加可能会超过255,这样最高位就会丢失,造成运算的错误,怎么办?最高位就进到这里来。这样就没事了。有进、借位,CY=1;无进、借位,CY=0
      例:78H+97H(01111000+10010111)
    AC:辅助进、借位(高半字节与低半字节间的进、借位)。
      例:57H+3AH(01010111+00111010)
    F0:用户标志位
      由用户(编程人员)决定什么时候用,什么时候不用。
    RS1、RS0:工作寄存器组选择位
      通过修改PSW中的RS1、RS0两位的状态,就能任选一个工作寄存器区。这个特点提高了MCS-51现场保护和现场恢复的速度。对于提高CPU的工作效率和响应中断的速度是很有利的。若在一个实际的应用系统中,不需要四组工作寄存器,那么这个区域中多余单元可以作为一般的数据缓冲器使用。
    单片机寄存器
    0V:溢出标志位
      运算结果按补码运算理解。有溢出,OV=1;无溢出,OV=0。什么是溢出我们后面的章节会讲到。
    P:奇偶校验位
      它用来表示ALU运算结果中二进制数位“1”的个数的奇偶性。若为奇数,则P=1,否则为0。运算结果有奇数个1,P=1;运算结果有偶数个1,P=0。
      例:某运算结果是78H(01111000),显然1的个数为偶数,所以P=0。
    4、DPTR(DPH、DPL)--------数据指针
      可以用它来访问外部数据存储器中的任一单元,如果不用,也可以作为通用寄存器来用,由我们自已决定如何使用。分成DPL(低8位)和DPH(高8位)两个寄存器。用来存放16位地址值,以便用间接寻址或变址寻址的方式对片外数据RAM或程序存储器作64K字节范围内的数据操作。
    5、P0、P1、P2、P3--------输入输出口(I/O)寄存器
      这个我们已经知道,是四个并行输入/输出口(I/O)的寄存器。它里面的内容对应着管脚的输出。
    6、IE-----中断充许寄存器
    可按位寻址,地址:A8H
    单片机寄存器
    EA (IE.7):EA=0时,所有中断禁止(即不产生中断);EA=1时,各中断的产生由个别的允许位决定 - (IE.6):保留 ET2(IE.5):定时2溢出中断充许(8052用) ES (IE.4):串行口中断充许(ES=1充许,ES=0禁止) ET1(IE.3):定时1中断充许 EX1(IE.2):外中断INT1中断充许 ET0(IE.1):定时器0中断充许 EX0(IE.0):外部中断INT0的中断允许 7、IP-----中断优先级控制寄存器
    可按位寻址,地址位B8H
    单片机寄存器
    - (IP.7):保留 - (IP.6):保留 PT2(IP.5):定时2中断优先(8052用) PS (IP.4):串行口中断优先 PT1(IP.3):定时1中断优先 PX1(IP.2):外中断INT1中断优先 PT0(IP.1):定时器0中断优先 PX0(IP.0):外部中断INT0的中断优先 8、TMOD-----定时器控制寄存器
    不按位寻址,地址89H
    单片机寄存器
    GATE :定时操作开关控制位,当GATE=1时,INT0或INT1引脚为高电平,同时TCON中的TR0或TR1控制位为1时,计时/计数器0或1才开始工作。若GATE=0,则只要将TR0或TR1控制位设为1,计时/计数器0或1就开始工作。 C/T :定时器或计数器功能的选择位。C/T=1为计数器,通过外部引脚T0或T1输入计数脉冲。C/T=0时为定时器,由内部系统时钟提供计时工作脉冲。 M1 、M0:T0、T1工作模式选择位 单片机寄存器
    9、TCON-----定时器控制寄存器
    可按位寻址,地址位88H
    单片机寄存器
    TF1:定时器T1溢出标志,可由程序查询和清零,TF1也是中断请求源,当CPU响应T1中断时由硬件清零。 TF0:定时器T0溢出标志,可由程序查询和清零,TF0也是中断请求源,当CPU响应T0中断时由硬件清零。 TR1:T1充许计数控制位,为1时充许T1计数。 TR0:T0充许计数控制位,为1时充许T0计数。 IE1:外部中断1请示源(INT1,P3.3)标志。IE1=1,外部中断1正在向CPU请求中断,当CPU响应该中断时由硬件清“0”IE1(边沿触发方式)。 IT1:外部中断源1触发方式控制位。IT1=0,外部中断1程控为电平触发方式,当INT1(P3.3)输入低电平时,置位IE1。 IE0:外部中断0请示源(INT0,P3.2)标志。IE0=1,外部中断1正在向CPU请求中断,当CPU响应该中断时由硬件清“0”IE0(边沿触发方式)。 IT0:外部中断源0触发方式控制位。IT0=0,外部中断1程控为电平触发方式,当INT0(P3.2)输入低电平时,置位IE0。 10、SCON----串行通信控制寄存器
      它是一个可寻址的专用寄存器,用于串行数据的通信控制,单元地址是98H,其结构格式如下:
    单片机寄存器
    (1)SM0、SM1:串行口工作方式控制位。
      SM0,SM1 工作方式
         00 方式0-波特率由振荡器频率所定:振荡器频率/12
         01 方式1-波特率由定时器T1或T2的溢出率和SMOD所定:2SMOD ×(T1溢出率)/32
         10 方式2-波特率由振荡器频率和SMOD所定:2SMOD ×振荡器频率/64
         11 方式3-波特率由定时器T1或T2的溢出率和SMOD所定:2SMOD ×(T1溢出率)/32
    (2)SM2:多机通信控制位。< br> 多机通信是工作于方式2和方式3,SM2位主要用于方式2和方式3。接收状态,当串行口工作于方式2或3,以及SM2=1时,只有当接收到第9位数据(RB8)为1时,才把接收到的前8位数据送入SBUF,且置位RI发出中断申请,否则会将接受到的数据放弃。当SM2=0时,就不管第位数据是0还是1,都难得数据送入SBUF,并发出中断申请。
    工作于方式0时,SM2必须为0。
    (3)REN:允许接收位。< br> REN用于控制数据接收的允许和禁止,REN=1时,允许接收,REN=0时,禁止接收。
    (4)TB8:发送接收数据位8。< br> 在方式2和方式3中,TB8是要发送的——即第9位数据位。在多机通信中同样亦要传输这一位,并且它代表传输的地址还是数据,TB8=0为数据,TB8=1时为地址。
    (5)RB8:接收数据位8。
    在方式2和方式3中,RB8存放接收到的第9位数据,用以识别接收到的数据特征。
    (6)TI:发送中断标志位。
    可寻址标志位。方式0时,发送完第8位数据后,由硬件置位,其它方式下,在发送或停止位之前由硬件置位,因此,TI=1表示帧发送结束,TI可由软件清“0”。
    (7)RI:接收中断标志位。
    可寻址标志位。接收完第8位数据后,该位由硬件置位,在其他工作方式下,该位由硬件置位,RI=1表示帧接收完成。
    11、PCON-----电源管理寄存器
       PCON主要是为CHMOS型单片机的电源控制而设置的专用寄存器,单元地址是87H,其结构格式如下:
    单片机寄存器
     在CHMOS型单片机中,除SMOD位外,其他位均为虚设的,SMOD是串行口波特率倍增位,当SMOD=1时,串行口波特率加倍。系统复位默认为SMOD=0。
    12、T2CON-----T2状态控制寄存器
    单片机寄存器
    TF2:T2溢出中断标志。TF2必须由用户程序清“0”。


    存储器

    简介

    1. 1

      51单片机从物理结构上,可分为片内,片外程序存储器,片内片外数据存储器。

    2. 2

      51单片机从功能上,有程序存储器片内数据存储器特殊功能寄存器位地址空间片外数据存储器

      END

    程序存储器

    1. 1

      51单片机的程序存储器用于存储代码和一些固定表格常数。

                        可寻址的程序存储器空间为64KB。

    2. 2

      51单片机的从物理角度上可分为:片内,片外程序存储器,作为编址空间,编址规律是:先片内,后片外,片内片外连续,不重叠。

      如图:为51单片机程序存储器编址图。

      51单片机存储器简介
    3. 3

      单片机如何执行指令?

      如图:

      51单片机存储器简介
    4. 4

      程序地址空间一般可以根据用户需要任意安排使用,但是cpu执行特殊程序的入口地址,用户必须按照规定存放相应的程序。

      特殊程序入口地址如图:

      51单片机存储器简介
      END

    数据存储器

    1. 51单片机内外数据存储器是两个独立的地址空间,应单独编址

      片内数据存储器地址空间"00H-FFH",RAM地址空间“00H-7FH”特殊功能寄存器SFR地址空间“80H-FFH”

      片外数据存储器地址空间“0000H-FFFFH”

      如图:

      51单片机存储器简介
    2. 为了使片内数据存储器的存储空间合理运用,对低128字节的RAM划分了不同的功能区。

      如图:

      51单片机存储器简介
    3. 工作寄存器区,地址空间00-1FH,功能是用于临时寄存8位信息。

      工作寄存器分为4组,每组8个寄存器,用R0-R7表示。

      使用那组寄存器通过程序状态字PSW中的PSW.3(RS0)和PSW.4(RS1)控制。

      如图:

      51单片机存储器简介
    4. 位寻址区,地址空间20H-2FH,16个单元,共128位。

    5. 数据缓冲区,地址空间30H-7FH,共80个单元。

      END

    特殊功能寄存器

    1. 特殊功能寄存器(SFR,Special Function Registers)别称专用寄存器,主要用于管理,控制,片内逻辑部件,并行i/o口,串行i/O口,定时器/计数器,中断系统等功能模块的工作。

    2. 51单片机中,专用寄存器与片内RAM统一编址,且作为直接寻址使用。

    3. 51单片机有18个专用寄存器,其中3个是双字节寄存器,占用21个字节。

    4. 在SFR块的地址空间80H-FFH中,仅仅只有21个字节作为特殊功能寄存器离散分布在这128个字节范围中,其余字节无定义,但是用户不能对这些字节进行“读写操作”

    5. 下图为特殊功能寄存器的名称,表示符,地址一览表。

      51单片机存储器简介





















    锁存器


    所谓锁存就是就是把当前的状态锁存起来,使CPU送出的数据在接口电路的输出端保持一段时间锁存后状态不再发生变化,直到解除锁定。
    还有些芯片具有锁存器,比如芯片74LS244就具有锁存的功能,它可以通过把一个引脚置高后,输出就会保持现有的状态,直到把该引脚清0后才能继续变化。

    转载地址:http://www.elecfans.com/baike/bandaoti/bandaotiqijian/20100309183644.html


    锁存器的原理分析

    锁存器就是把单片机的输出的数先存起来,可以让单片机继续做其它事.. 
    比如74HC373就是一种锁存器 
    它的LE为高的时候,数据就可以通过它.当为低时,它的输出端就会被锁定,即为刚才通过的数据,这样,就可以保持这个状态.

    74HC373是CMOS电路 
    74LS373是TTL电路 
    都是8D锁存器

    钟控 RS 触发器的 S 输入端,通过非门连接到 R 输入端,组成单输入触发器,通常把这个电路叫做 D 锁存器。如下图示。

     

    当CP = 1 时,输出端的状态随输入端的状态而改变。Q n+1 = D , 存入新的数据;当CP = 0 时,无论 D 如何变化,输出端的状态保持不变。Q n+1 = Q n,存入的数据不变。为了触发器可靠的工作,要求 D 输入信号先于CP = 1 的信号,称为建立时间 t set。


        本八路抢答器设计使用方法非常简单,从上述工作原理可知,抢答前只需先将开关K置于2,然后再置于1,即可进行抢答 . 顺便提一下,由于当按钮开关AN0先按下时,数码管显示0,这与我们平时的编号习惯有点不同。本八路抢答器论文中关于原理的分析内容均为http://www.51hei.com单片机教程网,工作人员得出如有错误请指正。本设计元件选择:锁存器选用74ls373 八路锁存器,编码器用 74ls148 三线编码器,数码显示驱动器用bcd码七段译码器74ls247与共阳极七段数码管搭配,控制电路由八输入与非门 74ls30和一个或门、一个非门构成,或门用74ls32二输入四或门,非门 74ls04六反相器。

        八路抢答器原理图如下图所示,看起来其实也很简单的。锁存器输入信号均为同一电平时,控制电路输出控制信号使锁存器进入工作状态,这时锁存器输入端的电平送往相应的输出端,当有一输入端电平发生跳变时,其对应输出端电平也随着变,此变化的输出电平送入控制电路,控制电路产生使锁存器锁存的控制信号,锁存器我们知道只要给他控制端一个电平他就进入锁存工作状态,不管任何一个输入端电平发生了变化,各输出端电平都会保持不变,与其它输出端电平不一样的那个输出端的电平经编码器编码后送入数码显示译码器,控制驱动器驱动七段数码管进行数字的显示。

    点击浏览下一页
    八路抢答器原理图]

    八路抢答器电路工作原理:
    输入锁存
    当八路锁存器74ls373的 s 端为高电平时,锁存器输入端 (1D-8D)的电平能直接送到相应的输出端1Q-8q当S端由高电平变到低电平时,锁存器锁存,即输入端电平不能送到输出端,各输出端保持锁存前的电平.先将开关 K 置于2,此时 74LS373 的S端为高电平,其各输入端的高电平直接送到各相应的输出端, 从而使八输入端与非门74LS373 的八个输入端均为高电平,导致其输出为低电平,经非门1后变成高电平,再由或门送到 74LS373 的S 控制端,然后将开关K 置于1,这时由于或门的另一输入仍为高电平,故S控制端仍保持高电平,当八个按钮开关AN0-NA7 中有一个先按下时,其对应的 D 端变为低电平,此低电平经锁存器送到相应的Q 输出端,这时74LS的八个输入端中因有一个端变低电平,所以它的输出端变为高电平,经非门1和或门后,使s控制端由高电平变成低电平,74LS373 执行锁存功能,如果这时 还有按钮按下,锁存器对应的输出端电平也不会变.

    点击浏览下一页
    [八路抢答器电路图]

    编码和译码显示
    74LS74LS为输入低电平有效和输出低电平有效,即当I0端为低电平而其它输入端为高电平时,输出端Y2,Y1,Y0均为高电平,I1端为低电平而其它输入端为高电平时,Y2,Y1端均为高电平,Y0 端为低电平,以此类推锁存在锁存器输出端的低电平送到74LS148,由 74LS148进行编码,编成的二进制代码电平经非门 2 3 4分别倒相后,送到BCD码七段译码驱动器74LS247再由74LS247输出端送出驱动电平驱动共阳极七段数码管5EF105显示相应的数字,如I0端为低电平时,显示0;I4端为低电平时,显示4,当八个按钮开关都不按下时,由于锁存器的各输出端均为高电平,经74LS30后使74LS247的熄灭控制端得到低电平,因此数码管不







    展开全文
  • [笔记]|[stm32]|[寄存器存储器区别]|[PWM]|[串口]|[Timer]stm32f103笔记 此笔记为18.12.21笔者期末复习所写 ——仅作为自己期末复习以及过后查阅的资料 文章目录[笔记]|[stm32]|[寄存器存储器区别]|[PWM]|[串口]|...

    [笔记]|[stm32]|[寄存器存储器区别]|[PWM]|[串口]|[Timer]stm32f103笔记

    此笔记为18.12.21笔者期末复习所写 ——仅作为自己期末复习以及过后查阅的资料

    单片机与嵌入式系统

    1. 单片机(英文缩写MCU

    2. 单片机只是嵌入式CPU的称呼(单片机可以理解为CPU)(嵌入式可有多个CPU)

    3. 单片机的特点是只有一个控制单元

    4. 嵌入式和普通的计算机核心区别在资源共享问题上

    5. 嵌入式可分为软件硬件组成

      • 硬件部分主要有以下组成:

        1. mpu为核心的组成,如:arm等
        2. mcu为核心,就是各种各样的单片机,它主要是因为把处理器和存储器等部件集成在一块芯片上。
        3. dsp为核心,主要用来处理语音图形方面。
        4. 就是人们所说的sop了。
      • 软件部分主要是:

        有的嵌入式有操作系统,有的没有。主要是由系统大小决定。

    CPU、MCU、MPU、DSP的区别?

    • CPU:

      CPU(Central Processing Unit,中央处理器)发展出来三个分枝,一个是DSP(Digital Signal
      Processing/Processor,数字信号处理),另外两个是MCU(Micro Control Unit,微控制器单元)和MPU(Micro Processor Unit,微处理器单元)。

    • MCU:

      MCU集成了片上外围器件;MPU不带外围器件(例如存储器阵列),(MCU)是高度集成的通用结构的处理器,是去除了集成外设的MCU;DSP运算能力强,擅长很多的重复数据运算,而MCU则适合不同信息源的多种数据的处理诊断和运算,(MCU)侧重于控制,速度并不如DSP。

    • MCU区别于DSP的最大特点在于它的通用性,反映在指令集和寻址模式中。DSP与MCU的结合是DSC

    单片机的基本工作原理

    程序(命令的集合) -> 存储到存储器中(留下所分配的地址号) -> 使用时地址被取出 -> 被执行

    单片机的几个重要概念

    1. 总线:用于地址分配的线也较多(存储单元多),这些线被称为地址总线。
    2. 数据、地址、指令:都是‘0’和‘1’的组成的序列
    3. 功能复用,功能模块的初始化、驱动。
    4. 程序的执行过程。
    5. 开发环境的建立

    stm32单片机简介

    1. Cortex-M3内核
    2. 标准的ARM架构
    3. 高性能
    4. 低电压
    5. 低功耗
    6. 电压范围2.0到3.6V
    7. I/O电压容限为5V

    stm32程序编写基本步骤

    1. 初始化管脚
    2. 初始化功能模块
    3. 编写硬件测试代码
    4. 实现功能,调试,修改

    嵌套中断向量控制器

    嵌套中断向量控制器(Nested Vector Interrupt Controller,简称NVIC)它基于Cortex-M3的微控制器提供了标准的中断架构和优秀的中断响应能力超过240个中断源提供专门的中断入口,而且可以赋予每个中断源单独的优先级。利用NVIC从可以达到极快的中断响应速度,从收到中断请求到执行中断服务的第一条指令仅需12个周期。这种极快的响应速度一方面得益于Cortex-M3内核对堆栈的自动处理机制,这种机制是通过固化在CPU内部的微代码实现的。另一方面,在中断请求连续出现的情况下,NVIC使用一种称为**“尾链”**的技术,使连续而来的中断可以在6个时钟周期内得到服务。在中断的压栈阶段,更高优先级的中断可以不耗费任何额外的CPU周期就能完成嵌入低优先级中断的动作。具体的细节后面我会继续总结的。用户可以通过设置CPU自动进入低功耗状态,而使用中断来将其唤醒,CPU在中断时间来临之前会一直保持睡眠状态。

    寄存器与存储器的区别

    一般意义上理解,寄存器是CPU里的存储单元,与CPU离得近,所以CPU在运算时通常都会用寄存器当中转站。存储器是在CPU外部的存储器,分为RAM,ROM
    对单片机来说,因为存储器,CPU都在一个片内,所以寄存器是片内RAM的一部分。

    也就是说单片机的存储器包括寄存器

    串行通讯

    1. 计算机通信:通信分为并行通信与串行通信两种基本方式。
      • 并行通信:将数据的各位用多条数据线同时进行传送,外加地址线和通信控制线。(多条数据线+地址线+通信控制线)
      • 串行通信:将数据分成1位1位的形式在一条传输线上逐个地传送
      • 特殊的串行通讯:4位串行

    图片1

    1. 并行通信和串行通信:

      • 并行通信常用于集成电路芯片的内部同一插件板上各部件之间同一机箱内各插件板之间的信息交互

      • 串行通信常用于设备之间的信息交互

        图片4

    2. 同步通信和异步通信

      • 根据数据传输方式的不同,可将串行通信分为同步通信和异步通信串行通信常用于设备之间的信息交互
      • 异步通信:若接收端与发送端使用的不是同一时钟信号(但必须同频率),则为异步通信。以字符为单位,一个字符一个字符地传送,并且每一个字符要有起始符和停止符作为开始和结束的标志。(一个字符就是一帧)常见的是USART(串口)
      • 同步通信是一种数据连续传输的串行通信方式,通信时发送方把需要发送的多个字节数据和校验信息连接起来,组成数据块。发送时,发送方只需在数据块前插入1~2个特殊的同步字符,然后按特定速率逐位输出(发送)数据块内的各位数据。接收方在接收到特定的同步字符后,也按相同速率接收数据块内的各位数据。(常见的有IIC,SPI等)
    3. 串行通讯的工作方式

      1. 单工方式:这种方式只允许数据按一个固定的方向传输。数据传输仅能从发送设备传输到接收设备
      2. 半双工方式:数据可以从A发送到B,也可以由B发送到A但A、B之间只有一根传输线,因此同一时刻只能作一个方向的传送。其传送方向由收发控制开关K切换平时一般让A、B方都处于接收状态,以便能够随时响应对方的呼叫。两个串行通信设备之间只有一条数据线,数据传输可以沿两个方向,但需要分时进行
      3. 全双工方式数据可同时在两个方向上传送
    4. 串口与RS232、RS485、RS422(属于物理层知识)

      • RS422是差分全双工(4线),RS232是双工(3线),RS485是半双工(2线)
    5. 波特率

      • 单位:bps(bit per second)

      • 定义:每秒钟传送的二进制位数

      • Baudrate(波特率范围):50 ~ 19200 ~ 57600

        ​ 50,100,150,300,600,1200,2400,
        ​ 4800,9600,19200,38400,57600,115200

      • 如每秒传送240个字符,而每个字符格式包含10位这时的波特率为10位(bit)×240个/s = 2400 bit/s。

      • 在异步串行通信中,接收方和发送方应使用相同的波特率,才能成功传送数据

    6. STM32的串口

      • 一般意义上我们所说的串口指的是USART。SPI,IIC都会特别指出。
      • 至少有3个串口,根据具体的型号有所不同。
      • 1号串口可以下载程序用。
      • 使用串口首先要使能IO时钟串口模块时钟初始化IO初始化串口
      • 有关串口的高级使用:中断串口重定向

    调试手段

    1. 设置断点,设置断点的技巧:

      在程序运行的代码中可以设置断点,程序运行到断点处即停止,但是断点处不见得就是问题出现的时刻。需要根据猜测设置需要进入的条件。

    2. 串口日志输出

      在程序运行的过程中可以通过串口将运行过程中的一些关键变量输出以得知程序运行的状态是否正确。

    3. 通过外界输入一些信息,影响程序运行的状态,观察运行的输出以测试程序运行是否正常

    中断

    1. 什么是“中断”?

      图片6

      • CPU执行程序时,由于发生了某种随机的事件(外部或内部),引起CPU暂时中断正在运行的程序,转去执行一段特殊的服务程序(中断服务子程序或中断处理程序),以处理该事件,该事件处理完后又返回被中断的程序继续执行 ,这一过程称为中断。

    ​ EG:吃饭时突然手机铃响…

    1. STM32中的优先级概念

      • STM32(Cortex-M3)中有两个优先级的概念:抢占式优先级响应优先级,也把响应优先级称作“亚优先级”或“副优先级”,每个中断源都需要被指定这两种优先级。
        1. 何为占先式优先级(pre-emption priority)
          • 高占先式优先级的中断事件会打断当前的主程序/中断程序运行—抢断式优先响应,俗称中断嵌套
        2. 何为副优先级(subpriority)
          • 占先式优先级相同的情况下,高副优先级的中断优先被响应
          • 占先式优先级相同的情况下,如果有低副优先级中断正在执行,高副优先级的中断要等待已被响应的低副优先级中断执行结束后才能得到响应非抢断式响应(不能嵌套)
    2. stm32中对中断优先级的定义

      • STM32中指定中断优先级的寄存器位有4位,这4个寄存器位的分组方式如下:
      • 第0组:所有4位用于指定响应优先级

      • 第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级

      • 第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级

      • 第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级

      • 第4组:所有4位用于指定抢占式优先级

        图片21

    3. stm32的串口接收中断

      • 步骤一:初始化GPIO
      • 步骤二:开时钟
      • 步骤三:初始化USART1
      • 步骤四:编写中断函数
      • void USART1_IRQHandler(void)

    八段码

    1. 八段码(数码管)的基本概念

      图片12

      图片13

    2. stm32的八段码使用

      • 步骤一:初始化GPIO
      • 步骤二:开时钟
      • 步骤三:初始化USART1
      • 步骤四:编写中断函数 void USART1_IRQHandler(void)
      • 步骤五: 找段
      • 步骤六:换码

    定时器

    1. stm32的定时器

      • STM32一共有8个通用16位Timer,其中TIMER1和TIMER8是高级定时器,其它的TIMER2~TIMER7是普通定时器
      • 此外还有一个Systick(系统滴答定时器),这个定时器通常在操作系统中作为系统的任务切换周期
      • 还有一个RTC,是一个毫秒定时器,支持秒级中断用来做实时时钟计数器
      • 看门狗定时器 也可以算一个。
      • 8个定时器中,Timer1和Timer8是由APB2(输出最高频率为72MHZ)预分频后,再通过一个倍频器得到时钟频率,最高为72MHzTimer2~Timer7则是由APB1(输出最高频率为36MHZ)预分频后,再通过一个倍频器得到时钟频率,最高为36MHz
    2. Systick(系统滴答定时器)

      1. //初始化:
        void Delay_Init(u8 SYSCLK)
           {
             SysTick->CTRL &=~BIT(2);//关定时器
        	 SysTick->CTRL &=~BIT(1);//关闭中断请求
        	 fac_us = SYSCLK/8;		//计算延时系数
        	 fac_ms = (u16)fac_us*1000;	 
            }
        
      2. //延时函数: 
        void delay_us(u32 nus)
        {		
        	SysTick->LOAD = (u32)fac_us*nus-1;//加载延时参数	 
            SysTick->VAL = 1;				//重置计数寄存器(初始化)
        	SysTick->CTRL |= BIT(0);		//开定时器(SysTick使能)
        	while(!(SysTick->CTRL&(1<<16)));//等待计数到0(判断是否到零)
        	SysTick->CTRL &=~BIT(0);//关SysTick(关闭)
        }
        
      3. //延时函数定义:
        void Delay(__IO uint32_t nTime)
                                     { 
                                         	TimingDelay = nTime; 
                                          	while(TimingDelay != 0);
                                       }
        
      4. systick也有中断入口也可以使用中断方式进行延时,具体代码可下自行研究。

    3. stm32的通用定时器

      • TIM2-TIM5普通定时器的定时功能。
      • 编程步骤
          1. 配置系统时钟;
          1. 配置NVIC;
          1. 配置GPIO;
          1. 配置TIMER;
      • 配置:
        • (1) 利用TIM_DeInit()函数将Timer设置为默认缺省值;
        • (2) TIM_InternalClockConfig()选择TIMx来设置内部时钟源; //可省略
        • (3) TIM_Perscaler来设置预分频系数;
        • (4) TIM_ClockDivision来设置时钟分割;
        • (5) TIM_CounterMode来设置计数器模式;
        • (6) TIM_Period来设置自动装入的值
        • (7) TIM_ARRPerloadConfig()来设置是否使用预装载缓冲器 //可省略
        • (8) TIM_ITConfig()来开启TIMx的中断
        • 其中(3)-(6)步骤中的参数由TIM_TimerBaseInitTypeDef结构体给出。步骤(3)中的预分频系数用来确定TIMx所使用的时钟频率,具体计算方法为:CK_INT/(TIM_Perscaler+1)。CK_INT是内部时钟源的频率,是根据2.1中所描述的APB1的倍频器送出的时钟,TIM_Perscaler是用户设定的预分频系数,其值范围是从0
          – 65535。
        • 步骤(7)中需要禁止使用预装载缓冲器。当预装载缓冲器被禁止时,写入自动装入的值(TIMx_ARR)的数值会直接传送到对应的影子寄存器;如果使能预加载寄存器,则写入ARR的数值会在更新事件时,才会从预加载寄存器传送到对应的影子寄存器。
    4. stm32的TIM2初始化

      void TIMER_cfg() 
      {
      TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //定义timer结构体变量
      
      RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //TIM 2-7在总线1上面
      
      //重新将Timer设置为缺省值。。
      TIM_DeInit(TIM2); 
      
      //采用内部时钟给TIM2提供时钟源,
      // TIM_InternalClockConfig(TIM2); //源程序 有这个,但是去掉 也无妨
      
      //预分频系数为36000-1,这样计数器时钟为36MHz/36000 = 1kHz
      TIM_TimeBaseStructure.TIM_Prescaler = 36000 - 1;
      //设置时钟分割
      TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
      //设置计数器模式为向上计数模式
      TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
      //设置计数溢出大小,每计2000个数就产生一个更新事件
      TIM_TimeBaseStructure.TIM_Period = 2000 - 1;
      //将配置应用到TIM2中
      TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
      
      //清除溢出中断标志
      TIM_ClearFlag(TIM2, TIM_FLAG_Update);
      //禁止ARR预装载缓冲器
      // TIM_ARRPreloadConfig(TIM2, DISABLE);
      //开启TIM2的中断
      TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
      
      TIM_Cmd(TIM2,ENABLE);
      }
      
    5. stm32的TIM2定时器中断函数

      void NVIC_cfg()
      {
      NVIC_InitTypeDef NVIC_InitStructure;
      //选择中断分组1
      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
      
      
      //选择TIM2的中断通道
      NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; 
      //抢占式中断优先级设置为0
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
      //响应式中断优先级设置为0
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
      //使能中断
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init(&NVIC_InitStructure); //初始化
      }
      
      void TIM2_IRQHandler(void)
      {
      u8 ReadValue;
      //检测是否发生溢出更新事件
      if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
      {
      //清除TIM2的中断待处理位
      TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);
      //将PB.5管脚输出数值写入ReadValue
      ReadValue = GPIO_ReadOutputDataBit(GPIOD,GPIO_Pin_13);
      if(ReadValue == 0)
      {
      GPIO_SetBits(GPIOD,GPIO_Pin_13);
      } 
      else
      {
      GPIO_ResetBits(GPIOD,GPIO_Pin_13); 
      }
      }
      }
      

    通讯协议(串口)

    1. 通讯协议:

      1. 通信协议或简称为传输协议(Communications Protocol)在电信中,是指在任何物理介质中允许两个或多个在传输系统中的终端之间传播信息的系统标准,也是指计算机通信或网络设备的共同语言。[1], 通信协议定义了通信中的语法学, 语义学和同步规则以及可能存在的错误检测与纠正。通信协议在硬件,软件或两者之间皆可实现[2]为了交换大量信息,通信系统使用通用格式(协议)。每条信息都有明确的意义使得预定位置给予响应,并独立生效回馈指定行为,通信协议须参与实体都同意才能生效

      2. 通讯协议又称通信规程,是指通信双方对数据传送控制的一种约定。约定中包括对数据格式同步方式传送速度传送步骤检纠错方式以及控制字符定义等问题做出统一规定,通信双方必须共同遵守,它也叫做链路控制规程

    2. 通讯协议的要素:

      1. 包头
      2. 包尾
      3. 地址
      4. 解析
    3. 通讯协议处理设计思想

      1. 命令缓存区 buffer
      2. 分帧
      3. 命令处理

    硬件pwm

    1. 硬件pwm基本原理

      • pwm由定时器产定时器的定时时间决定了pwm的频率

      • 比较寄存器决定了pwm的占空比

        (比较寄存器,作用是其中寄存了与计数寄存器相比较的值,当两个值相等时,发生一次比较跳变,输出的pwm波跳变

      • 定时器与输出pwm的管脚之间是有约束关系的

    2. pwm初始化

       //第一步:配置时钟               
       RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_T  IM1,ENABLE);
       //第二步,配置goio口          
          GPIO_InitStructure2.GPIO_Pin=GPIO_Pin_8;         
       GPIO_InitStructure2.GPIO_Speed=GPIO_Speed_50MHz;         
       GPIO_InitStructure2.GPIO_Mode=GPIO_Mode_Out_PP;           //设置为复用浮空输出         
       GPIO_Init(GPIOA,&GPIO_InitStructure2 GPIO_InitStructure2.GPIO_Pin=GPIO_Pin_13;         
       GPIO_InitStructure2.GPIO_Speed=GPIO_Speed_50MHz;         
       GPIO_InitStructure2.GPIO_Mode=GPIO_Mode_Out_PP;            //设置为复用浮空输出         
       GPIO_Init(GPIOB,&GPIO_InitStructure2);
       //第三步,定时器基本配置         
       TIM_TimeBaseStructure.TIM_Period=1000-1;                   // 自动重装载寄存器的值        
       TIM_TimeBaseStructure.TIM_Prescaler=72-1;                  // 时钟预分频数        
       TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;      // 采样分频        
       TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;  //向上计数        
       TIM_TimeBaseStructure.TIM_RepetitionCounter=0;      //重复寄存器,用于自动更新pwm占空比                       
       TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
                 
       //第四步pwm输出配置         
       TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;  //设置为pwm1输出模式         
       TIM_OCInitStructure.TIM_Pulse=500;                                 //设置占空比时间         
       TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;    //设置输出极性         
       TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;        //使能该通道输出          
       //下面几个参数是高级定时器才会用到,通用定时器不用配置         
       TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_High;        //设置互补端输出极性         
       TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable;//使能互补端输出         
       TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Reset;        //死区后输出状态         
       TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCNIdleState_Reset;//死区后互补端输出状态         
       TIM_OC1Init(TIM1,&TIM_OCInitStructure);                                            //按照指定参数初始化           
       //第五步,死区和刹车功能配置,高级定时器才有的,通用定时器不用配置         
       TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Disable;//运行模式下输出
       TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Disable;//空闲模式下输出选择          
       TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;  //锁定设置        
       TIM_BDTRInitStructure.TIM_DeadTime = 0x90;              //死区时间设置         
       TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;      //刹车功能使能         
       TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;//刹车输入极性        
       TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
       //自动输出使能          
       TIM_BDTRConfig(TIM1,&TIM_BDTRInitStructure);
       //第六步,使能端的打开 
       TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //使能TIMx在CCR1上的预装载寄存器         
       TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器         
       TIM_Cmd(TIM1,ENABLE);                              //打开TIM2         
       
       //下面这句是高级定时器才有的,输出pwm必须打开         
       TIM_CtrlPWMOutputs(TIM1, ENABLE);                                   
       //pwm输出使能,一定要记得打开
      
       // 在运行当中想要改变pwm的频率和占空比调用:
       TIM_SetAutoreload(TIM1,1000); 
       TIM_SetCompare1(TIM1,500);
                 
        //下面这句是高级定时器才有的,输出pwm必须打开         
       TIM_CtrlPWMOutputs(TIM1, ENABLE);                                   //pwm输出使能,一定要记得打开
      
       // 在运行当中想要改变pwm的频率和占空比调用:
       TIM_SetAutoreload(TIM1,1000); 
       TIM_SetCompare1(TIM1,500);
      
    展开全文
  • 文章目录1 主存简单模型及寻址的概念1.1 主存储器1.1.1 存储器芯片的基本结构1.1.2 寻址2 半导体存储器2.1半导体随机存取存储器2.1.1 DRAM的刷新2.1.2 SRAM的读周期2.1.3 SRAM的写周期2.1.4 RAM-易失性存储器2.1.6 ...

    存储系统总述:
    在这里插入图片描述

    1 主存简单模型及寻址的概念

    1.1 主存储器

    在这里插入图片描述

    存储体负责存储具体的二进制位
    地址寄存器接收外部功能部件传到存储器的地址
    数据寄存器暂存要传出去或传进来的数据信号
    存储体、地址寄存器、数据寄存器在一个时序控制逻辑的控制下协调工作

    1.1.1 存储器芯片的基本结构

    在这里插入图片描述

    1. 存储矩阵:由大量相同的位存储单元阵列构成。
    2. 译码驱动:将来自地址总线的地址信号翻译成对应存储单元的选通信号,该信号在读写电路的配合下完成对被选中单元的读/写操作。
    3. 读写电路:包括读出放大器和写入电路,用来完成读/写操作。
    4. 读/写控制线:决定芯片进行读/写操作。
    5. 片选线:确定哪个存储芯片被选中。可用于容量扩充。
    6. 地址线:是单向输入的,其位数与存储字的个数有关。
    7. 数据线:是双向的,其位数与读出或写入的数据位数有关。
    8. 数据线数和地址线数共同反映存储芯片容量的大小

    如地址线10根,数据线8根,则芯片容量=210×8=8K位。

    n位地址一>2n个存储单元总容量=存储单元个数×存储字长

    =23×8bit=23×1Byte=8B

    8×8位的存储芯片

    常见的描述:

    8K×8位,即213×8 bit = 8 KB 地址线13根,数据线8根
    8K×1位,即213×1 bit = 8 Kb=1 KB
    64K×16位,即216×16 bit

    1.1.2 寻址

    在这里插入图片描述

    2 半导体存储器

    2.1 半导体随机存取存储器

    在这里插入图片描述

    2.1.1 DRAM的刷新
    1. 多久需要刷新一次?刷新周期:一般为2ms
    2. 每次刷新多少存储单元?以行为单位,每次刷新一行存储单元
      ——为什么要用行列地址?
      减少选通线的数量

    在这里插入图片描述

    行列地址:行地址决定存储单元在哪一行,列地址决定存储单元在那一列,行列交叉即可得存储单元位置
    地址0000,0000 对应行地址0000,列地址0000,选中(0,0)号存储单元(8位二进制,行4位,列4位)

    1. 如何刷新?有硬件支持,读出一行的信息后重新写入,占用1个读/写周期
    2. 在什么时刻刷新?
      假设DRAM内部结构排列成128×128的形式,读/写周期(存储周期)0.5us
      2ms共2ms/0.5us=4000个周期

    在这里插入图片描述

    2.1.2 SRAM的读周期

    在这里插入图片描述

    2.1.3 SRAM的写周期

    在这里插入图片描述

    2.1.4 RAM-易失性存储器

    在这里插入图片描述

    2.2 ROM

    在这里插入图片描述

    用RAM做主存,一旦断电,内容全部丢失,ROM掉电之后,内容不会丢失,而且ROM可以直接跟CPU通信
    用ROM存储一些开机之后必要的信息,而更详细的、正在运行的程序的数据放在RAM中

    2.2.1 ROM分类

    在这里插入图片描述

    2.2.2 半导体随机存储器小结

    在这里插入图片描述

    3 存储器分类

    在这里插入图片描述
    按特点和使用方法的不同,可以分为以下几类:
    在这里插入图片描述

    3.1 存储器的性能指标

    1. 存储容量:存储字数×字长(如1M×8位)。 存放的二进制位数或字(字节)数
    2. 单位成本:每位价格=总成本/总容量。
    3. 存储速度:数据传输率=数据的宽度/存储周期。
      在这里插入图片描述
    1. 存取时间(Ta):存取时间是指从启动一次存储器操作到完成该操作所经历的时间,分为读出时间和写入时间。
    2. 存取周期(Tm):存取周期又称为读写周期或访问周期。它是指存储器进行一次完整的读写操作所需的全部时间,即连续两次独立地访问存储器操作(读或写操作)之间所需的最小时间间隔。
    3. 主存带宽(Bm):主存带宽又称数据传输率,表示每秒从主存进出信息的最大数量,单位为字/秒、字节/秒(B/s)或位/秒(b/s)。

    3.2 存储器的层次化结构

    在这里插入图片描述

    3.3 存储器概念小结

    在这里插入图片描述

    4 主存与CPU的连接

    4.1 主存容量扩展-位扩展

    CPU数据线数与存储芯片的数据位数不相等时,此时必须对存储芯片扩位,增加存储字长,使其数据位数与CPU的数据线数相等
    在这里插入图片描述
    8Kx1位芯片说明

    1根数据线D0
    13根数据线A0~A12
    片选线 CS: 高电平有效, 收到1工作,收到 0 不工作
    读写控制线 WE :高电平有效

    位扩展:
    在这里插入图片描述

    4.2 主存容量扩展-字扩展

    增加存储器芯片中字的数量,位数不变

    方案1:在这里插入图片描述
    当两个芯片CS同为1时,无法进行正常读写,两位存储器芯片可能冲突

    方案2:使用地址线控制片选信号
    在这里插入图片描述

    方案3:使用非门控制片选信号
    在这里插入图片描述

    译码器:
    在这里插入图片描述
    译码器左边101对应5(A低位,C高位),则右边Y5置1
    在这里插入图片描述

    在这里插入图片描述
    片选信号区分芯片地址范围:

    • A13A14为00时,译码器对应0号线有效,其余皆无效,选中0号芯片,
      地址范围:00,0…00~00,1…11
    • A13A14为01时,译码器对应1号线有效,其余皆无效,选中1号芯片,
      地址范围:01,0…00~01,1…11
    • A13A14为10时,译码器对应0号线有效,其余皆无效,选中2号芯片,
      地址范围:10,0…00~10,1…11
    • A13A14为11时,译码器对应0号线有效,其余皆无效,选中3号芯片,
      地址范围:11,0…00~11,1…11

    特殊情况:在这里插入图片描述

    • A13A15为00时,译码器对应0号线有效,其余皆无效,选中0号芯片 , A14不用管,取0取1无影响

    在这里插入图片描述

    4.3 主存容量扩展-字位同时扩展

    816Kx4位的芯片组成64Kx8位的存储器:

    • 每两片构成一组16Kx8位的存储器(位扩展)
    • 4组构成64Kx8位存储器(字扩展)
    • 地址线 A15A14经 2/4译码器得到4个片选信号
    • A15A14=00时,输出端0有效,选中第一组芯片(①②)
    • A15A14=01时,输出端1有效,选中第二组芯片(③④)在这里插入图片描述

    4.4 字位扩展实例

    在这里插入图片描述

    解题步骤:在这里插入图片描述

    数据线:CPU数据线8根→存储器位数应扩展为8位,如果没有8位的芯片,应选择低位扩展到8位
    地址线:首先确定内存空间的分配

    在这里插入图片描述

    • 67FFH-6000H+1=7FFH+1=800H 表示800H地址空间内有2K个存储单元,每个存储单元8位,则存储容量2KB
    • 6BFFH-6800H+1=3FFH+1=400H(B:11,11-8=3)

    分析地址线如何跟CPU之间进行连接:把地址空间写成二进制形式

    总的地址线16根,而ROM 11根,RAM 10根,把低地址位位直接相连,剩下的高位作为选片信号

    • 3/8译码器:在剩下的地址位中选三位做片选信号,选取原则:以低位占用最多的存储为准,向它高位选三位,用此三位做3/8译码器的输入。即100时选中ROM,101选中RAM
    • 剩下的01做译码器使能端(使能端刚好需要一个1和0),最后的一个端口连MREQ,决定译码器是否工作。而MREQ是低电平有效,只能连0,不可以连1,是译码器开关

    在这里插入图片描述

    说明

    低10位 A0~A9直接连到每一块存储器芯片;
    ROM需要11位地址线。把A10直接连到ROM;
    CBA 刚好直接用,100对应Y4,连到ROM;
    ROM 不仅要求 CBA 101 对应Y5,还要求第10位地址必须是0才可以选通;
    在这里插入图片描述
    A10=0 表示A10经过一个非得1,Y5非为0,经过一个非得1,将两个1与一下,即得RAM的选通信号,非作用就是低电平有效;
    A14A151 0 充当译码器使能端信号,A14连上1,A15连上0;
    MREQ 是低电平有效,接最后一个使能端;
    数据线 ROM 8 位直接连CPU数据线;
    RAM 经过扩展了,一个连低四位,另外一个连高四位;
    最后读写控制线WR的连接,只有RAM需要直接连接CPU的读写控制线,ROM读写控制线是一个静态状态,直接给一个固定信号,题意要求低电平有效,所以可以直接连接地面。

    5 双口RAM多模块存储器

    为了提高CPU访问存储器的工作速度

    5.1 双端口RAM

    双口RAM空间上并行,当两个端口地址不相同时,在两个端口上读写一定不会冲突
    在这里插入图片描述
    两个端口对同一主存操作有以下4种情况:

    1. 两个端口不同时对同一地址单元存取数据。没有问题
    2. 两个端口同时对同一地址单元读出数据。没有问题
    3. 两个端口同时对同一地址单元写入数据。可能写入错误
    4. 两个端口同时对同一地址单元,一个写入数据,另一个读出数据。可能读出错误

    解决方法:置“忙”信号为0,由判断逻辑决定暂时关闭一个端口(即被延时),未被关闭的端口正常访问,被关闭的端口延长一个很短的时间段后再访问。
    在这里插入图片描述

    5.2 多模块存储器

    5.2.1 单体多字存储器和多体并行存储器

    在这里插入图片描述

    5.2.2 多体并行存储器工作模式

    多体并行存储器工作模式依赖于地址的设置方式

    在这里插入图片描述
    高位交叉编址的多体存储器:体号在前体内地址在后,地址的高位决定现在访问的是哪个体,低位决定访问体内的哪一块单元

    在这里插入图片描述
    低位交叉编址的多体存储器:体号在后体内地址在前,地址的低位决定现在访问的是哪个体,高位决定访问体内的哪一块单元

    在这里插入图片描述
    高位交叉编址的多体存储器:由上往下编,每个存储体地址的高位一致,对应存储体下标,如00对应M0
    低位交叉编址的多体存储器:由左往右编,每个存储体地址的低位一致,对应存储体下标,如01对应M1

    5.2.3 流水线

    微观(计算题)

    模块数m=4,存储周期为T,字长W,数据总线宽度为w,总线传输周期为r,连续存取n个字,求交叉存储器的带宽。

    上面题目对应:有m个存储体,存储周期为T,字长W,每隔r时间启动下一个存储体,连续存取n个字,求存储器的存取速率。

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

    宏观(概念题)

    一个存储周期内,交叉存储器可以提供的数据量为单个模块的m倍。

    展开全文
  • 寄存器存储器

    万次阅读 多人点赞 2018-04-12 12:43:48
    2、存储器包括寄存器, 存储器有ROM和RAM 三、寄存器 简介 寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。在中央处理器的控制部件中,包含...
  • 寄存器存储器

    2018-08-15 21:09:00
    内存和寄存器就是为了解决存储器读写速度慢而产生的多级存储机制,从20世纪50年代开始,磁芯存储器曾一度成为主存的主要存储介质,但从20世纪70年代开始,逐步被半导体存储器所取代,目前的计算机都是用半导体存储器...
  • 80X86寄存器存储器结构介绍 讲的很清晰
  • 寄存器存储器物理区别

    千次阅读 2018-11-07 14:14:25
    从根本上讲,寄存器存储器RAM的元件不一样???? memory is equivalent to a lot of registers. 寄存器存在于CPU中,速度很快,但是所占面积大,数目有限; 存储器就是内存,速度稍慢,所占面积小,但数量很大...
  • 寄存器存储器

    2019-08-10 17:55:14
    2、存储器包括寄存器,   存储器有ROM和RAM     三、寄存器   简介 寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。在中央处理器的...
  • 寄存器 内存 存储器

    2015-07-14 10:47:00
    寄存器(又称缓存)一般是指由基本的RS触发器结构衍生出来的D触发,就是一些与非门构成的结构,一般整合在CPU内,其读写速度跟CPU的运行速度基本匹配,但因为性能优越,所以造价昂贵,一般好的CPU也就只有几MB的2级...
  • 一般情况下,内核线程中的简单局部变量都在寄存器存储器中。 局部存储器 对于每个线程,局部存储器也是私有的,如果寄存器被消耗完,数据将被存储在局部存储其中。如果每个线程使用了过多的寄存器,或声明了大型...
  • 内部寄存器类型含14个16位寄存器,按功能可分为3类:8个通用寄存器;4个段寄存器;2个控制寄存器。1 通用寄存器①数据寄存器(AX,BX,CX,DX);8088/8086含4个16位数据寄存器,又可分为8个8位寄存器,即:数据寄存器...
  • 1、存储器功能: 存放指令和数据,并能由...寄存器的速度比主存储器的速度要快很多,由于寄存器的容量有限,所以将不需要操作的数据存放在主存储器中,主存储器中的数据必须放入寄存器材能够进行操作。 简单地说...
  • 内存和寄存器就是为了解决存储器读写速度慢而产生的多级存储机制,从20世纪50年代开始,磁芯存储器曾一度成为主存的主要存储介质,但从20世纪70年代开始,逐步被半导体存储器所取代,目前的计算机都是用半导体存储器...
  • 1.汇编语言将计算机硬件抽象成为了:寄存器存储器地址,输入输出地址。 2.寄存器是处理器内部的告诉存储单元,用于暂时存放程序执行过程中的代码和数据。 3.透明寄存器:对应用人员不可见,不能变成直接控制。 ...
  • 详细介绍了寄存器存储器、COACH的定义,并加以说明如何区别,记忆!
  • 前言在linux日常过开发调试中,总避免不了和CPU寄存器、堆栈打交道,尤其是在分析程序core dump文件时,需要对CPU寄存器过程调用约定有深入的理解。本文主要介绍x86和x86_64平台的通用寄存器,以及他们在过程调用中...
  • 一条指令包括大部分的状态位、功能控制位,和四位的十六进制表示的共32位存储空间寄存器。每个寄存器都穿插在指令当中并且是连续的四位,每一位下都有一个字节共四个字节。这也是为什么ARM有15个通用的寄存器。 一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,577
精华内容 3,030
关键字:

寄存器存储器