43835|22

1366

帖子

6

TA的资源

版主

楼主
 

盘它STM32H750之二(QSPI内存映射) [复制链接]

 
   由于STM32H750的内部flash只有128K,对于普通应用来说按理是足够的,但是如果加上一些相关中间件以及各种开源库,估计128Kflash也不足够用。楼主的外部flash使用的是W25Q64,容量为8M,这个对于普遍应用来说都足够了。 STM32H750的QSPI有两个BANK,内存映射可以设置为单闪存模式和双闪存模式;不管什么模式,存储的其起始地址0x90000000,只是采用双闪存模式时,将同时访问两个 Quad-SPI FLASH,吞吐量和容量均可提高二倍而已。这是比较坑的事情,本来想着BANK1用RAM,BANK2用来当作ROM,但是实际上这两个BANK不能单独分开使用。
   楼主的板子需要以太网eth,但是若是使用BANK1,就与ETH外设冲突;若是使用BANK2,则与SDMMC1引脚冲突,但是还好用SDMMC2可使用,最终楼主使用的是BANK2,网上大多都是使用BANK1,楼主在移植切换到BANK2的时候也遇到不少问题,以此帖子记录其挖坑经验。



此内容由EEWORLD论坛网友RCSN原创,如需转载或用于商业用途需征得作者同意并注明出处


此帖出自stm32/stm8论坛

最新回复

  详情 回复 发表于 2020-12-15 17:25
点赞 关注(6)
个人签名

1084534438 欢迎交流  [加油,一切皆有可能]

 

回复
举报

1366

帖子

6

TA的资源

版主

沙发
 
  对于内存映射,简单来说就是外部的SPIFlash器件被映射为内部存储器,并且总线为其分配映射起始地址;对于Imxrt1052这些系列的是没有内部flash,所以需要XIP文件BootROM提供额外的相关信息用来对flash初始化和优化,BootROM利用映像文件的前8KB区域来获取相关信息。而STM32H750内部带有128K flash,这个大小足够让我们做个丰富的Bootloader功能,楼主在这里的bootloader目前仅仅做了几件事,使能和配置QSPI外设,然后再初始化外部flash,之后再把外部flash进行内存映射配置,之后初始化用户应用程序的堆栈指针并跳转到用户应用程序,此应用程序部分就在外部flash运行,地址也就是QSPI的存储起始地址0x90000000。
  此贴主要说明,外部flash W25Q64的MDK平台的FLM算法制作、QSPIBootloader的思路、以及MDK下的APP应用程序的相关配置。
此帖出自stm32/stm8论坛
 
个人签名

1084534438 欢迎交流  [加油,一切皆有可能]

 

回复

1366

帖子

6

TA的资源

版主

板凳
 
  对于MDK的FLM算法,网上专业的说法很多,想深入了解还是自己去搜索。对于楼主来说,简单概括就是MDK在这个FLM中,在下载的过程中就是反复调用API进行读写相关存储器。可以在MDK安装目录对应的ARM的FLASH上找到相对应FLASH算法,也附带了对于的MDK工程,用户可以进行修改然后生成对应的FLM算法。
  借此,可以知道MDK的FLM算法的API无非包含这些,分别就是一些初始化、烧写、校验、擦除等。
  
       其实对应的就是魔术棒中的一些勾选选项,
  
      那么我们就可以自定义出自己的一些相关函数,然后包含到这些指定的API接口中,然后编译即可生成自己的FLM算法。
      Init相关初始化就是初始化下STM32的时钟配置,以及W25Q64和QSPI等相关配置。这些驱动可以参考正点原子的寄存器版本的配置,分别是w25qxx和qspi还有sys这些文件,这里不使用HAL在于HAL过于臃肿,还是寄存器操作相对方便。
      其余并不需要改动多大,主要在于QSPI的配置,这里我们需要改变为BANK2。相关配置如下
     

   
    下载编译即可生成FLM,放入MDK的安装目录的FLASH文件夹中,在MDK既可找到相对于的算法



此帖出自stm32/stm8论坛
 
个人签名

1084534438 欢迎交流  [加油,一切皆有可能]

 

回复

1366

帖子

6

TA的资源

版主

4
 
  Bootloader楼主使用cubemx生成工程,主要初始化时钟配置,QSPI相关配置以及使能内存映射。然后再初始化用户应用程序的堆栈指针和跳转到用户应用程序,用户应用程序代码在外部flash执行。BOOT空间占用不到15K.可再发挥的东西还有很多。


此帖出自stm32/stm8论坛
 
个人签名

1084534438 欢迎交流  [加油,一切皆有可能]

 
 

回复

1366

帖子

