[STM32F7]

STM32F769 双 Bank 启动

[复制链接]
556|18
手机看帖
扫描二维码
随时随地手机跟帖
我喜欢打游戏|  楼主 | 2021-11-12 21:40 | 显示全部楼层 |阅读模式
前言
STM32F769 的双 bank Flash,可以在执行程序的同时对另一个 bank 进行擦除和编程的操作。利用这个特性,可以实现在线
程序更新,双 bank 启动的功能。本文将结合笔者在实际应用中遇到的问题,针对性的介绍 nDBOOT 分别设置为 0 和 1 时,
两种不同的启动方式。同时你也可以参考 AN4826 和 STM32F7 Cube 库中的例程来进一步加深理解。

使用特权

评论回复
我喜欢打游戏|  楼主 | 2021-11-12 21:41 | 显示全部楼层
STM32F7 双 bank 单 bank 配置 以 2M 字节 Flash 的 F769 为例,
当配置为单 bank 时,芯片的主 FLASH 分为:4 个 32K 字节的扇区,1 个 128K 字节的扇区,7 个 256K 字节的扇区。AXI 总 线上的起始地址为 0x08000000 ~0x081fffff;
当配置成双 bank 时,芯片的主 FLASH 分为两个 1M 字节的 bank,每个 bank 分为:4 个 16K 字节的扇区,1 个 64K 字节的
扇区,7 个 128K 字节的扇区。AXI 总线上,Bank1 的起始地址为 0x08000000~0x080fffff, Bank2 的起始地址为
0x08100000~0x081fffff。 见下图:
50840618e6ee7d2abb.png

使用特权

评论回复
我喜欢打游戏|  楼主 | 2021-11-12 21:42 | 显示全部楼层
从单 Bank 切换到双 Bank 只需要将选项字中的 nDBANK 设置为 0 就可以了。
60561618e6f1984246.png

使用特权

评论回复
我喜欢打游戏|  楼主 | 2021-11-12 21:43 | 显示全部楼层
双 bank 启动的配置
阅读 STM32F769 的参考手册 RM0410,知道它的启动地址是根据 BOOT 引脚的状态由选项字中的 BOOT_ADD0 或者
BOOT_ADD1 来决定的。可以在从地址 0 到 0x3FFFFFFF 的合法地址范围内,以 16K 字节为间隔从任何地址启动。也就是
说,可以通过设置 BOOT_ADD0 或者 BOOT_ADD1 的值为 0x08000000 或者 0x08100000 来从 Bank1 或者 Bank2 启动。这 个很好理解,但选项字里还有一个 nDBOOT, 这个字段又有什么作用呢?它会怎样影响 STM32F769 的启动过程呢?
SYSCFG_MEMRMP 中 SWP_FB 字段又有什么用呢?除了修改 BOOT_ADDx 还有什么是要注意的吗?下面将一一进行解

使用特权

评论回复
我喜欢打游戏|  楼主 | 2021-11-12 21:44 | 显示全部楼层
nDBOOT 和 SWP_FB 的说明
我们先来了解一下 nDBOOT 和 SWP_FB。
nDBOOT 位于选项字中,只有在 nDBANK 设置为 0 时才有效。
当 nDBOOT 为 1 时,双启动模式被禁止,根据 BOOT_ADDx 的值来决定启动地址。这也是默认的设置;
当 nDBOOT 为 0 时,双启动模式被启用,将始终从系统的 bootloader 启动(如果 BOOT_ADDx 的值在 Flash 范围内),或
者从 RAM 启动(如果 BOOT_ADDx 的值在 RAM 范围内)。
71961618e6f93be57c.png

使用特权

评论回复
我喜欢打游戏|  楼主 | 2021-11-12 21:44 | 显示全部楼层
SWP_FB 位于 SYSCFG_MEMRMP 寄存器中,用来切换 Flash bank1 和 bank2 的地址映射。
当 SWP_FB 的值为 0 时,Bank1 映射到 0x08000000 的位置,从 Bank1 启动程序;
当 SWP_FB 的值为 1 时,Bank2 映射到 0x08100000 的位置,从 Bank2 启动程序。
93895618e6fb8af49c.png

使用特权

