查看: 2968|回复: 0

53...STM32F469I discovery 外扩闪存Quad-SPIFlash映射

[复制链接]
  • TA的每日心情
    难过
    2021-2-27 22:16
  • 签到天数: 1568 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2018-1-13 16:50:56 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 feixiang20 于 2018-1-13 16:54 编辑

    和STM32F7一样,STM32F469也提供了Quad-SPI接口,关于Quad-SPI协议,在此我不在多说,因为我的另一篇文章已经对其进行详细的分析了。在MCU上集成Quad-SPI接口,可以说是很大的福音,因为它可以它的读写速度比普通SPI标准接口快了很多,并且其支持内存映射,映射后,MCU可以像操作直接的闪存Flash一样操作它,使用十分方便。那么其实在这里存在一个问题,为什么不用NandFlash呢?而是使用了内存不大并且造价较高的Flash,我个人的看法是,对于MCU而言,程序的存储是基本上用不到Nandflash的(尽管也有一些方案使用了Nandflash),并且Nandflash存在坏块,所以在使用Nandflash时,必须要有相应的算法检测坏块,并且正确存储,这是一个很复杂的过程,就MCU而言,感觉使用Nandflash的话,反而会增加它的处理负担。
    OK!以上都是闲话!现在开始在STM32F469I Discovery板卡平台上使用Quad-SPIFlash。
    1.确定硬件。
    调试硬件首要干的事肯定是确定硬件了。
    (1)所使用的硬件型号为N25Q128A13EF840E。
    (2)硬件接口

    1.png

    (3)起始寻址和范围

    2.png

    如上图摘自《STM32F469xx》Datasheet,可以看到Quad-SPIFlash的寻址起始地址从0X90000000开始寻址,到0X9FFFFFFF结束,共256Mbit大小的空间。而我们板卡上配的是128Mbit大小的SPIFlash。这里贴别注意寻址空间和起始寻址地址。
    2.移植软件。
    自己编写驱动也不是不可能,但是调试钛粉时间,而ST已经提供了完整的方案,所以直接复用即可。与Quad-SPIFlash相关的文件有n25q128a.h(定义了n25q128的几乎所有用到的指令)、stm32469i_discovery_qspi.c文件和stm32469i_discovery_qspi.h文件(包含了关于Quad-SPI接口的驱动和Quad-SPIFlash的操作函数实现(寻址、映射等等))。在ST提供的stm32cubef4库中找到这三个文件并添加到自己的工程即可。不需做任何修改。
    声明:在此我不在进行关于Quad-SPI倒霉的跟读,因为在我的另一篇文章已经详细分析,在此主要介绍使用方法。
    3.初始化和映射。
    在这里主要就是关于调用了,在这里说明一些实验的思路。
    因为要使用Quad-SPIFlash,然而我现在的代码并没有这么大,那么我应该如何将代码或者将数据存储到Quad-SPIFlash呢?难道需要些那么大的代码才能证实么?答案是否定的,可以将指定的代码段存放到几乎你想存放的位置(只要你开心)。所以我就这么干了。
    我选取了6张图片的模数组在程序中进行定义,然后将他们存储在Quad-SPIFlash中,最后打印出它们的地址。如下图:

    3.png

    这就是其中的一个数组的定义,要注意哦,必须这样定义哦!数组名为img1,那么关于第一个红框,在此需要提的是,将此数组存放到.qspi段中,关于一个C语言可执行程序包括哪些基本的段,在此不再多说。但是.qspi段是扩展出来的,自定义指定的。
    具体调用如下图:

    4.png

    关于测试代码的实现,是非常简单的。如上图。
    4.修改链接器脚本。
    通常而言,我们写程序到上一步(第3步)就完成了,可以直接编译并将程序烧录到板卡运行了,但是在这里,还没那么简单,因为我们将一部分数据存放在Quad-SPIFlash上了,而编译器是不会知道我们自己外扩了闪存Flash的。所以我们需要告诉编译器,让其生成内存分布正确的可执行程序。那么关于可执行程序的内存的分布,就和一个叫链接器脚本的文件相关了(我不知道在Windows环境下是否也叫这个名字,总之在Linux环境下就叫这个名字)。
    在keil环境下,当我们不需要外扩闪存时,链接器脚本文件是有keil自动生成的,名为“STM32F4_Project_Template.sct”,注意,名字不重要,它就是工程名,重要的是后缀“.sct”。没错就是这个文件,下图为keil自动生成的链接器脚本文件的内容:

    5.png

    嘿嘿!它就确定了平常说的C语言可执行程序的各个段的地址分别了。如上图可见STM32F469的闪存Flash寻址空间起始地址为0x08000000,代码段大小为0x00200000,其他以此类推。但是貌似没有我们前面定义数组时定义的.qspi段哦。肯定是没有的,这就需要我们自行编写了。如下图:

    6.png

    没错,就是这样,非常的简单,程序员都擅长的技能是模仿(主要是我这种菜鸟)!以上添加就是,开辟.qspi段,对有.qspi声明的代码,都将存放在.qspi段。
    但是干完上面的事还是没完的,还需要配置一下keil的环境,因为默认情况下keil使用的是自动生成的链接器脚本文件。配置如下图:

    7---------------.jpg

    配置如上,不再解释,有图有真相。
    5.编译下载看效果。

    8-----.png

    如上图即为代码编译运行后的效果图了!可见!所定义的6个巨大数组,因为声明其存放在.qspi段,所以其的存放起始地址为0x90000000。看到此现象,说明Quad-SPIFlash的使用和映射已经成功,因为它在MCU的映射起始地址就是0X90000000,可参看本文第一图。

    总结:本文主要讲解了关于Quad-SPIFlash在STM32F469 MCU平台上的使用,尽管没有很详细的对其实现代码进行分析,但是此代码ST已经开源,有兴趣的童鞋们自己进行跟读 效果更好。

    回复

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-26 05:50 , Processed in 0.107015 second(s), 15 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.