Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >制作STM32F429的SPI FLASH下载算法

制作STM32F429的SPI FLASH下载算法

作者头像
AIoT-KK
发布于 2020-07-13 08:59:58
发布于 2020-07-13 08:59:58
1.8K10
代码可运行
举报
运行总次数:0
代码可运行
  1. 下载算法的模版在keil安装目录\ARM\Flash下的_Template文件夹,把此文件夹复制出来,进行修改。也可以自行修改此工程名。
  1. 打开此工程,选择自己的芯片类型:
  1. 添加W25QXX的驱动代码: 去正点原子的论坛下载STM32F29的寄存器工程,拷贝出HARDWARE文件夹下的SPI和W25QXX驱动,和SYSTEM文件夹。

添加W25QXX的驱动

4.修改FlashDev.c代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "FlashOS.H"        // FlashOS Structures


struct FlashDevice const FlashDevice  =  {
   FLASH_DRV_VERS,             // Driver Version, do not modify!
   "STM32F429_W25QXX",           // Device Name 
   EXTSPI,                     // Device Type
   0x90000000,                 // Device Start Address
   0x01000000,                 // Device Size in Bytes (16M)
   4096,                       // Programming Page Size
   0,                          // Reserved, must be 0
   0xFF,                       // Initial Content of Erased Memory
   1000,                        // Program Page Timeout 100 mSec
   3000,                       // Erase Sector Timeout 3000 mSec

// Specify Size and Address of Sectors
   0x001000, 0x000000,         // Sector Size  4kB (8 Sectors)
   SECTOR_END
};

5.修改FlashPrg.c代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "FlashOS.H"        // FlashOS Structures
#include "sys.h"
#include "delay.h"
#include "w25qxx.h"
#include "spi.h"
#include "usart.h" 

#define PAGE_SIZE            4096
/* 
   Mandatory Flash Programming Functions (Called by FlashOS):
                int Init        (unsigned long adr,   // Initialize Flash
                                 unsigned long clk,
                                 unsigned long fnc);
                int UnInit      (unsigned long fnc);  // De-initialize Flash
                int EraseSector (unsigned long adr);  // Erase Sector Function
                int ProgramPage (unsigned long adr,   // Program Page Function
                                 unsigned long sz,
                                 unsigned char *buf);

   Optional  Flash Programming Functions (Called by FlashOS):
                int BlankCheck  (unsigned long adr,   // Blank Check
                                 unsigned long sz,
                                 unsigned char pat);
                int EraseChip   (void);               // Erase complete Device
      unsigned long Verify      (unsigned long adr,   // Verify Function
                                 unsigned 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
 */
uint8_t aux_buf[PAGE_SIZE];
uint32_t base_adr;
int Init (unsigned long adr, unsigned long clk, unsigned long fnc) {

  /* Add your Code */
    Stm32_Clock_Init(360,25,2,8);//设置时钟,180Mhz
    delay_init(180);            //初始化延时函数 
    //uart_init(90,115200);     //初始化串口波特率为115200
    W25QXX_Init();              //W25QXX初始化
    return (0);                                  // Finished without Errors
}


/*
 *  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) {

  /* Add your Code */
  return (0);                                  // Finished without Errors
}


/*
 *  Erase complete Flash Memory
 *    Return Value:   0 - OK,  1 - Failed
 */

int EraseChip (void) {

  /* Add your Code */
    W25QXX_Erase_Chip();
  return (0);                                  // Finished without Errors
}


/*
 *  Erase Sector in Flash Memory
 *    Parameter:      adr:  Sector Address
 *    Return Value:   0 - OK,  1 - Failed
 */

int EraseSector (unsigned long adr) {

  /* Add your Code */
    W25QXX_Erase_Sector((adr-base_adr)/4096);
  return (0);                                  // 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) {

  /* Add your Code */
    W25QXX_Write_NoCheck(buf,adr-base_adr,sz);
  return (0);                                  // Finished without Errors
}
/*
 *  Blank Check Checks if Memory is Blank
 *    Parameter:      adr:  Block Start Address
 *                    sz:   Block Size (in bytes)
 *                    pat:  Block Pattern
 *    Return Value:   0 - OK,  1 - Failed
 */

