【STM32 】通过ST-LINK utility 实现片外FLASH的烧写

2023-05-16

目录

前言

一、例程参考及讲解

1.1 Loader_Src.c文件

1.2 Dev_Inf.c文件

二、程序修改

三、实测

参考


前言

在单片机的实际应用中,通常会搭载一些片外FLASH芯片,用于存储系统的一些配置文件,比如说图片、字体、配置文件等。在出厂设置时,如何通过离线的方式将这些配置文件烧录至片外FLASH中成为关键。当然,在大批量生产中,可以先通过FLASH离线烧录工具将所需的文件烧写至FLASH,再进行贴片,但如何在小批量生产中实现片外FLASH的离线烧录呢?且听本文细细道来。

本文主要采用的是片外片外FLASH型号为W25Q64(SPI通信),MCU为STM32F103VCT6。安装好STlink的下载工具 STM32 ST-LINK utility,本文安装目录为C:\Program Files (x86)\STMicroelectronics。

一、例程参考及讲解

打开STM32 ST-LINK utility工具,点击External Loader,找到SPI FLASH的例程M25P64_STM3210E-EVAL。此后参考这个例程进行修改。Add External Loader 会罗列出C:\Program Files (x86)\STMicroelectronics\STM32 ST-LINK Utility\ST-LINK Utility\ExternalLoader目录下所有的stldr文件。

进入C:\Program Files (x86)\STMicroelectronics\STM32 ST-LINK Utility\ST-LINK Utility\ExternalLoader目录下,找到M25P64_STM3210E-EVAL例程。

打开工程文件,包含Loader_Src.c和Dev_Inf.c文件。

1.1 Loader_Src.c文件

基于特定IP为内存开发外部加载程序需要下述函数。请注意,必须在外部加载程序中定义以下函数:

Init函数:Init函数定义用于连接外部存储器的GPIO,初始化所用IP的时钟,并定义使用的GPIO。

Write函数:Write函数对使用RAM范围内的地址定义的缓冲区进行编程。

SectorErase函数(Flash存储器):SectorErase函数擦除由起始地址和结束地址定义的存储器扇区。该函数在SRAM存储器中不能使用。函数原型为int SectorErase (uint32_t StartAddress, uint32_t EndAddress)其中,“StartAddress” = 要擦除的第一个扇区的地址,“EndAddress” = 要擦除的最后一个扇区的地址。

下面是可以定义的其他函数:

Read函数:该函数用来读取指定范围的存储器,并将读取的数据返回到RAM里的缓冲区中,函数原型为int Read (uint32_t Address, uint32_t Size, uint16_t* buffer),其中,“Address” = 读取操作的起始地址,“Size”= 读取操作的大小,“buffer”= 指向
读取后的数据的指针。对于QSPI/OSPI(Quad-SPI/Octo-SPI)存储器,可以在Init函数中定义存储器映射模式;这种情况下,Read函数无用。

Verify函数:选择“verify while programming”模式时会调用该函数。该函数检查编程的存储器是否与RAM中定义的缓冲区保持一致。它返回一个uint64,定义如下:checksum<<32 + AddressFirstError。其中“AddressFirstError”为第一次失配的地址,“Checksum”所编程缓冲区的校验和值。

MassErase函数:该函数擦除整个存储器;

校验和函数:Checksum函数计算已编程的存储器校验和。使用的算法是简单的按位求和算法。结果截断为32位字。使用在ST-LINK Utility中打开的文件计算校验和值,是一种更快的验证编程操作的方法。如果成功则返回1,失败则返回0。

1.2 Dev_Inf.c文件

该文件定义了StorageInfo结构。该结构定义的信息类型示例如下所示:

/* This structure containes information used by ST-LINK Utility to program and erase the device */
#if defined (__ICCARM__)
__root struct StorageInfo const StorageInfo  =  {
#else
struct StorageInfo const StorageInfo  =  {
#endif
   "M25P64_STM3210E-EVAL", 	 	 // Device Name + version number
   SPI_FLASH,                  					 // Device Type
   0x00000000,                						 // Device Start Address
   0x00800000,                 						 // Device Size in Bytes (8MBytes/64Mbits)
   0x00000100,                 						 // Programming Page Size 16Bytes
   0xFF,                       						 // Initial Content of Erased Memory
// Specify Size and Address of Sectors (view example below)
   0x00000080, 0x00010000,     				 // Sector Num : 128 ,Sector Size: 64KBytes 
   0x00000000, 0x00000000,
}; 
}

