打印
[STM32F4]

STM32F469的QSPI烧写例程在开发板上跑不对

[复制链接]
2576|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 sheepsleepin414 于 2019-1-24 14:05 编辑

QSPI_PreInitConfig这个例程
选择如图算法,使用ST-Link烧进F469那个带大屏幕的开发板之后,本应该4个灯轮流翻转,但只有LED1是亮着的。请问是什么原因?
沙发
mmuuss586| | 2019-1-24 17:11 | 只看该作者

程序监控下看看;

使用特权

评论回复
板凳
21mengnan| | 2019-1-25 16:17 | 只看该作者
跑官方的例子也不对?

使用特权

评论回复
地板
21mengnan| | 2019-1-25 16:19 | 只看该作者
在Keil下搞对吗

使用特权

评论回复
5
21mengnan| | 2019-1-25 16:19 | 只看该作者
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已经开源,有兴趣的童鞋们自己进行跟读 效果更好

使用特权

评论回复
评论
262638532 2019-4-4 15:28 回复TA
有没有IAR工程这个问题的解决方案 ? 
6
sheepsleepin414|  楼主 | 2019-1-28 17:05 | 只看该作者
我回来了。经过调试发现注释掉SetSysClk(),换成普通的SystemClock_Config();  即可跑通。可能是SetSysClk()哪里配置得不对吧,还没仔细看。

使用特权

评论回复
7
sheepsleepin414|  楼主 | 2019-1-28 17:07 | 只看该作者

我下载的官方例程里的时钟配置函数不太对,换了一下就跑通了。在回帖里说明啦

使用特权

评论回复
8
晓伍| | 2019-2-19 12:59 | 只看该作者
调试状态看看哪里的问题

使用特权

评论回复
9
paotangsan| | 2019-2-19 13:02 | 只看该作者
用官方例程的话不涉及到设置的问题吧

使用特权

评论回复
10
262638532| | 2019-4-4 15:27 | 只看该作者
21mengnan 发表于 2019-1-25 16:19
STM32F469I discovery 外扩闪存Quad-SPIFlash映射
和STM32F7一样,STM32F469也提供了Quad-SPI接口,关于Qua ...

大神,有没有IAR工程这个问题的解决方案?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

7

帖子

0

粉丝