编译器V6.22
工程配置
.sct文件代码修改
STM32L476内存64位对齐
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x08000000 0x0000A000 { ; load region size_region
ER_IROM1 0x08000000 0x0000A000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
.ANY (+XO)
}
MY_IRAM 0x20000000 UNINIT 0x00000004 { ; RW data
*(.bss.NoInit)
}
RW_IRAM1 0x20000008 0x00017FF8 { ; RW data
.ANY (+RW +ZI)
}
RW_IRAM2 0x10000000 0x00008000 {
.ANY (+RW +ZI)
}
}
变量应用
uint32_t g_JumpInit __attribute__((section(".bss.NoInit")));
if(g_JumpInit == 0xAA553344)
{
// 。。。
}
作用
在RAM中创建一个不会被初始化的区域,保证断电重启后变量不会被清除
应用场景
可作为BOOT程序与APP程序共享区域使用
使用原因
最近在开发一款Keil环境下的STM32L476项目,库函数为HAL库,实现BOOT升级APP程序功能,需要一个标志位在启动进入BOOT程序时判断直接跳转APP还是升级程序;
刚开始使用内部Flash,测试发现在BOOT程序中读写擦除一切正常,跳转APP程序后经常出现写入失败情况,原因最终并未查找到;
现改为非零初始化变量实现此需求。