美文网首页
单片机从片外Flash启动

单片机从片外Flash启动

作者: LoveDuoer | 来源:发表于2020-03-25 18:01 被阅读0次

    之前做一个单片机项目,在选型时需要考虑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中运行的速度会比片内慢一些,且中断需要特殊处理一下。这一方面的具体操作暂时我还不太清楚,等研究之后再更新到此文。

    相关文章

      网友评论

          本文标题:单片机从片外Flash启动

          本文链接:https://www.haomeiwen.com/subject/sbjxuhtx.html