前言

最近做个项目用到STM32H750这款芯片,其片内flash只有128KB大小(虽网上说实际上和H743一样有2MB,但保险起见还是没有采用此方法),由于项目使用了RTOS、LWIP、TLS等,生成程序比较大、所以加了片W25Q32(4MB大小)作为片外FLASH使用,在需求有串口升级程序的功能、加上启动时需要先初始化QSPI然后设置内存映射到片外FLASH、则采用了Bootloader(片内) + App(片外)的方式,那问题就来了,Bootloader在片内,可以直接STLink直接下载,而App却没法直接下载,总不能一直采用串口升级调试吧,就算下到SAM运行也不是长久之计,思考再三还是得使用下载算法直接下到片外FLASH运行。

创建下载算法工程

如果你电脑已经安装Keil,那么可以在以下目录找到官方的工程模板:

{Keil安装目录}\ARM\PACK\ARM\CMSIS\5.3.0\Device\_Template_Flash

将这些全部复制到新文件夹,再将相关的芯片驱动库复制进去,之后打开工程,如果打开之后提示:

需要将工程模板的文件选择、然后右键进属性选项,把只读选项去掉,再重新打开即可。

重新打开之后,点击小魔术棒,选择对应的芯片,之后再将要用到的驱动文件逐一添加。

这边添加的都是Bootloader程序的文件(使用STM32CubeMX生成),这边几个文件需要修改一下:

将里面用到中断和判断超时的部分屏蔽掉,因为没有系统中断故hal库的计时器并不工作。

之后点编译如果遇到以下问题:

\xxx.axf: Error: L6265E: Non-PI Section xxxxxxxxx.o(.data) cannot be assigned to PI Exec region PrgData.

可以参考这篇博文解决:STM32用STLINK烧写外置FLASH遇到的问题,编译结果:

算法实现

先根据片外FLASH芯片调整参数,在FlashDev.c文件里头的结构体:

struct FlashDevice const FlashDevice  =  {FLASH_DRV_VERS,                                   // 驱动版本 不需要修改!"STM32H750 QSPI(W25Q32) 4MB Flash",              // 下载算法名称(Keil里显示)EXTSPI,                                            // 设备类型:片外FLASH0x90000000,                                       // 片外FLASH地址4 * 1024 *1024,                                     // 片外FLASH大小(4MB)1024,                                              // 页大小(一次写入的数据大小,这边W25Q32页大小是256,为了写入快点这边设置1024)0,                                                  // 保留位,必须是00xFF,                                             // 擦除后数据值1000,                                          // 页写入超时时间(1S)6000,                                               // 扇区擦除超时时间(6S)4 * 1024, 0x000000,                                // 扇区大小:4KB 地址:0x000000SECTOR_END
};

之后实现FlashPrg.c里的相关函数:

