stm32cubeide中编译非flash起始地址开始的程序
为了实现板卡支持OTA升级,将FLASH主要划分为五个片区,分别用以存储bootloader,app1,app2,parameters,以及升级标志,如下表所示:
地址区间 | 用途 | 说明 |
0x08000000~0x0800BFFF | bootloader | 引导程序 |
0x08020000~0x0807FFFF | APP1 | 运行程序 |
0x08080000~0x080DFFFF | APP2 | 升级程序 |
0x08010000~0x0801FFFF | parameters | 系统参数 |
0x0800FFF0 | upgradeFlag | 升级标志 |
升级的原理在之前的文章中有介绍,这里因为app大小超过了原来规划的存储空间的大小,因此依据MCU的flash sector的划分,要避免不同用途共用一个sector的空间,因此重新规划了分区,目前app的存储区域有6*64k=384k,满足实际项目需要。
在stm32cubeide中进行app的编译的时候,因为程序不是从flash起始地址0x08000000开始运行,因此需要在工程中做以下更改:
1、Core/Src/system_stm32f4xx.c中:
/* #define VECT_TAB_SRAM */
#if defined(VECT_TAB_SRAM)
#define VECT_TAB_BASE_ADDRESS SRAM_BASE /*!< Vector Table base address field.This value must be a multiple of 0x200. */
#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field.This value must be a multiple of 0x200. */
#else
#define VECT_TAB_BASE_ADDRESS FLASH_BASE /*!< Vector Table base address field.This value must be a multiple of 0x200. */
#define VECT_TAB_OFFSET 0x00020000U /*!< Vector Table base offset field.This value must be a multiple of 0x200. */
#endif /* VECT_TAB_SRAM */
将中断向量表偏移值VECT_TAB_OFFSET改为0x0002000U。
2、Inc/STM32F407ZGTX_FLASH.ld中:
/* Memories definition */
MEMORY
{CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64KRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128KFLASH (rx) : ORIGIN = 0x8020000, LENGTH = 384K
}
将FLASH的起始地址改为0x8020000,长度改为384K,表示固件在flash中的开始位置以及长度,当编译时固件大小超过设定长度384K时,编译会提示出错。