重点分析 STM32 和 GD32 中的启动方式
注意:正在撰写。。。
在单片机中,程序的运行方式总的可以分为两种,一种是直接在存储介质中运行,另一种是将代码加载到内存中运行。
首先来分析第一种,直接在存储介质中运行。这里的存储介质可以是单片机的内部 Flash,也可以是外拓的程序存储器和 QSPI Flash。在这种模式下,CPU 实时从存储介质中读取指令,并运行。
以这种模式运行的单片机有经典 51 单片机,以 STC12C5A60S2 为例。STC12C5A60S2 的系统框图如下所示,可以看到,微处理器内部有专门的程序存储器(Flash),这个 Flash 直接连到了系统总线上,CPU 可以直接从 Flash 中获取指令,也就是直接在 Flash 上运行。同时 STC12C5A60S2 也支持外拓程序存储器和 SRAM,存储在外拓程序存储器上的代码也可以直接运行。

中低端的 STM32 和 GD32 芯片,处理器内部集成了 Flash,用于程序存储,CPU 可以直接执行 Flash 中的代码。STM32F103RCT6 的内部结构框图如下所示。相比于 51 单片机,STM32 和 GD32 内部存储器采用了统一编址,内部 Flash、SRAM 和外设寄存器统一分配到了 0~4GB 的地址线上,每个存储单元都有唯一对应的地址,这使得 CPU 的寻址异常方便。

一般,单片机的内部 Flash 很小。像大名鼎鼎的 STM32F429IGT6,其内部 Flash 不过也才 1MB。有的时候,确实需要一个比较大的 Flash,例如程序中内嵌了比较多的图片和音频数据。这时候可以选用 GD32W5/GD32W51x,这类单片机支持在 QSPI Flash 中运行代码。QSPI 协议只需要六根线,就能轻松拓展几十兆甚至 4GB 的内存空间。
现在来分析第二种,将代码加载到内存中运行。这种模式在常常应用在高端处理器中。这里的内存,可以是内部 SRAM、外拓 SRAM、SDRAM、DRAM、DDR 等。
一般来说,Flash 的访问速度比 RAM 慢得多。
CY7C68013A-56LTXC 是一颗 USB3.0 芯片,专门用于单片机与电脑端的高速数据传输。CY7C68013A-56LTXC 内部使用了 8051 内核,为了高效处理数据,提高芯片性能,这颗 CPU 选择将 Flash 中的程序加载到 SRAM 中运行。因为访问 SRAM 比访问 Flash 的速度快,所以性能也提升了不少。
还有像 RK3288、RK3399 和 IMX6ULL 等,这些处理器是用来运行 Linux、Android 等操作系统的,本身的性能比较强悍,主频很高。这类处理器内部本身没有用于存储用户程序的 Flash,必须要外接拓展的存储器,可以是 SD 卡、EMMC 和 Nand Flash 等。在芯片启动的一瞬间,处理器会将程序从这些存储器加载到内存中,然后在内存中运行程序。因为所有的读写都是在内存中运行的,速度非常快,而且外拓的内存通常可以达到好几个GB,甚至几十GB,所以可以跑复杂的大型操作系统。