中级会员
 
- 积分
- 288
- 金钱
- 288
- 注册时间
- 2012-9-13
- 在线时间
- 65 小时
|
10金钱
最近在搞 H750 的 QSPI 运行,因为原子的板子没有 跳转到 QSPI 的 boot,所以就自己写了一个,在写的过程中有些疑惑,
1、原子的下载算法里把 QSPI Flash 设置为了 QPI 模式,下载完了也没恢复到普通模式,所以在 boot 中要先恢复为 普通模式,然后才能设置 地址映射,否则映射出来的数据都不对,就不能正确跳转。
这点跟原子例程里的注释说明有冲突,注释里说要将 Flash 设置为 QPI 模式,才能启动地址映射。 这里有点不明白。
另外原子的内部和外部 同时运行的代码里也有设置 QSPI 内存映射的代码,设置的时候发送的命令跟 W25Q64 的手册中并不相同,但是也可以正常运行,这点也很奇怪。
2、boot 我是用 CubeMX 自动生成的代码,然后进行修改。 自动生成的编译器设置是 AC6,生成的 boot 可以读取 flash 里的数据,地址映射以后也可以使用地址读取 flash 的数据,经过比对都正确。
问题在于 一旦跳转,就会进 MemManage 错误,不管怎么调整都不能解决,后面把 编译器改成了 AC5,就可以正确跳转了。 这里有没有大佬知道是什么原因?
3、boot 做好后,开始做 app。 CubeMX 生成的代码,加了一个亮灯测试,下载到外部 QSPI Flash,运行正确。
接下来添加了 ThreadX 的代码,创建了一个任务,在任务里亮灯测试,下载后前半部分可以正确运行,到某个地方突然就卡住了,看了汇编,卡住的地方并不是死循环,也不是错误中断。
修改代码后,代码量不同,卡死的地方就不一样。
4、针对上面的问题,我把代码改为内部 flash运行,只是修改了链接地址,然后重新编译,并没有改任何代码。 结果在内部 flash 运行正常。
5、接下来我找了原子的例程,把代码改为 外部 QSPI Flash 运行,结果也正常。 区别在于原子的例程都是 AC5 的,我的是 AC6的,难道 AC6 的代码不能用作跳转到 QSPI 的 boot, 也不能在 QSPI 中运行?
PS:因为我的代码是 CubeMX 自动生成的,尝试改为 AC5 编译,出现很多错误,编译不了,所以不能验证是不是把我的代码改为 AC5 就可以外部运行。。
6、目前仍然卡在程序跳转运行这里,跳过去了,但是运行一段之后就会卡死。
之前同样的程序,底层引脚分配稍有不同,在野火的 H750 板子上是可以正常跳转并运行的。 区别在于野火的板子是 W25Q256,原子的是 W25Q64。
这些问题有知道的朋友,或者原子的技术人员能够解答一下吗? 卡在这里三四天了,实在是没办法了。
|
|