之前做一个单片机项目,在选型时需要考虑Flash的大小。考虑到MCU的成本,一般片内Flash都比较小,如果应用程序代码量比较大,片内Flash肯定是放不下的。就考虑到,是否可以在MCU外挂一个Flash,用来存储应用程序?搜索了很多资料,得知答案当然是可以的,特此总结,以免遗忘。
首先我们了解一下单片机系统的运行机制,跟一般PC机系统还是不太一样的。单片机系统一般由CPU、RAM、ROM(Flash最常见)组成,程序存储在ROM中。上电以后,CPU从ROM加载指令,在RAM中处理数据。跟PC机最大的不同是:程序并不会被加载到RAM,而是直接在ROM中运行,这样的原因主要也是单片机系统RAM比较小,CPU速率比较慢。
由此可见,Flash中是可以直接运行程序的。其实,大多数情况下,只要是能挂载到MCU的程序地址空间的设备都可以直接运行程序,不必再把代码读到系统RAM,否则其他存储设备只能存储程序或数据。目前,这样的Flash只能是Nor Flash,NOR Flash的特点是芯片内执行(XIP ,eXecute In Place),这样应用程序可以直接在Flash闪存内运行。这一般指的是片内Flash,即集成在MCU内部的存储器。
那么,对于片外Flash,原理是一样的,只不过我们需要想办法把应用程序烧录片外Flash当中,然后在BootLoader程序(即上电默认执行的代码片段)中,将程序引导到片外Flash中的地址即可。
简单写个BootLoader的伪代码如下:
int main(void)
{
xxx_Configuration(); // 系统初始化,如时钟等
JumpAddress = *(__IO uint32_t*) (ApplicationAddress); // 跳转地址
Jump_To_Application = (pFunction) JumpAddress; // 地址转化成函数指针
__set_MSP(*(__IO uint32_t*) ApplicationAddress); // 初始化用户程序的堆栈指针
Jump_To_Application(); // 跳转至外部NOR Flash加载并执行
while (1)
;
return 0;
}
不过,程序在片外Flash中运行的速度会比片内慢一些,且中断需要特殊处理一下。这一方面的具体操作暂时我还不太清楚,等研究之后再更新到此文。
网友评论