6

TA的资源

版主

5
 
   楼主还是使用点灯以及helloworld输出来作为验证代码在外部flash执行的情况。在MDK编译自己的APP代码的时候需要注意以下几点:烧写到外部flash并且在外部flash运行,MDK的配置步骤如下:1、MDK的魔术棒:Target一栏中的IROM1,选择0x90000000,大小0x90000
2、Flash Download的算法选择STM32H750_W25Q64;RAM for Algorith Size改为0x8000;Download Function中Verify不勾选。
3、由CUBEMX生成的代码中的gpio.c中会把不用的GPIO设置为模拟模式以省功耗,但是带来的问题是把QSPI的IO也设置了导致QSPI不能访问外部flash,有两个办法,一个是手动改掉gpio.c中的QSPI引脚;另一个是在CUBEMX使能QSPI,然后在main.c中把MX_QUADSPI_Init()注释掉,这样就可以避免被设置为模拟模式
4、中断向量地址偏移到0x90000000,不然的话所有中断都无法用。在system_stm32h7xx.c中的SystemInit()函数里面,SCB->VTOR = FLASH_BANK1_BASE | VECT_TAB_OFFSET,改为SCB->VTOR = QSPI_BASE | VECT_TAB_OFFSET; 即可偏移到0x90000000中。

         
  
此帖出自stm32/stm8论坛
 
个人签名

1084534438 欢迎交流  [加油,一切皆有可能]

 
 

回复

1万

帖子

24

TA的资源

版主

6
 
放假还在发帖,辛苦了
此帖出自stm32/stm8论坛
 
 
 

回复

6040

帖子

204

TA的资源

版主

7
 
写的不错,加油干RC
此帖出自stm32/stm8论坛
 
 
 

回复

7462

帖子

18

TA的资源

五彩晶圆(高级)

8
 
看不懂,就羡慕把STM32玩的贼溜的大牛。
此帖出自stm32/stm8论坛
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复

3414

帖子

0

TA的资源

纯净的硅(高级)

9
 
好牛哔好牛哔
此帖出自stm32/stm8论坛
 
个人签名

So TM what......?

 

 

回复

14

帖子

0

TA的资源

一粒金砂(初级)

10
 
谢谢分享,学习了
此帖出自stm32/stm8论坛
 
 
 

回复

1366

帖子

6

TA的资源

版主

11
 
  楼主在使用cubemx生成的QSPI初始化代码的时候,QSPI时钟只能达到33M才不至于死机。后来经过网上有人填坑说cubemx生成的IO翻转速率是最低的,需要改为最高。改动之后,QSPI可以达到100M.完美
此帖出自stm32/stm8论坛
 
个人签名

1084534438 欢迎交流  [加油,一切皆有可能]

 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

12
 
支持支持
此帖出自stm32/stm8论坛
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

13
 
请教大神,QSPI的Flash下载算法能共享下吗?我自己写的下载算法,并不能把程序下载到QSPI,提示Flash超时...
此帖出自stm32/stm8论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

14
 

楼主,辛苦了,请看站内信息

此帖出自stm32/stm8论坛
 
 
 

回复

1310

帖子

3

TA的资源

一粒金砂(高级)

15
 

niu

此帖出自stm32/stm8论坛
 
个人签名

RTEMS

 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

16
 
楼主能不能提供一下源码  搞了好几天 没成功
此帖出自stm32/stm8论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

17
 

楼主辛苦了,有几个问题请教下:

1)采用外部FLASH方式用MDK可以正常进行单步调试不?

2)接着问题1),如果不能调试,那么是不是可以通过其他方式比如串口/网口将生成的二进制文件直接通过boot程序写入外部flash,然后直接跳转即可?

3)程序从外部FLASH中运行,执行效率怎么,楼主有没有做过对比,如果有还请分享一下。

此帖出自stm32/stm8论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

18
 

QSPI的内存映射模式一定要在时钟初始化时初始化么?我的设定是在片内flash中存放Bootloader程序,boot中对先设定QSPI为间接模式更新完代码之后再设置为内存映射模式,但是这样设置好像不能访问片外flash,只有在时钟初始化时设置为内存映射模式才能跳转。用的正点原子的历程。这是怎么回事有大神知道么

此帖出自stm32/stm8论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

19
 
yaodididi 发表于 2020-7-6 15:07 QSPI的内存映射模式一定要在时钟初始化时初始化么?我的设定是在片内flash中存放Bootloader程序,boot中对 ...

请问跳转问题解决了吗?

此帖出自stm32/stm8论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

20
 

请问楼主,普通spi连接外部flash可以实现运行外部flash代码的功能吗?

此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表