专栏首页AIoT开源项目分享制作STM32F429的SPI FLASH下载算法

制作STM32F429的SPI FLASH下载算法

  1. 下载算法的模版在keil安装目录\ARM\Flash下的_Template文件夹,把此文件夹复制出来,进行修改。也可以自行修改此工程名。
  1. 打开此工程,选择自己的芯片类型:
  1. 添加W25QXX的驱动代码: 去正点原子的论坛下载STM32F29的寄存器工程,拷贝出HARDWARE文件夹下的SPI和W25QXX驱动,和SYSTEM文件夹。

添加W25QXX的驱动

4.修改FlashDev.c代码:

#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代码:

#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目录

本文分享自微信公众号 - AIoT开源项目分享(Aladdin-Wang),作者:AIoTkk

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • STM32通用FLASH管理软件包——SFUD/FAL

    本次介绍的两个软件包SFUD/FAL都与FLASH有关,并且都可以独立使用或者结合在一起使用,两个软件包都对操作系统无依赖,可以使用裸机移植,也很方便移植到各种...

    AIoT-KK
  • RT-Thread进阶之网络框架

    netdev 组件主要作用是解决设备多网卡连接时网络连接问题,用于统一管理各个网卡信息与网络连接状态,并且提供统一的网卡调试命令接口。其主要功能特点如下所示:

    AIoT-KK
  • 【DIY数字仪表】使用TouchGFX的MVP架构来实现GUI和硬件的双向交互(2)

    MVP的全称为Model-View-Presenter,Model提供数据,View负责显示,Controller/Presenter负责逻辑的处理。MVP与M...

    AIoT-KK
  • How many integers can you find(容斥原理) - HDU 1796

    看这题之前先复习一下容斥原理,不然肯定看不懂,呃,如果第一次接触容斥原理的题,可能弄懂了容斥原理你还是看不懂代码,是的,等会你就知道了。

    ACM算法日常
  • 原 2015 Multi-Universi

    不高不富不帅的陈政_
  • 这些数学问题曾经坑死了世人

    几千年以来,人类在研究数学的过程中,提出并解决了很多难题。有些数学难题不仅玩坏了很多研究者,其解决的过程或结果也让人觉得十分坑爹。哆嗒数学网小编就在这里列举To...

    华章科技
  • 云环境下Web应用防护解决之道

      随着越来越多的用户将传统的业务系统迁移至虚拟化环境或者一些云服务商提供的云平台中,而目前众多云平台企业关注的更多是基础实施的完善和业务的开展,对于安全层面的...

    安恒信息
  • Where do SAP CRM HANA Live Querys come from

    There are entries from value help of SAP HANA Live Query:

    Jerry Wang
  • BAT面试算法进阶(3)-无重复字符的最长子串

    Given a string, find the length of the longest substring without repeating char...

    CC老师
  • 多线程基础(十):LockSupport源码及其使用

    在前面学习过java线程间通信的几种方式,分别是synchronized结合wait/notify。以及ReentrantLock结合Condation...

    冬天里的懒猫

扫码关注云+社区

领取腾讯云代金券