硬汉嵌入式论坛

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

[SPI/QSPI] 爽,一种非常给力的STM32H7内部Flash和QSPI Flash混合运行程序的方式,不再需要用户单独制作BOOT和APP

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106643
QQ
发表于 2020-11-6 01:45:39 | 显示全部楼层 |阅读模式
现在大家使用H750或H743在外置QSPI Flash执行程序,都倾向于制作个BOOT,再制作一个运行在外置QSPI Flash的APP程序。

下面这种方式对于我们想外置QSPI Flash运行程序,在调试测试阶段更加方便,甚至是项目使用,可以性能最大化。

已经发布,下帖里可以下载:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980

配套例子:
第83章 STM32H7 的内部 Flash 和 QSPI Flash都运行程序的混合方式(强烈推荐)

配套章节:
QQ截图20201109043406.png


(1)通过设置代码存储位置,可以方便的设置代码执行在内部Flash还是外部QSPI Flash

1.png


(2)设置完毕后,通过这里的设置,可以方便的将对应程序下载到对应的存储器,极其方便

2.png


(3)并且这种方式可以方便的调试程序,内部Flash和外部Flash都做调试。

QQ截图20201106022228.png


其实不仅仅是程序,各个字库,图库等素材也可以方便的存储到QSPI Flash了。再也不用繁琐的BOOT和APP配置两个来玩。




评分

参与人数 3金币 +42 收起 理由
onono + 20
x机器 + 2
byccc + 20 赞一个!

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106643
QQ
 楼主| 发表于 2020-11-6 01:49:39 | 显示全部楼层
1、基于H7-TOOL的批量烧录内部Flash和QSPI Flash混合运行程序的方法,本质就得对多地址段hex文件做分割,并匹配相应的算法文件
https://www.armbbs.cn/forum.php?mod=viewthread&tid=110248




2、STM32CubeProg也可以有效识别内部Flash和外部QSPI Flash两个程序分段
QQ截图20201106015030.png
回复

使用道具 举报

5

主题

519

回帖

534

积分

金牌会员

积分
534
发表于 2020-11-6 08:23:39 | 显示全部楼层
玩的越来越溜了,越来越简单。牛。
回复

使用道具 举报

6

主题

122

回帖

140

积分

初级会员

积分
140
发表于 2020-11-6 08:34:35 | 显示全部楼层
非常实用。
回复

使用道具 举报

0

主题

43

回帖

43

积分

新手上路

积分
43
发表于 2020-11-6 08:39:50 | 显示全部楼层
这个牛B了,做程序就不需要那么麻烦了。
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
发表于 2020-11-6 09:10:25 | 显示全部楼层
这个要怎么玩
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2020-11-6 09:17:19 | 显示全部楼层
这样非常好,用起来没有违和感啊!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106643
QQ
 楼主| 发表于 2020-11-6 10:33:12 | 显示全部楼层

不出意外,本周将发教程
回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2020-11-6 13:26:38 | 显示全部楼层
相当给力,好方案
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2020-11-6 19:00:32 | 显示全部楼层
是不是就是分散加载文件在起作用
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106643
QQ
 楼主| 发表于 2020-11-7 02:52:23 | 显示全部楼层
myxiaonia 发表于 2020-11-6 19:00
是不是就是分散加载文件在起作用

对,本质上就是设置的分散加载。
回复

使用道具 举报

19

主题

62

回帖

119

积分

初级会员

积分
119
发表于 2020-11-7 09:56:42 | 显示全部楼层
请问哪些程序可以放在外部flash运行,哪些必须在内部?完全根据自己功能需求来划分嘛?还是有所限制?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106643
QQ
 楼主| 发表于 2020-11-8 00:13:17 | 显示全部楼层
mojinpan 发表于 2020-11-7 09:56
请问哪些程序可以放在外部flash运行,哪些必须在内部?完全根据自己功能需求来划分嘛?还是有所限制?

这个会在本周更新的教程里面做个简单说明。

最根本的界限是QSPI初始化并设置为内存映射模式后,就可以随意设置了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106643
QQ
 楼主| 发表于 2020-11-9 04:33:02 | 显示全部楼层
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106643
QQ
 楼主| 发表于 2020-11-9 04:35:22 | 显示全部楼层
已经更新例子和对应教程下载。
回复

使用道具 举报

6

主题

636

回帖

654

积分

金牌会员

积分
654
QQ
发表于 2020-11-9 21:16:33 | 显示全部楼层
这种方式,通过boot升级app固件是否存在不方便得地方?
回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
发表于 2020-11-9 22:19:44 | 显示全部楼层
发布得帖子还没审核通过吗,现在咋打不开
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106643
QQ
 楼主| 发表于 2020-11-10 09:10:14 | 显示全部楼层
