zoukankan      html  css  js  c++  java
  • FSMC HADDR和FSMC_A对应的问题

    问题:

    当外部存储器是8位数据宽度时, HADDR[25:0]与FSMC_A[25:0]对应相连

    当外部存储器是16位数据宽度时,HADDR[25:1]与FSMC_A[24:0]对应相连,HADDR[0]未接

    原因:

    首先,CPU中一个地址只能存储一个字节的数据,而当CPU通过地址线访问外部存储器的一个地址时,如果外部储存器的一个地址的数据刚好是八位时(即一个字节),访问一次就可接收过来;但是,当外部存储器的一个地址里存的是16位数据时(即两个字节),CPU就开始傻眼了,“我访问你一次,你竟然给我两个字节的数据!!!”(如下图所示)

     

    然后,CPU为了解决这个问题,只能够再派一个地址去访问外部存储器的同一个地址,把剩下的那个字节也接收过来,之后再接着访问外部存储器的第二个地址,依此类推。。。在此过程中,CPU如果还是把地址线一对一地连接到外部存储器上,那就做不到让自己的第二个地址还继续访问同一个地址了。。。

    于是,人们帮了CPU一把,让它每一回访问时还是照旧把自己内部的地址按二进制拆分放到HADDR的0~25上(如下图)

     

    由图片红色部分可知,如读取外部存储器地址0中的#a、#b数据,CPU先发送地址0、再发送地址1。站在CPU的角度,它以为自己发送了两个不一样的地址(地址0、地址1)到外部存储器,然后,到了FSMC_A一端,人们选择性地去掉HADDR[0],然后才把把剩余的25根依次接到FSMC_A上。然而对于外部存储器来说,它只收到读地址0的数据,所以外部存储器就把#a、#b的数据返回给CPU。即对于16位数据宽度的外部存储器来说,因为CPU一个地址存储1个字节数据,外部16位数据宽度存储器1个地址存储2个字节数据,所以CPU的地址0、1对应外部存储器的地址0,地址2、3对应外部存储器的地址1,以此类推。

    在CPU那边,它对人们把HADDR[0]不接到FSMC上是不知情的,所以,它还是照旧把地址逐次增一地去访问,也还是发出一个地址读回一个字节,但是它不知道的是,自己每发两个地址都会停留在外部存储器的同一个地址上,所以最终,同一个地址上的两个字节都会被CPU读走。。。

     文章参考自:STM32 FSMC HADDR和FSMC_A对应的问题_百度知道 (baidu.com)

  • 相关阅读:
    Flex 布局教程:语法篇(转载)
    【Go】【Http】Go实现Http相关知识点
    【Git】Git相关开发流程
    【Go】杂七杂八GoLang
    【Go】初识Context与Context键值对的可能情况
    jmeter-通过json提取器 提取所有数据 给下个接口使用
    C# 后台调用存储过程超时处理方法,
    IE11脚本错误-调用的对象无效-
    IE11浏览器arrt,全选反选失效无效修改方法
    如何学习计算机知识
  • 原文地址:https://www.cnblogs.com/yeshenmeng/p/15597980.html
Copyright © 2011-2022 走看看