硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5784|回复: 8
收起左侧

[MDK] KEIL下基于STM32F407 的W25Q16 下载算法分享

  [复制链接]

32

主题

262

回帖

363

积分

高级会员

积分
363
发表于 2018-11-15 17:17:01 | 显示全部楼层 |阅读模式
本帖最后由 在水一方 于 2018-11-15 17:39 编辑

@zwmasdf 关于MDK下如何用仿真器烧程序的同时烧写附加数据到SPI FLASH的分享,先感谢大神的分享!!!

在这自己做了基于F407 W25Q16 的下载算法,
给大家分享下源码,
H750 的QSPI也是类似的,使用了内存映射就可以运行程序的,集体看ST给的HAL 例程 很详细的

其他的东西具体可以看源码。
这里给大家说几个东西,
1.MDK默认使用的Code/Const 存放的地方在0x90000000, 所以在sct文件里面修改一下,没有使用的数据会被优化掉
原文件
LR_IROM1 0x08000000 0x00080000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00080000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00020000  {  ; RW data
   .ANY (+RW +ZI)
  }
}

LR_ROM1 0x90000000 0x00200000  {
  ER_ROM1 0x90000000 0x00200000  {  ; load address = execution address
    test.o (+RO)
   .ANY (+RO)
  }
}


修改后:
LR_IROM1 0x08000000 0x00080000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00080000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00020000  {  ; RW data
   .ANY (+RW +ZI)
  }
}

LR_ROM1 0x90000000 0x00200000  {
  ER_ROM1 0x90000000 0x00200000  {  ; load address = execution address
    test.o (+RO)
  }
}


2.下载算法的空间尽量弄大一些

3.读取数据时, 因为TEXTSPI 的地址是 0x90000000  所以要获取真实地址W25QXX_Read(datatemp,(u32)TEXTSPI,SIZE);                                        //
void W25QXX_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead)   
{
         u16 i;
        u32 __ReadAddr = 0;        
        
        __ReadAddr = ReadAddr & 0xffffff;         //获取真实地址
                                                                                            
        W25QXX_CS=0;                            //使能器件   
    SPI1_ReadWriteByte(W25X_ReadData);         //发送读取命令   
    SPI1_ReadWriteByte((u8)((__ReadAddr)>>16));  //发送24bit地址   
    SPI1_ReadWriteByte((u8)((__ReadAddr)>>8));   
    SPI1_ReadWriteByte((u8)__ReadAddr);   
    for(i=0;i<NumByteToRead;i++)
        {
        pBuffer=SPI1_ReadWriteByte(0XFF);   //循环读数  
    }
        W25QXX_CS=1;                                                   
}  

@eric2013 硬汉大哥帮忙看下问题吧。
抱歉我账号,发不了文件和图片,只能网盘了 源码地址,
链接:https://pan.baidu.com/s/1IJpk3LyhMAw8DLu__3A6mw
提取码:1804






回复

使用道具 举报

32

主题

262

回帖

363

积分

高级会员

积分
363
 楼主| 发表于 2018-11-15 18:16:47 | 显示全部楼层
顺便自请教个问题, 在QSPI 运行代码 必须需要内存映射吗???
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2018-11-16 02:05:00 | 显示全部楼层
在水一方 发表于 2018-11-15 18:16
顺便自请教个问题, 在QSPI 运行代码 必须需要内存映射吗???

是的。
回复

使用道具 举报

1

主题

22

回帖

25

积分

新手上路

积分
25
发表于 2018-11-18 14:29:44 | 显示全部楼层
看了代码,是实现烧录的接口,没有找到main之类的入口函数,请教这类烧录算法的运行原理是什么?
keil负责把下载算法下载到sram中执行,但是入口函数在哪里?
回复

使用道具 举报

32

主题

262

回帖

363

积分

高级会员

积分
363
 楼主| 发表于 2018-11-18 17:42:35 | 显示全部楼层
蒋武锋_uh464 发表于 2018-11-18 14:29
看了代码,是实现烧录的接口,没有找到main之类的入口函数,请教这类烧录算法的运行原理是什么?
keil负责 ...

不需要的,keil调用相应的函数
回复

使用道具 举报

4

主题

52

回帖

64

积分

初级会员

积分
64
发表于 2018-11-18 22:03:57 | 显示全部楼层
谢谢分享




回复

使用道具 举报

9

主题

103

回帖

130

积分

初级会员

积分
130
发表于 2020-10-22 12:44:35 | 显示全部楼层
为什么回这样提示....
企业微信截图_16033418198073.png
回复

使用道具 举报

32

主题

262

回帖

363

积分

高级会员

积分
363
 楼主| 发表于 2021-1-27 16:44:42 | 显示全部楼层
检查你内部芯片,这和外部算法没关系,你试试用j-flash全片擦除试试
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2022-5-26 18:30:04 | 显示全部楼层
  谢谢分享  
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-13 16:19 , Processed in 0.182310 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表