提出问题:

例如:单片机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

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