zoukankan      html  css  js  c++  java
  • 地址,数据位的一些理解:战舰板子

    关于STM32映射地址空间,以及战舰板子的外加SRAM地址等有些不解,论坛和原子讨论了一下,稍微明白了一些,记录在此,不一定正确

    http://openedv.com/posts/list/0/13394.htm?privmsg=1#73668

    原子哥,还有一个小问题,也是关于地址的,在手册4.6节,讲MDK中地址映射,两个相邻寄存器之间的偏移都是0X04,这是因为寄存器都是32位,32/8=4byte么?


    在sram中地址都是偏移0x01,这是因为512k*16位=1MB,我们寻址时候只寻址512k的数据量。而上面寄存器映射的寻址如果也是1MB空间,我们就相当于寻址1MB的数据量。


    这样理解对么?

    里是因为SRAM用了FSMC的UB/LB信号,控制字节高地位了。

    因为SRAM是16位的,当你要读写8位数据的时候,UB/LB就发挥作用了,比如在SRAM的地址0写入1个8位的字节,那么LB会输出有效,而UB则保持不变(高电平),表示写入地址0的低8位,写法就是:

    *(vu8*)(Bank1_SRAM3_ADDR+0)=0Xaa;//0XAA是你想写入的字节。

    而如果要在SRAM地址0写入高8位,那么对于STM32来说,地址就相应加1即可,即:

    *(vu8*)(Bank1_SRAM3_ADDR+1)=0XAA;

    此时LB会输出高电平,UB会输出有效电平(低电平),表示写入地址0,的高字节。

    这样,对STM32来说,地址就是连续的了,0,1,2,3,4,5,都是合法的了,自然就不需要你的地址右移对齐了,硬件通过UB/LB去控制了。


    回复【3楼】 wwjdwy :
    ---------------------------------
    32位就是占4字节的。

    1,地址映射里的地址偏移每个寄存器都是便宜0x04,是因为每个寄存器32位四字节。

    2,那我的SRAM要在地址1写入呢?写入地址1的低字节就是*(vu8*)(Bank1_SRAM3_ADDR+2),写入地址1的高字节就是*(vu8*)(Bank1_SRAM3_ADDR+3)???

    一次写入一个16位的数据呢?

    回复【6楼】 正点原子 :
    ---------------------------------

    那写入的是8位数据,就相当于把地址从512k变成了1M,可以连续的写地址0,1,2,3,。。。。,512,。。。。1023,1024

    写入16位数据时候,地址0,2,4,6,8,10.....512,。。。。1024。也就可以理解为0,1,2,3.。。512连续地址左移一位变成了0,2,4,6,8,.....512,。。。。1024


    那这个地址+1或者+2要根据写入数据是8位还是16位来确定喽?


    void FSMC_SRAM_WriteBuffer(u8* pBuffer,u32 WriteAddr,u32 n)
    {

    for(;n!=0;n--)  
    {              

      *(vu8*)(Bank1_SRAM3_ADDR+WriteAddr)=*pBuffer;   

      WriteAddr+=2;//这里需要加2,是因为STM32的FSMC地址右移一位对其.加2相当于加1.
      pBuffer++;

    }   
    }

    这里u8* pBuffer,所以WriteAddr++才对,是这么理解吧

    其实两个寻址一个意思,只是一个寄存器32位,一个是8或16位。一个地址加数据,一个只是地址。真是悟,不知道对不对

  • 相关阅读:
    获取服务结合随机算法
    服务发现
    使用第三方库来支持平滑重启
    简易配置中心Confd入手
    8、SQL基础整理(约束)
    7、SQL基础整理(子查询)
    6、SQL基础整理(日期时间数据类型,转换函数)
    5、SQL基础整理(字符串函数)
    4、SQL基础整理(规范函数)
    3、SQL基础整理(分组)
  • 原文地址:https://www.cnblogs.com/wwjdwy/p/2984022.html
Copyright © 2011-2022 走看看