CubIDE不使用bootload就跳转APP程序,(适用于要求数据掉电保护区,但是单片机扇区紧张的情况)
提出问题:
例如:单片机stm32f401rct6的flash存储扇区结构是:
/*STM32F401xB/C系列的flash分布,F401RCT6只有0~5扇区
Sector 0 0x0800 0000 -0x0800 3FFF 16 Kbytes
Sector 1 0x0800 4000 -0x0800 7FFF 16 Kbytes
Sector 2 0x0800 8000 -0x0800 BFFF 16 Kbytes
Sector 3 0x0800 C000 -0x0800 FFFF 16 Kbytes
Sector 4 0x0801 0000 -0x0801 FFFF 64 Kbytes
Sector 5 0x0802 0000 -0x0803 FFFF 128 Kbytes
如果APP程序占用129KB,掉电保护区要16KB,在没有bootload程序的情况下,正常我们要把APP程序写在0x0800 0000,因为程序大于0~4扇区的存储容量总和128KB,这剩余的1KBAPP程序我们就只能占用扇区5了,如此,就没有扇区可以给数据掉电保护区使用了。
解决问题:
有2种方法
方法①:
修改STM32F401RCTX_FLASH.ld这个文件,在高亮的区域加人这3行代码即可,注意(数据掉电保护区存储首地址不能写扇区0,因为扇区0CubeIDE会写上跳转地址)
.app_data_reserve 0x0800C000 (NOLOAD) :
{
. = . + 16K;
} >FLASH

代码的意思是:“在链接脚本中保留一段Flash区域,不让编译器把任何代码或数据放到里面。”
当然,你得保证你的APP程序存储的扇区字段是FLASH,“FLASH”只是一个可随意改变的名字,总之,67行写了FLASH,48行也得写FLASH;如果67行写了xxx,那48行也得写xxx。
方法②:
也是修改STM32F401RCTX_FLASH.ld这个文件,在高亮的区域加人这2行代码,添加57~62行的代码即可。意思是我在0x08000000创建了一个16KB的区域存储中断向量表。APP程序我写在 0x8001000之后的240KB字节存储里。
/* Memories definition */
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K
FLASH_VECTOR (rx) : ORIGIN = 0x08000000, LENGTH = 16K /* 专门存放向量表 */
FLASH (rx) : ORIGIN = 0x8001000, LENGTH = 240K
}
/* Sections */
SECTIONS
{
/* The startup code into "FLASH" Rom type memory */
.isr_vector :
{
. = ALIGN(4);
KEEP(*(.isr_vector)) /* Startup code */
. = ALIGN(4);
} >FLASH_VECTOR

更多推荐

所有评论(0)