pentral0311的笔记 https://bbs.21ic.com/?591061 [收藏] [复制] [RSS]

日志

STM32 复位后初始化变量非零方法

热度 1已有 493 次阅读2018-3-5 11:57 |系统分类:单片机| STM32

由于项目需要,希望能在RAM中,有块区域复位不初始化变量,其实网上资料已经很多,具体如下

参考:http://www.**/mcu/article_2017090934315.html

1.首先寻找加载文件的位置,一般在跟.o文件在一起,也就是生产的目标文件,如本人定义在OBJ文件下



 



2.复制此文件到工程的其他位置,为方便,直接复制在工程文件的首级



并修改文件名为如下





3.如果之前没使用过scantter file的操作,所以再次搜索此操作



参考:http://blog.csdn.net/xianjian1990/article/details/54293349
有详细的说明



 



4.1的参考文献中,编写如下



1: LR_IROM1 0x00000000 0x00080000  {    ; load region size_region



   2:   ER_IROM1 0x00000000 0x00080000  {  ; load address = execution address



   3:    *.o (RESET, +First)



   4:    *(InRoot$$Sections)



   5:    .ANY (+RO)



   6:   }



   7:   RW_IRAM1 0x10000000 0x0000A000  {  ; RW data



   8:    .ANY (+RW +ZI)



   9:   }



  10:   MYRAM 0x1000A000 UNINIT 0x00002000  {



  11:    .ANY (NO_INIT)



  12:   }



  13: }



因为我也是用这个系列的MCU,所以第一次是完全照搬,发现运行不了,查看手册等各种资料,每次都是进入hardfault



对照手册,存储关系如下





5.后面想,是否还是加载的位置错误(不允许如此操作),结合KEIL给出的错误提示,决定修改如下



LR_IROM1 0x08000000 0x00040000  {    ;
load region size_region



 
ER_IROM1 0x08000000 0x00040000 
{  ; load address = execution
address



  
*.o (RESET, +First)



  
*(InRoot$$Sections)



  
.ANY (+RO)



  }



 
RW_IRAM1 0x20000000 0x0000F000 
{  ; RW data



  
.ANY (+RW +ZI)



   }



 
MYRAM 0x2000F000 UNINIT 0x00001000 



  
.ANY (NO_INIT)



  }



 



}



再次编译,下载运行OK了。



 



所以不清楚是作者本身只是示例一下,还是实际运行的案例,如果原作者能看到,还请指教一下 QQ328721520 ,在次先谢过了。



 



6.项目本身是需要在不掉电的情况下,RAM中的特定变量不需要初始化为0,此操作时无任何关系的,但是既然做了,那就看看掉电后是如何的,本人试验情况如下





 



 

1

路过

鸡蛋

鲜花

握手

雷人

刚表态过的朋友 (1 人)

评论 (0 个评论)