OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8488|回复: 6

MDK通过Download把数组烧录到SPI Flash,SPIFlash烧录算法

[复制链接]

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3990
金钱
3990
注册时间
2015-11-14
在线时间
541 小时
发表于 2021-8-29 18:13:23 | 显示全部楼层 |阅读模式
本帖最后由 Electronic 于 2021-8-29 18:34 编辑

有些项目需要把一些数放置到外置的SPI Flash中,比如FATFS中的GBK转UNICODE表,占用170多K的控件,容量小的单片机压根放不下。存一些图片LOGO,或者经常修改的数据反复用专用的下载器烧录的SPI Flash,特别繁琐。笔者的LVGL字库就是通过此方法把字库存放到外置的Flash的。笔者就仿照ST提供的算法模板修改了一份烧录到外置Flash的算法。
使用的开发板是战舰F103开发板
我的路径如下:

参考路径

参考路径

一、首先修改FlashDev.c文件
1. Device Name修改为  "STM32F10x Ex-SPI-Flash 8M"
2. 修改存储器类型为EXTSPI,表示外外部SPI FLASH.
3. 存储器的基地址, 这里可以任意地址,笔者修改为0x0A000000。
4. 修改存储器大小,0x00800000   8M
  1. struct FlashDevice const FlashDevice  =  {
  2.    FLASH_DRV_VERS,             // Driver Version, do not modify!
  3.    "STM32F10x Ex-SPI-Flash 8M",   // Device Name
  4.    EXTSPI,                     // Device Type
  5.    0x0A000000,                 // Device Start Address
  6.    0x00800000,                 // Device Size in Bytes
  7.    4096,                       // Programming Page Size
  8.    0,                          // Reserved, must be 0
  9.    0xFF,                       // Initial Content of Erased Memory
  10.    500,                        // Program Page Timeout 500 mSec
  11.    50000,                        // Erase Sector Timeout 40000 mSec

  12. // Specify Size and Address of Sectors
  13.    0x1000, 0x000000,           // Sector Size 4kB ()
  14.    SECTOR_END
  15. };
复制代码
对应的截图
微信截图_20210829172146.png


二,修改FlashPrg.c文件,修改比较多,只挑重点说明一下。
1. 宏定义, 因为烧录算法配置在了0x0A000000,对应到SPI-Flash的地址是0x0000开始,所以需要前去这个偏移地址就是SPI-Flash的物理地址
  1. #define base_adr        0x0A000000
复制代码
2. Init函数, 这里是初始化SPI-Flash函数,如果开了硬件看门狗,需要配置看门狗。
微信截图_20210829172003.png
3.Uninit其实就是反初始化, 删除为空即可。
4.EraseChip函数,顾名思义,就是全片擦除。
5.EraseSector函数,这个函数一次性擦除sector。调用W25QXX_Erase_Sector时需要/4096。表示是要擦除哪个sector
微信截图_20210829173451.png
6.BlankChekc函数,每次返回1,表示每次写入前都需要擦除。这是最简单的操作,复杂点,可以先查询是否全是0xFF,如果不是则执返回1
7.ProgramPage函数,顾名思义就是写入一个页, 调用相应的函数即可。
1.png
8.Verify函数,校验写入的数据是否正确,函数实现如下。
2.png
9.修改输出文件名,然后编译工程。在工程的根目录的前一级目录将会生成一个STM32F10x_SPI_Flash_8M.FLM的文件,然后复制STM32F10x_SPI_Flash_8M.FLM文件到Keil_v5\ARM\Flash目录下 微信图片_20210829175210.png
其他函数的实现都是基于原子哥的例程移植过来的,参考例程即可。
到此为止,烧录算法以及实现,以下将测试这个烧录算法是否正确。

三、测试例程,复制SPI例程,修改如下数组,定义了一个64K的数组。
     值得注意的是,这里把数组定位在0x0A000000, 对应到SPI-Flash的地址需要减去0x0A000000的偏移地址。
    具体代码请看工程文件。
  1. <blockquote><blockquote>//定义一个大数组, Downloade将烧录到外置的SPI Flash
复制代码
将烧录算法加载到算法中
4.png 需要把Size修改大一点,0x8000。因为算法是烧录到SRAM的,设置的太小了,算法装不下。
3.png
下载代码到开发板:
按KEY0,LCD显示SPI-Flash预烧录的数据。
按KEY1,  SPI-Flash的数据被重新覆盖,再次按KEY0,显示的是覆盖的数据。
重新复位,也是被覆盖的数据,说明预烧录的数据是有效的。

五、附件包
烧录算法.rar (88.61 KB, 下载次数: 41)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3990
金钱
3990
注册时间
2015-11-14
在线时间
541 小时
 楼主| 发表于 2021-8-31 00:05:26 | 显示全部楼层
回复 支持 反对

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3990
金钱
3990
注册时间
2015-11-14
在线时间
541 小时
 楼主| 发表于 2021-8-31 21:45:22 | 显示全部楼层
顶  贴
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2021-5-3
在线时间
6 小时
发表于 2022-10-10 10:11:29 | 显示全部楼层
写的好!
回复 支持 反对

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3990
金钱
3990
注册时间
2015-11-14
在线时间
541 小时
 楼主| 发表于 2022-10-12 07:48:56 | 显示全部楼层
一年多了,终于有人顶贴了
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2023-5-14
在线时间
1 小时
发表于 2023-5-14 13:13:42 | 显示全部楼层
这个对SPI FLASH的硬件设计有要求吗?
回复 支持 反对

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3990
金钱
3990
注册时间
2015-11-14
在线时间
541 小时
 楼主| 发表于 2023-5-18 00:40:09 | 显示全部楼层
elelel 发表于 2023-5-14 13:13
这个对SPI FLASH的硬件设计有要求吗?

对硬件没有特别要求,这个帖子发得比较早,现有隔壁论坛有更好的方式了,可以去看看。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 09:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表