硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4013|回复: 12
收起左侧

[SPI/QSPI] 外部 QSPI 下载后不能识别

[复制链接]

58

主题

267

回帖

446

积分

高级会员

积分
446
发表于 2021-8-10 11:39:00 | 显示全部楼层 |阅读模式
使用 外部 QSPI 运行程序,boot 里有 flash 识别的调试输出信息。
调试过每次上电或者复位都可以识别 QSPI Flash。

然后使用下载算法下载 app 到 QSPI,下载完成后,复位经过 boot 的时候,调试信息输出变成了识别失败,读取到的 ID 都是 0xFF。
所以就不能进 app,直接卡在 boot 里了。

这时候按复位键重启也是不能识别,但是重新上电就可以识别了,再复位也能识别。

这个是什么情况
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107852
QQ
发表于 2021-8-10 16:05:52 | 显示全部楼层
这种情况应该是你的外设里面涉及到延迟的外设没有正常初始化,运行一会正常了。
回复

使用道具 举报

58

主题

267

回帖

446

积分

高级会员

积分
446
 楼主| 发表于 2021-8-10 22:57:05 | 显示全部楼层
eric2013 发表于 2021-8-10 16:05
这种情况应该是你的外设里面涉及到延迟的外设没有正常初始化,运行一会正常了。

现在搞好了,问题原因是 boot 中的 QSPI 驱动是采用的普通模式。
下载算法下载 app 的时候,把 QSPI 进入了 QPI 模式。
这样在单片机复位的时候,没有将 flash 恢复到普通模式,所以访问不了。

上面的问题搞定后,出来新问题就是 QSPI 模式下读写 flash 正常,但进入内存映射模式就读不到数据了。
试来试去,找到了原因是不能在 QSPI 模式下进内存映射模式,要先把 flash 退出 QPI 模式。

第二个问题搞定后,又出来第三个问题。
跳转代码之前读到的 0x90000000 + 4 位置的值,和 设置到 msp 的值都是对的,
但是一旦执行跳转函数,就进入 MemManage_Handler。
这个问题目前还没搞定。

之前成功跳转过,但是我不清楚这其中的区别在哪里,莫名其妙就好了,莫名其妙又不好了。

大佬有建议没有。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107852
QQ
发表于 2021-8-11 14:34:32 | 显示全部楼层
ihavedone 发表于 2021-8-10 22:57
现在搞好了,问题原因是 boot 中的 QSPI 驱动是采用的普通模式。
下载算法下载 app 的时候,把 QSPI 进 ...

意思是跳转还不成功?
回复

使用道具 举报

58

主题

267

回帖

446

积分

高级会员

积分
446
 楼主| 发表于 2021-8-11 21:59:22 | 显示全部楼层
eric2013 发表于 2021-8-11 14:34
意思是跳转还不成功?

今天发现了为什么跳转不成功。
我的工程是 AC6 的,编译出来一跳转就会进 MemManage 错误。
后面改成了 AC5 就好了。

然后我把你的示例 boot 改成 AC6, 也是一样的,进 MemManage 错误。
回复

使用道具 举报

58

主题

267

回帖

446

积分

高级会员

积分
446
 楼主| 发表于 2021-8-11 22:02:56 | 显示全部楼层
eric2013 发表于 2021-8-11 14:34
意思是跳转还不成功?

补充一点,AC6 有时候也能正确跳转,但是我还没弄清楚能跳转和不能跳转的具体区别在哪里,
从 AC5 编译完成后,切换到 AC6,把 ASM的编译选项选成 arm (最后一个) 就可以跳转。
如果把 AC6 的 ASM 选项选成 auto (最上面一个),就不能跳转,而是进 MemManage。
这时候再改回 arm 选项,也不能跳转,改回 AC5 能跳转。
回复

使用道具 举报

58

主题

267

回帖

446

积分

高级会员

积分
446
 楼主| 发表于 2021-8-12 00:32:24 | 显示全部楼层
eric2013 发表于 2021-8-11 14:34
意思是跳转还不成功?

再补充一下。
我的程序是 CubeMX 自动生成的,生成的是 AC6 的工程。

1、当我生成裸机,循环闪灯。放到内部和外部都可以运行。
2、当我增加 Thread X,但是不调用 tx_kernel_enter() 函数,放到内部和外部都可以运行。
3、当我开启 threadx,创建一个任务来闪灯,放到内部可以运行,放到外部就能跑前半部分,跑到某个地方就会卡住不跑了,也不进错误。 有时候是在创建任务的函数里就卡死,有时候是跑到任务里,在任务里卡死。

4、我用正点原子的工程,或者用硬汉的工程,都是 AC5 工程,增加中断向量设置后,放到外部可以运行。

5、对比了区别是我的代码比较大(80+K),用的示例代码比较小(20+K)。
回复

使用道具 举报

58

主题

267

回帖

446

积分

高级会员

积分
446
 楼主| 发表于 2021-8-12 02:12:28 | 显示全部楼层
eric2013 发表于 2021-8-11 14:34
意思是跳转还不成功?

继续补充:

我又找了一个大点的 AC5 例程,code 126k, Ro-data 53k,下载到 QSPI Flash,一样的可以运行。

这就曹丹了,难道 AC6 编译的代码不能做 QSPI 跳转,也不能在 QSPI 中运行?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107852
QQ
发表于 2021-8-12 09:20:46 | 显示全部楼层
ihavedone 发表于 2021-8-11 21:59
今天发现了为什么跳转不成功。
我的工程是 AC6 的,编译出来一跳转就会进 MemManage 错误。
后面改成了 ...

应该是优化的问题。
回复

使用道具 举报

58

主题

267

回帖

446

积分

高级会员

积分
446
 楼主| 发表于 2021-8-12 10:57:30 | 显示全部楼层
eric2013 发表于 2021-8-12 09:20
应该是优化的问题。

没有开优化,特意把优化等级调整到了 0
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107852
QQ
发表于 2021-8-12 16:51:57 | 显示全部楼层
ihavedone 发表于 2021-8-12 10:57
没有开优化,特意把优化等级调整到了 0

你可以考虑是QSPI Flash和内部Flash混合运行方式排查下,看看是那部分代码不能在QSPI Flash刷,使用AC6
回复

使用道具 举报

58

主题

267

回帖

446

积分

高级会员

积分
446
 楼主| 发表于 2021-8-13 14:57:55 | 显示全部楼层
eric2013 发表于 2021-8-12 16:51
你可以考虑是QSPI Flash和内部Flash混合运行方式排查下,看看是那部分代码不能在QSPI Flash刷,使用AC6

我换成了 Cube IDE 的工程,也是不能运行。
然后我从头来试了一遍,发现不添加 ThreadX,做个闪灯和输出测试,就可以。
然后添加 ThreadX,创建一个任务,在任务里做闪灯和输出测试,就不行。
然后把这个任务里闪灯的程序放到片内 Flash,就可以。。。

boot 是裸机跳转,没有 OS。。

硬汉帮忙分析下这是什么原因?  
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107852
QQ
发表于 2021-8-13 15:37:42 | 显示全部楼层
ihavedone 发表于 2021-8-13 14:57
我换成了 Cube IDE 的工程,也是不能运行。
然后我从头来试了一遍,发现不添加 ThreadX,做个闪灯和输出 ...

难道是ThreadX启动阶段哪里的速度太慢没有处理过来。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-6-16 04:12 , Processed in 0.251902 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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