yklstudent 发表于 2020-11-9 21:16
这种方式,通过boot升级app固件是否存在不方便得地方?

对,boot升级app的时候要想个好的的思路。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106643
QQ
 楼主| 发表于 2020-11-10 09:10:54 | 显示全部楼层
打卡怪 发表于 2020-11-9 22:19
发布得帖子还没审核通过吗,现在咋打不开

楼主位链接已经修改。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2020-11-13 16:35:37 | 显示全部楼层
eric2013 发表于 2020-11-10 09:10
对,boot升级app的时候要想个好的的思路。

有没有办法让编译器把片内flash的数据彻底固化。
用固化的片内数据与片外程序一起编译,之后提取片外部份数据的bin,单独烧录到指定的片外地址上。
这样就可以实现片外程序的iap升级了,而且调试新代码的过程也简单很多。
不知道MDK有没有这种功能。
回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
发表于 2020-11-13 23:27:08 | 显示全部楼层
TouchGFX的代码也可以用这个方法分配不?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106643
QQ
 楼主| 发表于 2020-11-14 10:08:33 | 显示全部楼层
x机器 发表于 2020-11-13 23:27
TouchGFX的代码也可以用这个方法分配不?

可以的。
回复

使用道具 举报

0

主题

84

回帖

84

积分

初级会员

积分
84
发表于 2020-11-14 16:16:29 | 显示全部楼层
这样子,QSPIFLASH 还能作为 外部FLASH,存储一些图片字库之类的吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106643
QQ
 楼主| 发表于 2020-11-14 16:18:46 | 显示全部楼层
xk2yx 发表于 2020-11-14 16:16
这样子,QSPIFLASH 还能作为 外部FLASH,存储一些图片字库之类的吗?

什么都可以存,非常方便。
回复

使用道具 举报

29

主题

97

回帖

184

积分

初级会员

积分
184
发表于 2020-12-1 16:48:40 | 显示全部楼层
这个好像没有IAR的工程应用,  IAR 的是不是不好整?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106643
QQ
 楼主| 发表于 2020-12-1 17:08:16 | 显示全部楼层
wgp2590 发表于 2020-12-1 16:48
这个好像没有IAR的工程应用,  IAR 的是不是不好整?

IAR的不做了。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2020-12-8 10:05:02 | 显示全部楼层
wgp2590 发表于 2020-12-1 16:48
这个好像没有IAR的工程应用,  IAR 的是不是不好整?

IAR的也有相关说明,在微信中打开 https://mp.weixin.qq.com/s/-7seN2aYre8NlKIwp1C09Q
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106643
QQ
 楼主| 发表于 2020-12-9 14:41:35 | 显示全部楼层
zy112233123 发表于 2020-12-8 10:05
IAR的也有相关说明,在微信中打开 https://mp.weixin.qq.com/s/-7seN2aYre8NlKIwp1C09Q

谢谢分享。
回复

使用道具 举报

0

主题

11

回帖

11

积分

新手上路

积分
11
发表于 2020-12-10 16:25:28 | 显示全部楼层
回复

使用道具 举报

6

主题

76

回帖

94

积分

初级会员

积分
94
发表于 2020-12-14 14:18:28 | 显示全部楼层
本帖最后由 buxinshan 于 2020-12-14 17:15 编辑
eric2013 发表于 2020-11-10 09:10
对,boot升级app的时候要想个好的的思路。

App程序分散加载在QSPI-Flash中,App中需要操作读QSPI-Flash倒是非常容易,直接内存操作就行。关于写操作这块,我这有两种理解思路,看是否可行。

【思路1】每次把需要写的地址、内容、长度,都缓存在SRAM中,缓存好之后触发一个中断(不管软中断还是硬件中断都可以,但要求该中断程序执行在内置Flash(0x8000000)中),在中断处理过程中恢复QSPI接口为间接模式,在中断处理函数中执行QSPI-Flash的写操作,写完之后恢复QSPI为内存映射模式。
不过,此处有两点要求:
        1、相比较于内置Flash(0x08000000)中的执行的中断程序,写QSPI-Flash的操作的中断函数的优先级较低;而且,其他执行在内置Flash中的中断程序(此时Main函数肯定没法执行,只会有可能执行中断嵌套)不允许操作QSPI-Flash
        2、相比较于QSPI-Flash中执行的中断程序,写QSPI-Flash的操作的中断函数的优先级较高。

【思路2】每次把需要写的地址、内容、长度,都缓存在SRAM中,缓存好之后触发一个中断(不管软中断还是硬件中断都可以,但要求该中断程序执行在内置Flash(0x8000000)中),在中断处理过程中恢复QSPI接口为间接模式,在中断处理函数中执行QSPI-Flash的写操作,写完之后恢复QSPI为内存映射模式。不过,此处有一点要求:1、在执行写QSPI-Flash操作的中断程序中,关闭其他所有的中断。(这就类似于F103系列中,写内置Flash的时候,关闭所有中断,是一样的。)
回复

