首页 > 其他分享 >stm32f103-2023-10-03

stm32f103-2023-10-03

时间:2023-10-03 22:45:30浏览次数:40  
标签:stm32f103 10 字节 03 外部 存储器 HADDR 地址 CPU

这是当时在“某知道”上自己的一篇原创回答,由于某些原因目前个人在该平台上的所有回答或隐藏或清空了,现经删整之后收纳回本人博客。

======================================================================================

问题链接:https://zhidao.baidu.com/question/1604602410308497067.html

我猜,来到这个问题底下的我们,疑问估计都是相同的,那就是为什么HADDR[0]未接?一般不是都一对一连接的吗?怎么到了这里它就不能了呢?这越想越觉得这种接线方法太反常理了。。。对不对?

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

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

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

然后,到了FSMC_A一端,人们选择性地去掉HADDR[0],然后才把把剩余的25根依次接到FSMC_A上(人们之所以这么做,正是因为他们发现了一个规律,那就是,通过HADDR[1]是0还是1却正好能够区别外部存储器上的0地址和1地址,而通过HADDR[2]和HADDR[1]是10还是11又正好能够区别外部存储器上的2地址和3地址。。。依此类推,下一个就是通过HADDR[3]HADDR[2]和HADDR[1]一起来判断)

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

 ======================================================================================

今日突然想起写这个回答的时候只是解决了这个问题的最关键又最重要的部分,如果比较细心的读者会发现,其实这个问题还存在着一个值得大家思索的小问题,细分来思考的话,就有了如下一些子问题:那就是HADDR的线数只有HADDR[0~25]吗?(其实不是的,而是有HADR[0~27]),那么另外这两根跑哪去了呢?还有就是为什么一定要HADDR[25]以下那么多根线呢?少用一些不行么(譬如只用8根、16根)?

 ======================================================================================

下图则是我自己的理解(实质上,这个图是理解ARM平台四字节对齐问题的关键,但看到这里,你也会发现,其实这个能困扰大部分人的难题它的原理和上面的原理并无二致):

 

标签:stm32f103,10,字节,03,外部,存储器,HADDR,地址,CPU
From: https://www.cnblogs.com/weizhunie/p/17741744.html

相关文章

  • 10.3 请求
    packagecom.example.springboottest;importorg.apache.catalina.User;importorg.springframework.format.annotation.DateTimeFormat;importorg.springframework.web.bind.annotation.*;importpojo.user;importjava.lang.reflect.Array;importjava.time.LocalD......
  • AtCoder Grand Contest 036 F Square Constraints
    洛谷传送门AtCoder传送门本质是\(p_i\in[l_i,r_i]\)的计数问题。当\(1\lei\len\)时,\(l_i\)才可能不等于\(1\)。考虑容斥,设钦定\(m\)个不满足条件(上界为\(l_i-1\)),其余任意(上界为\(r_i\))。然后按照上界排序后dp,设\(f_{i,j}\)为考虑前\(i\)个元素,已经......
  • 202310032035_《近期撸码心得》
    如图,循环依赖一直搞糊涂我,本来,mybatis就是因sql操作灵活性而采用,无可厚非,对于新手的我,一是项目需要,而是为求职职场操练,但“请君入问”感是还要配“mybatis-generator”plugin,为了自动嘛。但是,我觉得这插件与Lombok某些生成代码严重重复......直到修修补补,到上图“推荐重新设......
  • 洛谷P5303
    这一道题跟NOIP集训模拟赛1的D题非常像,当然D题的递推方程更复杂(磁盘里面有题解pdf)对于这一道题,我们设f[i][0]表示铺了i列而且全部用的完整的砖的方案数f[i][1]表示铺了i列,但是第i列缺了一个而且第i列的唯一的那一块砖头就是1X1其中一个f[i][2]表示铺了i列,但是第i列缺了一个而且......
  • 2023.10.3——每日总结
    学习所花时间(包括上课):0h代码量(行):0行博客量(篇):1篇今天,上午学习+休息,下午学习+休息;我了解到的知识点:1.Vue2.终于有一段较长且不被打扰的时间,系统的学习一下JavaWeb,以https://www.bilibili.com/video/BV1m84y1w7Tb为准;明日计划:学习+休息......
  • 2023.10.3日报
    npminstallvue-router@3---用于vue2npminstallvue-router@4---用于vue3vue-router主要是用于跳转<template><!--<divid="app">--><!--<imgalt="Vuelogo"src="./assets/logo.png">--><!--<......
  • 10.0 探索API调试事件原理
    本章笔者将通过Windows平台下自带的调试API接口实现对特定进程的动态转存功能,首先简单介绍一下关于调试事件的相关信息,调试事件的建立需要依赖于DEBUG_EVENT这个特有的数据结构,该结构用于向调试器报告调试事件。当一个程序发生异常事件或者被调试器附加时,就会产生对应的DEBUG_EVENT......
  • 03-共阳极数码管的静态显示
    共阳数码管的静态显示由电路图可知此为共阳数码管#include<REGX52.H>unsignedintcodenum[16]={ 0xc0, //011000000 0xf9,//111111001abged为0 0xa4,//210100100 0xb0,//3 0x99,//4 0x92,//5 0x......
  • stata 18 显示r603 不能安装外部命令 主要是设置文件夹的读写权限
    1.stata18安装位置的ado文件夹中新建plus personal ......
  • 梦断代码阅读笔记03
    1、程序员与用户的交涉读这本书,发现其实这个团队也有过交工的时候,只是仅仅在项目成员满意的情况下,而没有达到用户的预期,也就是二者沟通不充分,程序员本身并没有真正了解到用户的需求,只是按照自己认为的行事,导致了期望之间的偏差,也造成了工作量的加大,和项目的返工;这也和王老师之......