单片机外部Flash下载算法原理及实现方法

strongerHuang 2025-09-18 11:30
关注+星标公众,不错过精彩内容
来源 | CW32生态社区

Q:什么是外部flash 下载算法?

外部flash或者内置的片上flash,都是编译器通过调用写好的FLM文件来实现下载,单片机内部的安装pack包就会有(官方实现),外部flash的情况比较复杂,例如用的哪种flash,用的什么接口,都是不定的,没有办法写好一个通用的下载算法,这里也只是介绍一个通用的方法,实际需要按情况修改。


Q:为什么需要外部Flash算法

外部Flash算法是用来节省内部Flash空间的在一些应用中,图片数据字模数据比较占用单片机内存空间,在内存小的单片机中,是存不下这些数据的,通过在一些设置和下载算法,可以将工程中的常量保存到外部Flash。


Q:为什么不用其他方式对外部Flash下载数据?

1.用文件系统方式。会增加复杂度,增加性能占用。对于性能低的单片机,需要快速传输的数据不适合再走文件系统的接口。

2.用其他方法直接下载数据,比如专门下载数据的工程,或者专门的编程器,这些方案是可以,但是一方面是下载就非常麻烦,另一方面是对于数据的绝对地址管理起来费劲


下载算法实现需要准备:

1.官方单片机的库文件(或者准备一个工程模板)

2.对应的Flash驱动文件

3.Keil对于下载算法编写的工程模板


本文以CW32单片机、W25Q128作为外置Flash为例,这里准备需要的模版文件: 

https://pan.baidu.com/s/1-svjiviNAkuxRShuk0rNEg?pwd=CW32

提取码: CW32


具体步骤大致分为以下几步

1.复制keil官方下载算法工程,同时复制FlashOS.H文件到工程根目录,然后还需要去配置对应的单片机型号,添加CMSIS的核心文件,最后修改一下文件包含路径使其能编译。编译器最好用AC6,选择代码空间优化。

资讯配图
资讯配图
资讯配图
资讯配图
资讯配图

2.修改flashDev.C中的文件,使其符合实际应用需求

资讯配图

3.添加对应单片机的库文件并编译,注意:

a.因为下载算法生成的是与位置无关的代码,添加进去的所有文件,所有函数都会参与编译,因此只可以添加需要的文件,文件中有用不到的函数还需要屏蔽!!!

b.注意不需要启动文件!!!

资讯配图

▲这里只添加用的到的文件

资讯配图

这里大部分用不到的代码都屏蔽


4.添加对应型号的flash驱动,并能正常编译

资讯配图

Spi 底层外设初始化Nor flash 驱动函数


5.编写初始化my_main函数,初始化外设,并能正常编译

资讯配图
资讯配图

6.编写flashPrg.c文件,需要实现以下函数,有缺失的自行补齐。这一步是最关键的,最核心的。

a.int Init (unsigned long adr, unsigned long clk, unsigned long fnc)
资讯配图

b.int UnInit (unsigned long fnc)

资讯配图

c.int EraseChip (void)

资讯配图

d.int EraseSector (unsigned long adr)

资讯配图

e.int ProgramPage (unsigned long adr, unsigned long sz, unsigned char *buf)

资讯配图

f.int BlankCheck  (unsigned long adr,unsigned long sz,unsigned char pat)

资讯配图

g.unsigned long Verify(unsigned long adr,unsigned long sz,unsigned char *buf)

资讯配图

对应为初始化、去初始化、全片擦除、扇区擦除、扇区写入、擦除检测、校验。

以上这些函数都要有,但函数内部有些可以不去实现,正常编译到这一步就完成了。

7.配置编译文件输出路径

cmd.exe /C copy "Objects\%L" ".\@L.FLM"

cmd.exe /C copy ".\@L.FLM" "C:\user_app\keil5\ARM\Flash\@L.FLM"

注意:第二条的路径和keil安装路径有关,需要根据实际情况修改。

资讯配图

8.正常编译结果如下

资讯配图


下载算法使用

1.添加下载算法

资讯配图

2.配置下载算法所使用的RAM空间大小为实际RAM的大小

资讯配图

3.将需要放到外部flash的资源独立一个c文件保存,并配置存储地址

例如下图测试文件,定义两个const类型的字符串,指定存储地址为0x9000000开始。

资讯配图


4.编译查看是否分配到外置flash上

如下图,识别到一个16M的外置flash,已经使用了3.66%,实际数据是一些图片数据,一共有600K字节。

资讯配图


5.如何读取这个数据呢

和普通spi flash 一样,仍然要发送命令的方式来读取,只不过地址为显性的一个地址,也不需要人为去记。

例如下面这个测试程序

定义了两个const类型的数据,数据读取时,直接取地址符取出编译器分配的地址,然后减去一个基地址偏移0x90000000,然后得到的地址就是实际nor flash 需要发送访问的地址

资讯配图
资讯配图


6.实际测试串口打印验证

如下图的测试结果,地址就是我们要求的0x9000000开始的,数据读出来的也是实际存储的数据

资讯配图
=
END

资讯配图

低成本超低功耗带触摸MCU正在崛起

资讯配图

FreeRTOS操作系统有哪些认证 ?

资讯配图

微软开源1976年运行在8位微处理器上的汇编代码,比尔·盖茨曾参与开发

声明:内容取材于网络,仅代表作者观点,如有内容违规问题,请联系处理。 
单片机
more
当单片机遇见Zephyr,打通嵌入式开发任督二脉!
单片机项目中 void 型指针的高阶用法
又一起单片机死机案例!
一个初学单片机入门的苦恼与心路
不会写单片机不会画电路板?做完这个四轴飞行器,我把STM32和PCB全搞懂了!
单片机开发中常用的7种滤波算法!
单片机跑RTOS的优势!
【有奖评测 】最强Cortex-M85单片机!RA8D1套件(显示屏+摄像头)免费评测
基于单片机定时器+DMA实现CPU低负载、高精度数字波形输出!
单片机外部Flash下载算法原理及实现方法
Copyright © 2025 成都区角科技有限公司
蜀ICP备2025143415号-1
  
川公网安备51015602001305号