使用道具 举报

13

主题

190

回帖

229

积分

高级会员

积分
229
发表于 2020-12-14 17:04:06 | 显示全部楼层
这个算法要怎么调试?单独运行正确能保证下载的时候没问题吗?我这边弄IAR的出了问题,都不知道怎么调试
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106643
QQ
 楼主| 发表于 2020-12-15 08:25:52 | 显示全部楼层
buxinshan 发表于 2020-12-14 14:18
App程序分散加载在QSPI-Flash中,App中需要操作读QSPI-Flash倒是非常容易,直接内存操作就行。关于写操作 ...

谢谢分享。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106643
QQ
 楼主| 发表于 2020-12-15 08:27:26 | 显示全部楼层
zhang0352505 发表于 2020-12-14 17:04
这个算法要怎么调试?单独运行正确能保证下载的时候没问题吗?我这边弄IAR的出了问题,都不知道怎么调试

算法里面也可以加串口打印啥的来调试的。
回复

使用道具 举报

6

主题

76

回帖

94

积分

初级会员

积分
94
发表于 2020-12-15 10:41:13 | 显示全部楼层
关于Boot和App的关系,我想参考nRF52832的程序架构。
1、nRF52832的程序由两部分组成:BLE协议栈+用户App。
2、BLE协议栈是nordic编译好的,用户不可修改。
3、用户App可以自由编程和OTA,不过用户可使用的很多外设资源都受限。
4、由于灵活应用了Cortex-M的SVC中断(我把它理解为软中断),BLE协议栈通过回调函数调用用户App,反之通过钩子函数。
5、由于使用了SVC中断,无论BLE协议栈还是用户App都无法使用RTOS。
6、关联:nRF52832的BLE协议栈等同于STM32中的Boot;nRF52832的用户App等同于STM32中的App。
7、理论上,nRF52832能够实现,STM32也能够实现,只是感觉好复杂。

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106643
QQ
 楼主| 发表于 2020-12-15 11:05:01 | 显示全部楼层
buxinshan 发表于 2020-12-15 10:41
关于Boot和App的关系,我想参考nRF52832的程序架构。
1、nRF52832的程序由两部分组成:BLE协议栈+用户App ...

当前这种运行方式,使用系统bootloader比较方便。内部和外部可以同时更新。

如果是自己更的话,最好的还是独立一个可以RAM里面运行的bootloader,这样内部和外部可以同时更新。
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2021-4-25 18:19:15 | 显示全部楼层
本帖最后由 王海靖 于 2021-4-25 18:31 编辑

请教硬汉大佬一个问题:我尝试了片内片外的混合编程,但是出现了这个问题, PACK 用的 2.7
111.png
查看数据确实没有写入
222.jpg

分开下载的时候,又都能成功,怀疑是下载算法的问题,目前没有思路。
回复

使用道具 举报

210

主题

1042

回帖

1682

积分

至尊会员

More we do, more we can do.

积分
1682
发表于 2021-4-25 19:11:35 | 显示全部楼层
按目录来指定加载地址比较高效,不然得逐个源文件操作,楼主提供了个很好的思路。
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2021-4-26 09:08:34 | 显示全部楼层
王海靖 发表于 2021-4-25 18:19
请教硬汉大佬一个问题:我尝试了片内片外的混合编程,但是出现了这个问题, PACK 用的 2.7

查看数据确实 ...

已解决,算法里面要关闭 cache
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2021-7-22 15:13:27 | 显示全部楼层
本帖最后由 869934179 于 2021-7-22 17:12 编辑

在实现stm32cubeIDE的混合运行时遇到了问题若将touchGFX的部分(代码、字体等)分配到外部QSPI
touchGFX有很多的c++代码,需要调用__libc_init_array来初始化 ,且在C++中,全局变量和静态变量的构造函数需要在main函数执行前执行。
问题来了,调用__libc_init_array需要通过QSPI的内存映射模式才能获取到touchGFX部分,故而需要在__libc_init_array前配置QSPI的内存映射,

所以代码顺序为:配置QSPI的内存映射->__libc_init_array->main
不知道要怎么实现,貌似先配置QSPI的内存映射会和__libc_init_array产生冲突
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106643
QQ
 楼主| 发表于 2021-7-23 09:14:13 | 显示全部楼层
869934179 发表于 2021-7-22 15:13
在实现stm32cubeIDE的混合运行时遇到了问题若将touchGFX的部分(代码、字体等)分配到外部QSPI
touchGFX有 ...

这个应该有解决办法,但是我没用过CubeIDE,帮不上你了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 14:06 , Processed in 0.326366 second(s), 37 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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