【Day9】:STM32记忆体架构

前言

从今天开始的3天,我们会以更底层的角度来了解单晶片的架构,若只是要会使用STM32可以暂时先略过

为什麽不取 STM31 STM33?

接触STM32到现在,是不是还不清楚为什麽他叫STM32而不是STM31或STM33呢?那是因为STM32的CPU为Cortex-M4,由ARM设计,而这个CPU为32位元的处理器。那什麽是32位元的处理器呢?

首先介绍两个常见的名词,位(bit)与位元组(byte)。bit是内部资料储存的最小单位,状态就只有0、1两种。而我们通常不会只处理一个位元,计算机中资料的处理基本单位为位元组,1byte = 8bit。再来这个可能比较少人听过:字(word),计算机进行资料处理时,一次处理、传送的长度称为字。更具体一点的来说,CPU与各单元、周边设备沟通时是使用排线所组成的汇流排(bus),而32位元处理器就是有32个排线所组成的汇流排(32称为汇流排宽度,也就是1个word的大小),一次4bytes的资料。

刚刚所说的汇流排更详细的说应称为资料汇流排(data bus),而还有另一种汇流排为位址汇流排(address bus),一个处理器宽度为32的汇流排,可定址的大小为2^32,也就是4GB。而一般资料汇流排的大小与位址汇流排的大小是相同的。因此STM32可以定址的大小最大为4GB,若我们以十六进位表示则为0x00000000~0xFFFFFFFF(0x表示以16进位表示法表示)
定址在了解底下记忆体映射之後会比较好理解

而一般来说资料汇流排为双向的,CPU可以传送资料给记忆体(写入),记忆体也可以传送资料给CPU(读取),而位址汇流排为单向,通常只要CPU告诉记忆体你现在所要操作的记忆体位址即可
https://ithelp.ithome.com.tw/upload/images/20210906/20141525xMsZgmDtKM.png

记忆体映射

记忆体本身是没有位址的,记忆体内部就只是一堆半导体元件(AND、OR逻辑闸等),就好像一个社区,里面有很多栋房子,起初这些房子是没有门牌的,且每一栋房子都长一样,後来才按照顺序的帮它编号。实际上我们就是利用32条线所组成的位址汇流排,每一根线的电位高低不同来为记忆体编号,於是每个记忆体也就有了所谓的地址。

这里所说的映射与数学上的映射道理是相同的。在集合论当中,若A中的任一元素x,依照某种规律,必有B中唯一确定的元素与y对应,则称f是一个从A到B的映射
https://ithelp.ithome.com.tw/upload/images/20210907/20141525CzmW9eMyVb.jpg
但要强调的是32的意思是最大可以定址的大小为32bytes,并不代表有这麽大的记忆体,继续以社区来做举例,我们可以从1编号到1000,但可能只有其中的1~100、301~400是有对应到房子的。另外稍微想一下,一般笔电差不多是8G的记忆体,如果一个单晶片上有4G的记忆体,那岂不是都快跟电脑一样了。

STM32记忆体区域功能划分

那既然没有这麽大的记忆体,那为什麽我们需要定址到这麽大呢?因为我们并不想让所有的记忆体位址全部连在一起,通常我们会做初步的分类,如下图:
https://ithelp.ithome.com.tw/upload/images/20210907/201415252VAu7IeGv8.jpg
上面的图称为记忆体图(memory map),在这4GB的地址空间中,大致被分为8块(Block),每块的大小都有512MB,这还是相当大的,一般只用其中的一小部分。

序号 用途 地址范围
Block0 SRAM 0x0000 0000 ~ 0x1FFF FFFF(512MB)
Block1 SRAM 0x2000 0000 ~ 0x3FFF FFFF(512MB)
Block2 单晶片上外设 0x4000 0000 ~ 0x5FFF FFFF(512MB)
Block3 FMC 0x6000 0000 ~ 0x7FFF FFFF(512MB)
Block4 FMC 0x8000 0000 ~ 0x9FFF FFFF(512MB)
Block5 FMC 0xA000 0000 ~ 0xBFFF FFFF(512MB)
Block6 FMC 0xC000 0000 ~ 0xDFFF FFFF(512MB)
Block7 Cortex-M4 内部外设 0xE000 0000 ~ 0xFFFF FFFF(512MB)

