STM32F103C8T6 读写内部flash重新上电后不能启动了

2019-07-14 16:25发布

volatile static uint32_t Addr_Reserved = 0X0800E000 ;


__disable_irq ();//关中断
               
FLASH_Unlock(); //解锁写保护
FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
                 
FLASHStatus = FLASH_ErasePage(Addr_Reserved );
FLASHStatus = FLASH_ProgramWord( Addr_Reserved , 0x12345678);


FLASH_Lock();//上锁写保护
__enable_irq ();




现象:
1、擦除完 flash,写入新的数据(0X12345678),再读出来都正常,程序也能正常运转。
     当断电以后,重新上电,整个程序都不运行了,没任何反应。

2、如果不擦除, 直接写入,写入正常,程序运转也正常,     重新启动上电也运转正常
     但是不能第二次写入了,因为数据不再是0XFF的原因吧。

问题应该发生在erase的过程当中。但是不知道哪里出错了
这是编译完的大小
Program Size: Code=34370 RO-data=22986 RW-data=4444 ZI-data=2996  

这是map文件的尾部数据,我是操作的尾部没有代码的地方的。在0x0800e000 我定义的是一个const常量,
    0x08009766   0x00000490   Data   RO         1008    .constdata          bmp_icon.o
     0x08009bf6   0x00000200   Data   RO         1072    .constdata          mbcrc.o
     0x08009df6   0x00000028   Data   RO         1365    .constdata          c_w.l(_printf_hex_int.o)
     0x08009e1e   0x00000011   Data   RO         1395    .constdata          c_w.l(__printf_flags_wp.o)
     0x08009e2f   0x00000001   PAD
     0x08009e30   0x00000094   Data   RO         1617    .constdata          c_w.l(bigflt0.o)
     0x08009ec4   0x00000063   Data   RO         1087    .conststring        mbrtu.o
     0x08009f27   0x00000001   PAD
     0x08009f28   0x00000044   Data   RO         1167    .conststring        mbascii.o
     0x08009f6c   0x00000020   Data   RO         1749    Region$$Table       anon$$obj.o
     0x08009f8c   0x0000001c   Data   RO         1645    locale$$data        c_w.l(lc_numeric_c.o)
     0x08009fa8   0x00004058   PAD
     0x0800e000   0x0000000c   Data   RO          639    .ARM.__AT_0x0800E000  Reserved_Data.o//此处我定义了三个 const  unsigned int  常量在这个位置,前后都没有东西的。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
niggle
1楼-- · 2019-07-16 17:02
 精彩回答 2  元偷偷看……
mingodong
2楼-- · 2019-07-16 17:30
请问怎么看这一页是否有东西,请老师指点
uvysdfydad
3楼-- · 2019-07-16 21:28
看了下,你的程序占用FLASH空间是Code + RO-data + RW-data 也就是34370 +22986 + 4444 = 61800 也就是说是61K,要占用到FLASH到0x0800F200的地址空间了。
而你要写入的地址是0x0800E000 ,你自己 看会不会出问题呢?
所以你要写的地址要在0x0800F200以后,才不会出错。
ggfvxv
4楼-- · 2019-07-16 23:04
启动代码擦除了
uvysdfydad
5楼-- · 2019-07-17 01:14
0x08009766   0x00000490   Data   RO         1008    .constdata          bmp_icon.o
     0x08009bf6   0x00000200   Data   RO         1072    .constdata          mbcrc.o
     0x08009df6   0x00000028   Data   RO         1365    .constdata          c_w.l(_printf_hex_int.o)
     0x08009e1e   0x00000011   Data   RO         1395    .constdata          c_w.l(__printf_flags_wp.o)
     0x08009e2f   0x00000001   PAD
     0x08009e30   0x00000094   Data   RO         1617    .constdata          c_w.l(bigflt0.o)
     0x08009ec4   0x00000063   Data   RO         1087    .conststring        mbrtu.o
     0x08009f27   0x00000001   PAD
     0x08009f28   0x00000044   Data   RO         1167    .conststring        mbascii.o
     0x08009f6c   0x00000020   Data   RO         1749    Region$$Table       anon$$obj.o
     0x08009f8c   0x0000001c   Data   RO         1645    locale$$data        c_w.l(lc_numeric_c.o)
     0x08009fa8   0x00004058   PAD
     0x0800e000   0x0000000c   Data   RO          639    .ARM.__AT_0x0800E000  Reserved_Data.o//此处我定义了三个 const  unsigned int  常量在这个位置,前后都没有东西的。

其实,我是指定地址,在0X0800E000上定义了一个const常量,然后我的flash 也是操作的这个地址
您可以看到,从 0X08009FA8 开始,都是PAD,也就是填充空白的。倒数第二段是没有数据的,
Lucia_nie
6楼-- · 2019-07-17 05:16
 精彩回答 2  元偷偷看……

一周热门 更多>