打印
[STM32F1]

STM32F103C8T6 读写内部flash,导致重新上电不能启动问题

[复制链接]
6325|27
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mcbot|  楼主 | 2018-10-22 08:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 mcbot 于 2018-10-22 13:13 编辑

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  常量在这个位置,前后都没有东西的。

沙发
磨砂| | 2018-10-22 10:59 | 只看该作者
是不是你擦除掉不应该擦掉的东西了

使用特权

评论回复
评论
mcbot 2018-10-22 11:46 回复TA
应该是擦掉哪里了,才会导致这样,但是找不到具体擦掉哪里了 诡异的是,我擦掉flash,不断电,可以一直正常运行下去,一旦断电重启,就没办法运行了。 
板凳
八层楼| | 2018-10-22 12:03 | 只看该作者
flash地址有没有问题

使用特权

评论回复
地板
jekey| | 2018-10-22 12:39 | 只看该作者
看看你的程序大小是不是已经占用0X0800E000 位置了。

使用特权

评论回复
5
guanjiaer| | 2018-10-22 12:46 | 只看该作者
可能是影响到哪里了 启动代码可能是

使用特权

评论回复
6
heimaojingzhang| | 2018-10-22 12:50 | 只看该作者
楼主 你明显是影响启动代码了

使用特权

评论回复
7
keaibukelian| | 2018-10-22 12:55 | 只看该作者
flash地址冲突了

使用特权

评论回复
8
mcbot|  楼主 | 2018-10-22 13:11 | 只看该作者

0X0800E000   这个地址,我定义的3个 const   unsigned int常量,这个常量前后都没有数据的

使用特权

评论回复
9
mcbot|  楼主 | 2018-10-22 13:12 | 只看该作者
heimaojingzhang 发表于 2018-10-22 12:50
楼主 你明显是影响启动代码了

老师您好,请问,怎么会影响到启动代码,如何修改才能不影响呢。

使用特权

评论回复
10
mcbot|  楼主 | 2018-10-22 13:12 | 只看该作者
jekey 发表于 2018-10-22 12:39
看看你的程序大小是不是已经占用0X0800E000 位置了。

0X0800E000   这个地址,我定义的3个 const   unsigned int常量,这个常量前后都没有数据的

使用特权

评论回复
11
jekey| | 2018-10-22 13:44 | 只看该作者
mcbot 发表于 2018-10-22 13:12
0X0800E000   这个地址,我定义的3个 const   unsigned int常量,这个常量前后都没有数据的 ...

用烧录软件打开生成的程序看,是否这一页都没有被编译器放置了数据。
如果没有,那么,看看擦除的程序是否操作错了地址。

使用特权

评论回复
12
paotangsan| | 2018-10-22 14:26 | 只看该作者
有些地址的flash不能用的

使用特权

评论回复
13
wakayi| | 2018-10-22 15:09 | 只看该作者
肯定擦除了不该擦除的东西

使用特权

评论回复
14
蝴蝶泉2018| | 2018-10-22 15:39 | 只看该作者
flash都是一个page一个page的擦除,你要看看那个page是不是有东西

使用特权

评论回复
评论
mcbot 2018-10-22 16:00 回复TA
请问怎么看这一页是否有东西,请老师指点 
15
mcbot|  楼主 | 2018-10-22 15:51 | 只看该作者
jekey 发表于 2018-10-22 13:44
用烧录软件打开生成的程序看,是否这一页都没有被编译器放置了数据。
如果没有,那么,看看擦除的程序是 ...

好的,多谢你了

使用特权

评论回复
评论
mcbot 2018-10-22 15:59 回复TA
请问,用什么软件可以打开呢? 
16
Ketose| | 2018-10-23 10:26 | 只看该作者
看了下,你的程序占用FLASH空间是Code + RO-data + RW-data 也就是34370 +22986 + 4444 = 61800 也就是说是61K,要占用到FLASH到0x0800F200的地址空间了。
而你要写入的地址是0x0800E000 ,你自己 看会不会出问题呢?
所以你要写的地址要在0x0800F200以后,才不会出错。

使用特权

评论回复
评论
zhouzpd 2018-10-23 21:08 回复TA
有道理 
17
hyh403| | 2018-10-23 15:05 | 只看该作者
启动代码擦除了

使用特权

评论回复
评论
mcbot 2018-10-23 19:22 回复TA
请问怎么会擦除启动代码呢?求指点 
18
mcbot|  楼主 | 2018-10-23 19:24 | 只看该作者
Ketose 发表于 2018-10-23 10:26
看了下,你的程序占用FLASH空间是Code + RO-data + RW-data 也就是34370 +22986 + 4444 = 61800 也就是说 ...

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,也就是填充空白的。倒数第二段是没有数据的,

使用特权

评论回复
评论
zhouzpd 2018-10-23 21:10 回复TA
如果那一列大小加起来不等于61800就说明后面是还有数据的 ,。 
19
Ketose| | 2018-10-24 10:02 | 只看该作者
PAD 可是有数据的,因为对齐的原因,程序的大小和实际占用的ROM大小不一致,才用PAD来表示。
看你的MAP文件最后占用ROM大小就知道了。

使用特权

评论回复
20
mcbot|  楼主 | 2018-10-27 10:52 | 只看该作者
Ketose 发表于 2018-10-24 10:02
PAD 可是有数据的,因为对齐的原因,程序的大小和实际占用的ROM大小不一致,才用PAD来表示。
看你的MAP文件 ...

也就是我要读写最后定义的那个const常量,我需要把1page数据都读出来,然后擦除掉,然后改掉需要修改的部分,再把数据都写进去是吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

255

帖子

1

粉丝