我们对STM32的记忆体掌握大致分成两个,分别是快闪记忆体,简称Flash,与静态随机储存记忆体,简称SRAM,这两种记忆体的特性不同,Flash在没有电源时资料仍然能储存,这也是我们程序存放的位置(想像我们在做机器人的时候,并不需要每次都上传程序码,即使没有电源,Flash仍会记得上次上传的程序),而SRAM则是关电会导致资料不见(具有挥发性)。

  1. 在记忆体图我们可以看到Flash的地址范围是从0x0800 0000 ~ 0x081F FFFF,而不同型号的单晶片Flash的大小不同,但起始位址都是0x0800 0000,而终点位址则要根据Flash的大小。以F429ZI这块板子来说,它的Flash大小为2MB,恰好把所有的位址全部用完(也是STM32所有类型的板子中Flash大小最大的,因为再大也没有编号给它继续编下去了,所以不可能有更大的Flash)。
  2. F429内部SRAM的大小为256KB,其中64KB位於Block0 的0x1000 0000 ~ 0x1000FFFF ,剩下的192KB位於Block1,分为SRAM1 112KB、SRAM2 16KB、SRAM3 64KB。
  3. Block2用於设计单晶片上的外设(後面会在更详细的介绍外设),例如管理脚位(脚位就是一种外设)输出是高电位还是低电位的设定的记忆体就是存放在这里。根据外设汇流排传输速度的不同分为APB与AHB,而APB又分成APB1与APB2;AHB分为AHB1与AHB2。而实际的存放这些资料的记忆体通常为SDRAM、NORFlash、NANDFlash。
    我们之後在做的任何设定,例如脚位要做高电位输出还是低电位输出都是在更动这个地方的记忆体
用途说明 地址范围
APB1外设 0x4000 0000 ~ 0x4000 7FFF(32KB)
预留 0x4000 8000 ~ 0x4000 FFFF
APB2外设 0x4001 0000 ~ 0x4001 6BFF(~27KB)
预留 0x4001 6C00 ~ 0x4000 7FFF
AHB1外设 0x4002 0000 ~ 0x4007 FFFF(~384KB)
预留 0x4008 0000 ~ 0x4FFF FFFF
AHB2外设 0x5000 0000 ~ 0x5006 0BFF(~387KB)
预留 0x5006 0C00 ~ 0x 5FFF FFFF

小结

今天大致介绍了STM32记忆体的架构,以及记忆体映射的概念,明天开始我们就要来真正的探究这些记忆体是如何存放资料决定GPIO是输入还是输出、输出高电位还是低电位...各种设定。也会引入暂存器的概念。今天的内容实在是不容易,我在撰写的时候也查阅了大量的书籍以及资料,内容若是有误,再请各位指正。

资料来源

  1. https://blog.csdn.net/n664500560/article/details/69485551

<<:  [Day 10] Sass - Values

>>:  [iT铁人赛Day23]练习题(2)

建立第一个单元测试(golang)-1(Day20)

当我们建立起最简单的RESTful api後,接下来我们就要将测试也放到我们的程序中了 在golan...

11.unity地图障碍物(Tilemap Collider 2D)

结合前几天学到的东西,可以来制作地图障碍物并且在地图内奔跑! 地图障碍物 1.画一张纯障碍物的Til...

前端工程学习日记第二天

11/2复习 HTML中插入CSS tab可以用快速插入 h1{color: blue;font-s...

Day9 Pandas模组一

今天的影片内容为介绍具有强大功能的Pandas模组(对...熊猫模组) 利用这个模组,可以很方便的执...

DAY3 [从游戏带起兴趣-2]

第三天记录一样让大家从游戏中探索,最基本好理解的游戏,是帮助上手的好方法,但会相较昨天困难点喔。
 ...