社区导航

 

搜索
查看: 1310|回复: 11

[原创] 盘它STM32H750之二(QSPI内存映射)

[复制链接]

900

TA的帖子

6

TA的资源

版主

Rank: 6Rank: 6

发表于 2019-4-7 16:31 | 显示全部楼层 |阅读模式
   由于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的时候也遇到不少问题,以此帖子记录其挖坑经验。
QQ图片20190407162906.png


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


此帖出自stm32/stm8论坛


回复

使用道具 举报

900

TA的帖子

6

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2019-4-7 16:45 | 显示全部楼层
  对于内存映射,简单来说就是外部的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应用程序的相关配置。


回复

使用道具 举报

900

TA的帖子

6

TA的资源

版主

Rank: 6Rank: 6

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

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





回复

使用道具 举报

900

TA的帖子

6

TA的资源

版主

Rank: 6Rank: 6

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



回复

使用道具 举报

900

TA的帖子

6

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2019-4-7 18:11 | 显示全部楼层
   楼主还是使用点灯以及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中。
3.png
    4.gif      
  


回复

使用道具 举报

7745

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2019-4-7 19:22 | 显示全部楼层
放假还在发帖,辛苦了


回复

使用道具 举报

5584

TA的帖子

207

TA的资源

版主

Rank: 6Rank: 6

发表于 2019-4-7 20:52 | 显示全部楼层
写的不错,加油干RC
EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,虽然在群里买不到板子,但是可以学会开车;虽然学不到技术,但是可以学会开车;商家勿入!加群暗号:喵


回复

使用道具 举报

1643

TA的帖子

1

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2019-4-7 21:24 | 显示全部楼层
看不懂,就羡慕把STM32玩的贼溜的大牛。
人已离开,无事别找,找也找不到。


回复

使用道具 举报

3348

TA的帖子

0

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2019-4-7 22:55 | 显示全部楼层
好牛哔好牛哔
So what......


回复

使用道具 举报

5

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2019-4-8 08:18 | 显示全部楼层
谢谢分享,学习了


回复

使用道具 举报

900

TA的帖子

6

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2019-4-8 19:56 | 显示全部楼层
  楼主在使用cubemx生成的QSPI初始化代码的时候,QSPI时钟只能达到33M才不至于死机。后来经过网上有人填坑说cubemx生成的IO翻转速率是最低的,需要改为最高。改动之后,QSPI可以达到100M.完美 QQ图片20190408195430.png


回复

使用道具 举报

3

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 5 天前 | 显示全部楼层
支持支持


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-4-20 04:37 , Processed in 0.327524 second(s), 16 queries , Gzip On, MemCache On.

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