二、程序修改

W25Q64参数如下所示。

/*
* W25Q64
* 1Page 包含256字节(0x00000100)
* 4Kbytes为1个Sector;=16 page	
* 8个扇区为1个Block(32KB),或者16个扇区为一个block(64KB)
* 容量为8M字节,共有128个Block,2048个Sector
*/

所以将Dev_Inf.c中的结构体修改为以下内容。

/* This structure containes information used by ST-LINK Utility to program and erase the device */
#if defined (__ICCARM__)
__root struct StorageInfo const StorageInfo  =  {
#else
struct StorageInfo const StorageInfo  =  {
#endif
   "W25Q64_STM32F1xx", 	    // Device Name + version number
   SPI_FLASH,                  	// Device Type
   0x00000000,                	// Device Start Address
   0x00800000,					// Device Size in Bytes (8MBytes/64Mbits)
   0x00000100,                 	    // Programming Page Size 256Bytes	
   0xFF,                       	// Initial Content of Erased Memory
// Specify Size and Address of Sectors (view example below) 
   0x00000800, 0x00001000,                     // Sector Num: 2048 Sector Size: 4KBytes	
   0x00000000, 0x00000000,
};

由于在SectorErase函数中,sFLASH_EraseSector是按照64KB大小的block来擦除的,擦除指令为0xD8,固此函数无需更改。其他函数也无需更改。

如下图所示,勾选Run #2,并将生成的stldr文件复制到C:\Program Files (x86)\STMicroelectronics\STM32 ST-LINK Utility\ST-LINK Utility\ExternalLoader目录下,该条指令为cmd.exe /C copy "!L" "C:\Program Files (x86)\STMicroelectronics\STM32 ST-LINK Utility\ST-LINK Utility\ExternalLoader\@L.stldr"

如下图所示,编译通过后,在C:\Program Files (x86)\STMicroelectronics\STM32 ST-LINK Utility\ST-LINK Utility\ExternalLoader目录下便会有对应的stldr文件。

如下图所示,打开STM32 ST-LINK utility工具,勾选刚才生成的stldr文件。

此后在External Loader下便有Mass Erase(整片擦除)、Sector Erase(块擦除)、Program(写片外Flash)、Read(读片外FLash)。

三、实测

通过实际测量,将一个2M大小的文件写进W25Q64,耗时大概两分钟。可以通过修改SPI的速率来提速?

参考

【1】http://www.stmcu.org.cn/module/forum/thread-614955-1-1.html?original

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【STM32 】通过ST-LINK utility 实现片外FLASH的烧写 的相关文章

随机推荐

  • Qt控件美化 用好CSS/QSS可视化工具

    一 CSS概念 级联样式表 CSS 包含应用于网页中的元素的样式规则 CSS 样式定义元素的显示方式以及元素在页中的放置位置 可以创建一个通用规则 xff0c 只要 Web 浏览器遇到一个元素实例 xff0c 或遇到一个分配给某个特定样式类
  • c/c++中的struct和class的区别

    主要有两种情况 xff1a 1 C语言中的struct和c 43 43 中的class区别 2 c 43 43 中的struct和c 43 43 中的class的区别 下面分别介绍 xff1a 1 C语言中的struct和c 43 43 中
  • Linux应用层对串口的使用操作

    在Linux中串口作为字符设备 xff0c 设备节点在 dev 目录下 xff0c 使用普通的open xff0c close xff0c write和read等系统调用即可使用 这其中会涉及到一些串口的基本属性的设置 xff0c 如 波特
  • 给定两个字符串str1和str2,查找str2在str1中出现的位置

    给定string str1和string str2 xff0c 编写一个库函数 xff0c 返回str2在str1中的位置 如 xff1a str1为 34 ABCDLANCEXYZ 34 xff0c str2为 34 LANCE 34 x
  • 中国交通标志检测数据集

    版权声明 xff1a 本文为转发问 xff0c 原文见博客 https blog csdn net dong ma article details 84339007 中国交通标志检测数据集 xff08 CCTSDB xff09 来源于 A
  • CentOS 修改ls目录的颜色

    修改ls目录的颜色 linux系统默认目录颜色是蓝色的 xff0c 在黑背景下看不清楚 xff0c 可以通过以下2种方法修改ls查看的颜色 bash profile文件在用的根目录下 xff0c ls al可以看到 方法一 xff1a 1
  • Tiny210(S5PV210) U-BOOT(六)----DDR内存配置

    上次讲完了Nand Flash的低级初始化 xff0c 然后Nand Flash的操作主要是在board init f nand xff0c 中 xff0c 涉及到将代码从Nand Flash中copy到DDR中 xff0c 这个放到后面实
  • NAND FLASH命名规则

    基于网络的一个修订版 三星的pure nandflash xff08 就是不带其他模块只是nandflash存储芯片 xff09 的命名规则如下 xff1a 1 Memory K 2 NANDFlash 9 3 Small Classifi
  • s3c6410 DMA

    S3C6410中DMA操作步骤 xff1a 1 决定使用安全DMAC SDMAC 还是通用DMAC DMAC xff1b 2 开始相应DMAC的系统时钟 xff0c 并关闭另外一组的时钟 xff08 系统默认开启SDMA时钟 xff09 x
  • Visual Studio和VS Code的区别

    1 Visual Studio简介 xff1a 是一个集成开发环境 IDE xff0c 安装完成后就能直接用 xff0c 编译工具 xff0c 调试工具 xff0c 各个语言的开发工具 xff0c 都是已经配置好的 xff0c 开箱即用 适
  • 博客转移

    由于CSDN 文章不间断的会丢失图片 xff0c 然后逼格也不够高 xff0c 导致几年都没有写博客 xff0c 全部是记录至印象笔记中 xff0c 但是久了也不太好 xff0c 所以最近搞了一个自己的个人博客 xff0c 以后文章全部写至
  • 安装qt-everywhere-opensource-src-4.8.6

    1 下载 qt everywhere opensource src 4 8 6 http mirrors hust edu cn qtproject official releases qt 4 8 4 8 6 qt everywhere
  • CentOS6.5上安装qt-creator-opensource-linux-x86-3.1.2.run

    1 qt creator opensource linux x86 3 1 2 run的下载 wget http mirrors hustunique com qt official releases qtcreator 3 1 3 1 2
  • atoi()函数

    atoi 函数 原型 xff1a int atoi xff08 const char nptr xff09 用法 xff1a include lt stdlib h gt 功能 xff1a 将字符串转换成整型数 xff1b atoi 会扫描
  • ubuntu中printk打印信息

    1 设置vmware添加seria port 使用文件作为串口 2 启动ubuntu xff0c 修改 etc default grub GRUB CMDLINE LINUX DEFAULT 61 34 34 GRUB CMDLINE LI
  • 静态库、共享库、动态库概念?

    通常库分为 xff1a 静态库 共享库 xff0c 动态加载库 下面分别介绍 一 静态库 xff1a 1 概念 xff1a 静态库就是一些目标文件的集合 xff0c 以 a结尾 静态库在程序链接的时候使用 xff0c 链接器会将程序中使用
  • 链表——怎么写出正确的链表?

    链表 相比数组 xff0c 链表不需要一块连续的内存空间 xff0c 而是通过指针将一组零散的内存块串联起来使用 xff0c 而这里的内存块就叫做节点 xff0c 一般节点除了保存data还会保存下一个节点的地址也就是指针 单链表 头节点
  • 【STM32】STM32 变量存储在片内FLASH的指定位置

    在这里以STM32L4R5为例 xff08 官方出的DEMO板 xff09 xff0c 将变量存储在指定的片内FLASH地址 xff08 0x081F8000 xff09 一 MDK Keil软件操作 uint8 t version spa
  • 【STM32】 利用paho MQTT&WIFI 连接阿里云

    ST联合阿里云推出了云接入的相关培训 xff08 基于STM32的端到端物联网全栈开发 xff09 xff0c 所采用的的板卡为NUCLEO L4R5ZI板 xff0c 实现的主要功能为采集温湿度传感器上传到阿里云物联网平台 xff0c 并
  • 【STM32 】通过ST-LINK utility 实现片外FLASH的烧写

    目录 前言 一 例程参考及讲解 1 1 Loader Src c文件 1 2 Dev Inf c文件 二 程序修改 三 实测 参考 前言 在单片机的实际应用中 xff0c 通常会搭载一些片外FLASH芯片 xff0c 用于存储系统的一些配置