int BlankCheck (unsigned long adr, unsigned long sz, unsigned char pat) {

    return (1);                                        /* Always Force Erase */
}
unsigned long Verify      (unsigned long adr,   // Verify Function
                           unsigned long sz,
                           unsigned char *buf)
{
        return 0;//直接返回0,表示成功                             
}

6.编译后将xxx.FLM拷贝到…\Keil_v5\ARM\Flash目录

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AIoT开源项目分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
你好 我最近也想写一个flashloader 初次接触嵌入式编程 不是特别熟悉 可以请教一下么
你好 我最近也想写一个flashloader 初次接触嵌入式编程 不是特别熟悉 可以请教一下么
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
从零编写STM32H7的MDK SPI FLASH下载算法
当我们要下载编译好的镜像到Flash时,首先要做的一步就是选择合适的Flash下载算法,而这个算法本身就是一个FLM文件:
AIoT-KK
2023/03/01
1.4K0
从零编写STM32H7的MDK SPI FLASH下载算法
利用MDK的FLM文件制作通用flash驱动
在进行Flash操作时,一般我们需要设计一套Flash抽象层,至少要包括flash的init,read、write、erase这些操作。但每更换一个单片机或者flash器件就要额外去编写flash驱动去适配init,read、write、erase。尽管有会者不难的属性加持,但适配所有的单片机或者flash器件,工作量也可想而知。
AIoT-KK
2023/03/01
2.4K1
利用MDK的FLM文件制作通用flash驱动
【STM32F407开发板用户手册】第36章 STM32F407的SPI 总线应用之SPI Flash的MDK下载算法制作
最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255 第36章 STM32F407的SPI 总线应用之SPI Fla
Simon223
2020/11/26
7020
【STM32F407开发板用户手册】第36章       STM32F407的SPI 总线应用之SPI Flash的MDK下载算法制作
【STM32H7教程】第80章 STM32H7的QSPI 总线应用之QSPI Flash的MDK下载算法制作
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第80章 STM32H7的QSPI 总线应用之QSPI F
Simon223
2020/11/24
1.3K0
【STM32H7教程】第80章     STM32H7的QSPI 总线应用之QSPI Flash的MDK下载算法制作
STM32CubeMX学习–(5)SPI读写W25Q128
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/129269.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/29
1.2K0
STM32CubeMX学习–(5)SPI读写W25Q128
firefly-rk3288开发板Linux驱动——W25Q32 SPI驱动
Linux下的spi驱动和i2c驱动十分类似,也可以分为三个部分:SPI核心,spi主机控制器(i2c中叫做i2c适配器),spi设备。
知否知否应是绿肥红瘦
2025/02/19
680
零代码玩转OTA升级
前言: 前边讲过stm32通用bootloader的实现方法,没有看过的,可以参考这一篇文章:STM32通用Bootloader——FOTA,这次将在上篇bootloader的基础上,介绍app如何通过多种固件下载器实现OTA升级。
AIoT-KK
2020/07/13
1.8K0
零代码玩转OTA升级
STM32Cube-18 | 使用QSPI读写SPI Flash(W25Q64)
本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件QSPI外设与 SPI Flash 通信(W25Q64)。
Mculover666
2020/07/16
4.5K0
STM32Cube-18 | 使用QSPI读写SPI Flash(W25Q64)
手把手教你在FPGA上搭建一个ARM Cortex-M3软核
上一篇文章介绍了ARM DesignStart计划,其中提到了Cortex-M1/M3 DesignStart FPGA版本,支持Xilinx和国产Gowin平台,本篇文章将手把手教你如何基于ARM DesignStart计划,在FPGA上搭建一个Cortex-M3软核处理器,以Xilinx Artix-7™系列FPGA为例,介绍如何定制一颗ARM Cortex-M3 SoC软核,并添加GPIO和UART外设,使用Keil MDK环境开发应用程序,Jlink下载、调试ARM程序,最终的实现效果是LED闪烁,串口输出Hello World信息。
单片机点灯小能手
2022/04/06
4.1K0
手把手教你在FPGA上搭建一个ARM Cortex-M3软核
Linux驱动开发-编写W25Q64(Flash)驱动
W25Q64是一颗SPI接口的Flash存储芯片,是华邦W25QXX系列里的一个具体型号,这个系列里包含了W25Q16,W25Q32,W25Q64,W5Q128等等。编程代码逻辑都差不多,主要是容量的区别。
DS小龙哥
2022/04/08
2.3K0
Linux驱动开发-编写W25Q64(Flash)驱动
【STM32H7教程】第79章 STM32H7的QSPI总线应用之驱动W25QXX(支持查询和MDMA)
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第79章 STM32H7的QSPI总线应用之驱动W25QX
Simon223
2020/11/24
2.5K0
【STM32H7教程】第79章       STM32H7的QSPI总线应用之驱动W25QXX(支持查询和MDMA)
让QSPI FLASH(W25Q64)支持Fatfs文件系统
今天是过年放假的第一天(一共16天年假),但是说实话放不放假对我们做技术的人来说有放跟没放其实区别不大,因为自驱力是我们维持自身实力和饭碗的根本,16天的假期可以做很多事情学不少东西了,唯一的区别是终于可以好好睡个觉了,然后睡醒接着干就完了!想着小熊派板子上带了一个QSPI,有8MB的存储空间,那可不能浪费了呀!之前写的那些开源项目的图片资源其实放在这上面的,如何实现呢?方法如下:
杨源鑫
2021/02/23
3.3K1
让QSPI FLASH(W25Q64)支持Fatfs文件系统
STM32通用FLASH管理软件包——SFUD/FAL
本次介绍的两个软件包SFUD/FAL都与FLASH有关,并且都可以独立使用或者结合在一起使用,两个软件包都对操作系统无依赖,可以使用裸机移植,也很方便移植到各种系统。
AIoT-KK
2020/07/13
2.2K0
STM32通用FLASH管理软件包——SFUD/FAL
STM32高级开发——使用DFU方案
素材来源:https://blog.csdn.net/zhengyangliu123/article/details/78788815
李肖遥
2022/12/22
1.5K0
STM32高级开发——使用DFU方案
【stm32f407】SPI实验 驱动W25Q128「建议收藏」
SPI 是英语SerialPeripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,STM32F4也有SPI接口。下面我们看看SPI的内部简明图
Java架构师必看
2022/04/11
1.9K0
【stm32f407】SPI实验 驱动W25Q128「建议收藏」
【STM32H7教程】第73章 STM32H7的SPI总线应用之驱动W25QXX(支持查询,中断和DMA)
本章节为大家讲解标准SPI接线方式驱动W25QXX,实现了查询,中断和DMA三种方式。
Simon223
2020/03/20
2.6K0
【STM32H7教程】第71章 STM32H7的内部Flash应用之模拟EEPROM
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第71章       STM32H7的内部Flash应用之模拟EEPR
Simon223
2020/03/11
2.2K0
(32)STM32——SPI实验
目录 ---- 学习目标         本节学习的是SPI通信原理,其实在之前51学习AD的时候接触过一下,但并未深入,32的SPI相对详细一点。本次实验用到的是W25Q128,是一种FLASH存储器,所以实验结果没什么好看的,就是简单的读写操作。等买了一些SPI的传感器再细细琢磨一下这个SPI的功能。 成果展示          也是简单的读写操作,就不展示详细的过程了。 内容 SPI 是英语 Serial Peripheral interface 的缩写,顾名思义就是串行外围设备接口
小点点
2022/12/12
7500
(32)STM32——SPI实验
STM32F103-FLASH读写
用户11186929
2024/07/01
1400
STM32F7QSPI学习笔记——读写N25Q128
QUADSPI 是一种专用的通信接口,连接单、双或四(条数据线)SPI Flash 存储介质。该接口可以在以下三种模式下工作:
知否知否应是绿肥红瘦
2025/02/19
2370
STM32F7QSPI学习笔记——读写N25Q128
推荐阅读
相关推荐
从零编写STM32H7的MDK SPI FLASH下载算法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验