STM32 MDK片外FLASH下载算法制作 —— 基于QSPI(W25Q32)
前言
最近做个项目用到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)相关推荐
- J-Flash中添加MDK制作的QSPI Flash下载算法方法
在JLINK的电脑端驱动V6.84a上测试的. 1.MDK的QSPI Flash下载算法制作方法和制作好的算法看教程第80章和配套的例子即可 http://www.armbbs.cn/forum.ph ...
- 手把手系列--验证自己编写的STM32H750XBH6_ArtPi平台Keil MDK Flash下载算法
一.目的 本文配套的完整工程地址 链接:https://pan.baidu.com/s/1CVN1oKVKvlE_osn9fePxbg 提取码:6u5 ...
- 【STM32H7教程】第85章 STM32H7的SPI 总线应用之SPI Flash的STM32CubeProg下载算法制作
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第85章 STM32H7的SPI 总线应用之SPI ...
- stm32g4 下载算法_STM32CubeProgrammer下载算法制作
1. 摘要 本文档主要介绍,在STM32CubeProgrammer环境下,QSPI下载算法的制作和应用,方便将全字库和图片等资源文件存入QSPI flash里面,这样就可以开发炫酷的人机界面而不占用 ...
- 痞子衡嵌入式:轻松为i.MXRT设计更新Segger J-Link Flash下载算法文件
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是为i.MXRT设计更新Segger J-Link Flash下载算法文件. 想要在Flash中调试,基本是离不开Flash下载算法的,毕 ...
- 手把手系列--编写Keil MDK 外部FLASH下载算法
声明:博文中涉及到的版权软件只用于教学使用 一.目的 完整工程下载地址: 链接:https://pan.baidu.com/s/1xtr8m_KGsyx64wN6rcn ...
- stm32g4 下载算法_手把手教你制作基于IAR、STM32H7的下载算法
本文由作者『Lucas』原创并授权发布,地址: https://blog.csdn.net/lin_duo/article/details/110754189下载算法对于大部分工程师来说,只需要会使用 ...
- 向量时钟同步算法_如何让超级下载算法在不同CortexM内核下也能跑?
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是超级下载算法开发笔记(1)之执行在不同CM内核下. 文接上篇 <RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计&g ...
- 痞子衡嵌入式:超级下载算法RT-UFL v1.0发布,附J-Link下安装教程
痞子衡主导的"学术"项目 <RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计> 历时 8 个月终于迎来了 v1.0 版发布,因为是第一个正式版,为了保证质 ...
- 痞子衡嵌入式:超级下载算法(RT-UFL)开发笔记(1) - 执行在不同CM内核下
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是超级下载算法开发笔记(1)之执行在不同CM内核下. 文接上篇 <RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计&g ...
最新文章
- KubeEdge向左,K3S向右
- multisim页面不够大_观赏变出售 捡漏钱不够
- Github 的使用
- CCF-CSP 201903-2 二十四点 Python语言 模拟栈实现
- 设计模式——装饰者(Decorator)模式DEMO——成绩汇报的装饰者模式实现
- linux文件类型elf,[Linux]四种ELF对象文件类型
- 清除ASP.Net缓存
- 【HDU - 5916】Harmonic Value Description (构造,思维,SJ题)
- 移动端iphone抓包调试神器—Stream安装和使用(一)
- 人工智障学习笔记——机器学习(3)决策树
- JDBC基本知识总结概括及8个阶段优化过程:
- 如何学习微信小程序? 学习微信小程序所需基础
- matlab找不到vs编译器
- Python常用软件包,python使用的软件
- windows 删除php,windows软链接(mklink)的建立及删除的用法示例
- C#与SQL实现医院信息管理系统
- 利用 MAC 自带的 mount_ntfs 工具加载ntfs移动硬盘进行数据读写
- 并购支付牌照中金支付90.01%股权该注意哪些风险
- nohup和的使用/21是什么意思/怎么关闭nohup挂起的程序
- 什么是沾包?如何处理?
热门文章
- echarts堆叠柱状图上显示数字_echarts堆叠柱状图在柱子上方显示总数
- 创业19年的湖南竞网如何拥抱数字化转型,按下成长加速键?
- 看懂555定时器,有哪些应用?
- Vins-Fusion运行kitti,euroc和tum数据集并使用evo评估
- 给机器人罗宾写一封英语回信_人教版5年级英语unit1知识
- BAT大牛亲授基于ElasticSearch的搜房网实战(第三章环境搭建)
- 2014年3月份全国计算机等级考试二级c语言选择题大全,2014年3月全国计算机二级C选择题考试真题...
- SQL service 建数据库、表和备份还原数据库
- 华为软件编程规范和范例
- 单片机攻略3——C51入门