评论回复
我喜欢打游戏|  楼主 | 2021-11-12 21:45 | 显示全部楼层
nDBOOT 为 1 时的双 Bank 启动
nDBOOT 默认值就是 1,这时系统启动的地址由 BOOT_ADDx 决定。
这时通过修改 BOOT_ADDx 的值可以改变启动地址。使用这种方法的时候,要注意一个地方:
中断向量表的位置,这里又要注意两个地方:
一个是 link 文件中的中断向量表位置的设置要和实际启动 bank 一致。也就是说,如果 BOOT_ADDx 设为 0x08100000,在
link 文件中中断向量表的位置也应该设置为 0x08100000。以 IAR 为例,BOOT_ADDx 分别为 0x08000000 和 0x08100000
时,link 文件中的设置对比见下图:
98463618e6fea79807.png

使用特权

评论回复
我喜欢打游戏|  楼主 | 2021-11-12 21:46 | 显示全部楼层
另一个地方就是:system_stm32f7xx.c 的函数 SystemInit()中,有没有对中断向量表偏移寄存器进行设置,设置的值是否
和实际启动的位置一致。注意:在 SystemInit 函数中,可以不对 VTOR 寄存器进行设置,MCU 硬件会自动根据启动地址设置
VTOR 的值。如果在 SystemInit 函数中加了对 VTOR 寄存器进行设置的代码就必须保证和实际启动地址一致。
/* Configure the Vector Table location add offset address ------------------*/
#ifdef VECT_TAB_SRAM
SCB->VTOR = SRAM1_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM
*/
#else
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH
*/
#endif
总之,当 nDBOOT 为 1 时,选项字中的 BOOT_ADDx 的值,Link 文件中 FLASH 的起始地址,还有中断向量表的位置都必须
一致,并且设置为想要启动的位置。
修改选项字的内容可以通过 ST-LINK Utility 进行。


使用特权

评论回复
我喜欢打游戏|  楼主 | 2021-11-12 21:47 | 显示全部楼层
nDBOOT 为 0 时的双 Bank 启动
选项字中的 nDBOOT 设置为 0 时,程序会从系统 bootloader 启动,然后会根据 BOOT_ADDx 的值决定从哪里启动。具体
Bootloader 的启动流程见下图(AN2606)。
33960618e7062016b3.png

使用特权

评论回复
我喜欢打游戏|  楼主 | 2021-11-12 21:48 | 显示全部楼层
在上图中,当 BOOT_ADDx 设定的启动地址在 Bank2 时,系统 bootloader 会将 SWP_FB 的值设为 1,将 Bank2 映射到 0x08000000 的位置。从 Bank2 启动程序。当 BOOT_ADDx 设定的启动地址在 Bank1 时,系统 bootloader 会将 SWP_FB 的
值设为 0,将 Bank1 映射到 0x08000000 的位置。从 Bank1 启动程序。
使用这种方法时要注意的是:Link 文件里的 Flash 起始地址,和中断向量表的位置都设置为 0x08000000.
system_stm32f7xx.c 的函数 SystemInit()中对中断向量表偏移地址的设置(如果有的话)要与 Link 文件一致。

使用特权

评论回复
我喜欢打游戏|  楼主 | 2021-11-12 21:49 | 显示全部楼层
总结
说到这里,现在也可以看出这两种方式的区别了。都是通过修改 BOOT_ADDx 来切换启动从两个 Bank 启动。第一种方法,
同一个应用程序,从不同的 Bank 启动时,中断向量表的位置必须在程序中(link 文件中)进行修改。所以实际的 bin 文件是
不同的。也就是说,编程的时候就必须明确程序是放在哪个 Bank 的。而第二种方法,可以将同一个 bin 文件烧写到不同的
Bank。只需要保证文件烧写的位置和 BOOT_ADDx 设置的地址一致就可以了。

使用特权

评论回复
keaibukelian| | 2021-12-6 20:17 | 显示全部楼层
双 bank Flash是其独有的吗

使用特权

评论回复
木木guainv| | 2021-12-6 20:18 | 显示全部楼层
这个有什么优势吗

使用特权

评论回复
guanjiaer| | 2021-12-6 20:19 | 显示全部楼层
一共有三种启动方式的吧

使用特权

评论回复
heimaojingzhang| | 2021-12-6 20:19 | 显示全部楼层
这个也算是一种保险了

使用特权

评论回复
keaibukelian| | 2021-12-6 20:20 | 显示全部楼层
就跟人为分出来两部分似的

使用特权

评论回复
tpgf| | 2021-12-6 20:21 | 显示全部楼层
一共是多大的空间啊

使用特权

评论回复
labasi| | 2021-12-6 20:22 | 显示全部楼层
第二种方式更加灵活

使用特权

评论回复
chenjun89| | 2021-12-6 21:16 | 显示全部楼层
两种方式都可以啊

使用特权

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

本版积分规则

65

主题

469

帖子

0

粉丝