/**************************************************************************//*** @file     FlashPrg.c* @brief    Flash Programming Functions adapted for New Device Flash* @version  V1.0.0* @date     10. January 2018******************************************************************************/
/** Copyright (c) 2010-2018 Arm Limited. All rights reserved.** SPDX-License-Identifier: Apache-2.0** Licensed under the Apache License, Version 2.0 (the License); you may* not use this file except in compliance with the License.* You may obtain a copy of the License at** www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an AS IS BASIS, WITHOUT* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/#include "FlashOS.h"        // FlashOS Structures
#include "led.h"
#include "main.h"
#include "w25q32_qspi.h"/* Mandatory Flash Programming Functions (Called by FlashOS):int Init        (unsigned long adr,   // Initialize Flashunsigned long clk,unsigned long fnc);int UnInit      (unsigned long fnc);  // De-initialize Flashint EraseSector (unsigned long adr);  // Erase Sector Functionint ProgramPage (unsigned long adr,   // Program Page Functionunsigned long sz,unsigned char *buf);Optional  Flash Programming Functions (Called by FlashOS):int BlankCheck  (unsigned long adr,   // Blank Checkunsigned long sz,unsigned char pat);int EraseChip   (void);               // Erase complete Deviceunsigned long Verify      (unsigned long adr,   // Verify Functionunsigned long sz,unsigned char *buf);- BlanckCheck  is necessary if Flash space is not mapped into CPU memory space- Verify       is necessary if Flash space is not mapped into CPU memory space- if EraseChip is not provided than EraseSector for all sectors is called
*//**  Initialize Flash Programming Functions*    Parameter:      adr:  Device Base Address*                    clk:  Clock Frequency (Hz)*                    fnc:  Function Code (1 - Erase, 2 - Program, 3 - Verify)*    Return Value:   0 - OK,  1 - Failed*/int Init (unsigned long adr, unsigned long clk, unsigned long fnc) {userSystemInit();LED1_ON();if (W25_Qspi_Get_ID() != W25X_MF_ID) return (1);    // Finished without Errorsreturn (0);                                  // Finished without OK
}/**  De-Initialize Flash Programming Functions*    Parameter:      fnc:  Function Code (1 - Erase, 2 - Program, 3 - Verify)*    Return Value:   0 - OK,  1 - Failed*/int UnInit (unsigned long fnc) {LED1_OFF();return (0);                                  // Finished without OK
}// Blank Check
int BlankCheck(unsigned long adr, unsigned long sz, unsigned char pat)
{return (0); // Memory is blank 默认全部为空 在写入程序的时候会自己判断
}/**  Erase complete Flash Memory*    Return Value:   0 - OK,  1 - Failed*/int EraseChip (void) {LED1_FLASH();if (W25_Qspi_WriteEnable()) {if (W25_Qspi_EraseDatas(0, 3)) return (0);  // Finished without OK}return (1);                                  // Finished without Errors
}/**  Erase Sector in Flash Memory*    Parameter:      adr:  Sector Address*    Return Value:   0 - OK,  1 - Failed*/int EraseSector (unsigned long adr) {adr -= QSPI_FLASH_MEM_ADDR;LED1_FLASH();if (W25_Qspi_WriteEnable()) {if (W25_Qspi_EraseDatas(adr, 0)) return (0);    // Finished without OK}return (1);                                  // Finished without Errors
}/**  Program Page in Flash Memory*    Parameter:      adr:  Page Start Address*                    sz:   Page Size*                    buf:  Page Data*    Return Value:   0 - OK,  1 - Failed*/int ProgramPage (unsigned long adr, unsigned long sz, unsigned char *buf) {adr -= QSPI_FLASH_MEM_ADDR;LED1_FLASH();if (W25_Qspi_WriteDatas_API(adr, buf, sz)) return (0);  // Finished without OKreturn (1);                                  // Finished without Errors
}// Verify Function
extern uint8_t checkBuf[W25X_SECTOR_SIZE];
unsigned long Verify (unsigned long adr, unsigned long sz, unsigned char *buf) {unsigned long i;adr -= QSPI_FLASH_MEM_ADDR;LED1_FLASH();if (W25_Qspi_ReadDatas(adr, checkBuf, sz) == 0) return (1); // Finished without Errorsfor (i=0; i<sz; i++)if (buf[i] != checkBuf[i])break;return (adr + i + QSPI_FLASH_MEM_ADDR);
}

之后编译生成下载算法文件

添加到Keil使用

将生成的XXXX.FLM文件复制到keil下载算法目录:

{Keil安装目录}\ARM\Flash

之后就可以在配置界面看到了

编译APP程序、使用该算法下载校验、运行

STM32 MDK片外FLASH下载算法制作 —— 基于QSPI(W25Q32)相关推荐

  1. J-Flash中添加MDK制作的QSPI Flash下载算法方法

    在JLINK的电脑端驱动V6.84a上测试的. 1.MDK的QSPI Flash下载算法制作方法和制作好的算法看教程第80章和配套的例子即可 http://www.armbbs.cn/forum.ph ...

  2. 手把手系列--验证自己编写的STM32H750XBH6_ArtPi平台Keil MDK Flash下载算法

    一.目的         本文配套的完整工程地址         链接:https://pan.baidu.com/s/1CVN1oKVKvlE_osn9fePxbg          提取码:6u5 ...

  3. 【STM32H7教程】第85章 STM32H7的SPI 总线应用之SPI Flash的STM32CubeProg下载算法制作

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第85章       STM32H7的SPI 总线应用之SPI ...

  4. stm32g4 下载算法_STM32CubeProgrammer下载算法制作

    1. 摘要 本文档主要介绍,在STM32CubeProgrammer环境下,QSPI下载算法的制作和应用,方便将全字库和图片等资源文件存入QSPI flash里面,这样就可以开发炫酷的人机界面而不占用 ...

  5. 痞子衡嵌入式:轻松为i.MXRT设计更新Segger J-Link Flash下载算法文件

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是为i.MXRT设计更新Segger J-Link Flash下载算法文件. 想要在Flash中调试,基本是离不开Flash下载算法的,毕 ...

  6. 手把手系列--编写Keil MDK 外部FLASH下载算法

    声明:博文中涉及到的版权软件只用于教学使用 一.目的         完整工程下载地址:         链接:https://pan.baidu.com/s/1xtr8m_KGsyx64wN6rcn ...

  7. stm32g4 下载算法_手把手教你制作基于IAR、STM32H7的下载算法

    本文由作者『Lucas』原创并授权发布,地址: https://blog.csdn.net/lin_duo/article/details/110754189下载算法对于大部分工程师来说,只需要会使用 ...

  8. 向量时钟同步算法_如何让超级下载算法在不同CortexM内核下也能跑?

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是超级下载算法开发笔记(1)之执行在不同CM内核下. 文接上篇 <RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计&g ...

  9. 痞子衡嵌入式:超级下载算法RT-UFL v1.0发布,附J-Link下安装教程

    痞子衡主导的"学术"项目 <RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计> 历时 8 个月终于迎来了 v1.0 版发布,因为是第一个正式版,为了保证质 ...

  10. 痞子衡嵌入式:超级下载算法(RT-UFL)开发笔记(1) - 执行在不同CM内核下

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是超级下载算法开发笔记(1)之执行在不同CM内核下. 文接上篇 <RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计&g ...

最新文章

  1. KubeEdge向左,K3S向右
  2. multisim页面不够大_观赏变出售 捡漏钱不够
  3. Github 的使用
  4. CCF-CSP 201903-2 二十四点 Python语言 模拟栈实现
  5. 设计模式——装饰者(Decorator)模式DEMO——成绩汇报的装饰者模式实现
  6. linux文件类型elf,[Linux]四种ELF对象文件类型
  7. 清除ASP.Net缓存
  8. 【HDU - 5916】Harmonic Value Description (构造,思维,SJ题)
  9. 移动端iphone抓包调试神器—Stream安装和使用(一)
  10. 人工智障学习笔记——机器学习(3)决策树
  11. JDBC基本知识总结概括及8个阶段优化过程:
  12. 如何学习微信小程序? 学习微信小程序所需基础
  13. matlab找不到vs编译器
  14. Python常用软件包,python使用的软件
  15. windows 删除php,windows软链接(mklink)的建立及删除的用法示例
  16. C#与SQL实现医院信息管理系统
  17. 利用 MAC 自带的 mount_ntfs 工具加载ntfs移动硬盘进行数据读写
  18. 并购支付牌照中金支付90.01%股权该注意哪些风险
  19. nohup和的使用/21是什么意思/怎么关闭nohup挂起的程序
  20. 什么是沾包?如何处理?

热门文章

  1. echarts堆叠柱状图上显示数字_echarts堆叠柱状图在柱子上方显示总数
  2. 创业19年的湖南竞网如何拥抱数字化转型,按下成长加速键?
  3. 看懂555定时器,有哪些应用?
  4. Vins-Fusion运行kitti,euroc和tum数据集并使用evo评估
  5. 给机器人罗宾写一封英语回信_人教版5年级英语unit1知识
  6. BAT大牛亲授基于ElasticSearch的搜房网实战(第三章环境搭建)
  7. 2014年3月份全国计算机等级考试二级c语言选择题大全,2014年3月全国计算机二级C选择题考试真题...
  8. SQL service 建数据库、表和备份还原数据库
  9. 华为软件编程规范和范例
  10. 单片机攻略3——C51入门