从今天开始的3天,我们会以更底层的角度来了解单晶片的架构,若只是要会使用STM32可以暂时先略过
接触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告诉记忆体你现在所要操作的记忆体位址即可
记忆体本身是没有位址的,记忆体内部就只是一堆半导体元件(AND、OR逻辑闸等),就好像一个社区,里面有很多栋房子,起初这些房子是没有门牌的,且每一栋房子都长一样,後来才按照顺序的帮它编号。实际上我们就是利用32条线所组成的位址汇流排,每一根线的电位高低不同来为记忆体编号,於是每个记忆体也就有了所谓的地址。
这里所说的映射与数学上的映射道理是相同的。在集合论当中,若A中的任一元素x,依照某种规律,必有B中唯一确定的元素与y对应,则称f是一个从A到B的映射
但要强调的是32的意思是最大可以定址的大小为32bytes,并不代表有这麽大的记忆体,继续以社区来做举例,我们可以从1编号到1000,但可能只有其中的1~100、301~400是有对应到房子的。另外稍微想一下,一般笔电差不多是8G的记忆体,如果一个单晶片上有4G的记忆体,那岂不是都快跟电脑一样了。
那既然没有这麽大的记忆体,那为什麽我们需要定址到这麽大呢?因为我们并不想让所有的记忆体位址全部连在一起,通常我们会做初步的分类,如下图:
上面的图称为记忆体图(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则是关电会导致资料不见(具有挥发性)。
用途说明 | 地址范围 |
---|---|
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是输入还是输出、输出高电位还是低电位...各种设定。也会引入暂存器的概念。今天的内容实在是不容易,我在撰写的时候也查阅了大量的书籍以及资料,内容若是有误,再请各位指正。
当我们建立起最简单的RESTful api後,接下来我们就要将测试也放到我们的程序中了 在golan...
结合前几天学到的东西,可以来制作地图障碍物并且在地图内奔跑! 地图障碍物 1.画一张纯障碍物的Til...
11/2复习 HTML中插入CSS tab可以用快速插入 h1{color: blue;font-s...
今天的影片内容为介绍具有强大功能的Pandas模组(对...熊猫模组) 利用这个模组,可以很方便的执...
第三天记录一样让大家从游戏中探索,最基本好理解的游戏,是帮助上手的好方法,但会相较昨天困难点喔。 ...