这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » STM32F469I discovery 外扩闪存Quad-SPIFlash映射

共9条 1/1 1 跳转至

STM32F469I discovery 外扩闪存Quad-SPIFlash映射

菜鸟
2015-11-16 09:25:55     打赏

STM32F469I discovery 外扩闪存Quad-SPIFlash映射

-----东方青

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)硬件接口

(3)起始寻址和范围

如上图摘自《STM32F469xxDatasheet,可以看到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中,最后打印出它们的地址。如下图:

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

具体调用如下图:

关于测试代码的实现,是非常简单的。如上图。

4.修改链接器脚本。

通常而言,我们写程序到上一步(第3步)就完成了,可以直接编译并将程序烧录到板卡运行了,但是在这里,还没那么简单,因为我们将一部分数据存放在Quad-SPIFlash上了,而编译器是不会知道我们自己外扩了闪存Flash的。所以我们需要告诉编译器,让其生成内存分布正确的可执行程序。那么关于可执行程序的内存的分布,就和一个叫链接器脚本的文件相关了(我不知道在Windows环境下是否也叫这个名字,总之在Linux环境下就叫这个名字)。

keil环境下,当我们不需要外扩闪存时,链接器脚本文件是有keil自动生成的,名为“STM32F4_Project_Template.sct”,注意,名字不重要,它就是工程名,重要的是后缀“.sct”。没错就是这个文件,下图为keil自动生成的链接器脚本文件的内容:

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

没错,就是这样,非常的简单,程序员都擅长的技能是模仿(主要是我这种菜鸟)!以上添加就是,开辟.qspi段,对有.qspi声明的代码,都将存放在.qspi段。

但是干完上面的事还是没完的,还需要配置一下keil的环境,因为默认情况下keil使用的是自动生成的链接器脚本文件。配置如下图:

配置如上,不再解释,有图有真相。

5.编译下载看效果。

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

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




关键词: STM32F469I     discovery     外扩         

专家
2015-11-16 09:55:02     打赏
2楼

威武霸气

图文并茂的好文啊


高工
2015-11-16 10:10:31     打赏
3楼
  占位

菜鸟
2015-11-16 10:14:34     打赏
4楼

助工
2015-11-16 11:00:15     打赏
5楼
图文并茂,学习了。

菜鸟
2015-11-16 14:38:12     打赏
6楼
详细,前排

院士
2015-11-16 21:49:28     打赏
7楼

帖子经验知识丰富。

完全是分享之大作啊


菜鸟
2017-04-08 14:21:59     打赏
8楼
学习了

菜鸟
2017-05-13 00:13:42     打赏
9楼
学习了。请问您之前发表的QUAD SPI总线协议说明的链接在哪里?

共9条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]