magiclakesz 发表于 2012-3-8 08:42:16

关于flash,AD,复位的纠结

stm32f103rbt6
需要在程序运行时写入从AD采集到的一个数值到flash 的0x800c000地址处。
第一次运行程序,成功启动系统,并且在0x800c000处成功写入AD采集到的数据。
但是,一旦复位,系统便无法运行:具体现象为晶振能起震,但main函数无法运行。
如果将操作flash的部分屏蔽,程序完全没有任何问题,复位也不会出现奇怪的现象。
flash的操作完全按照官方提供的样例程序进行。
请问我应该从何处下手解决此问题?

发表于 2012-3-8 09:31:29

RE:关于flash,AD,复位的纠结

FLASH处理的问题。FLASH只能写入一次,下次写入的时候需要擦除FLASH这个地址所在的这一片(有的可能叫这一区),才能再次写入。这个是由于FLASH本身的机制决定的。

magiclakesz 发表于 2012-3-8 10:42:37

回复:关于flash,AD,复位的纠结

回复第 2 楼 于2012-03-08 01:31:29发表:
FLASH处理的问题。FLASH只能写入一次,下次写入的时候需要擦除FLASH这个地址所在的这一片(有的可能叫这一区),才能再次写入。这个是由于FLASH本身的机制决定的。 

谢谢你的回复啊,有些问题还是不是很清楚: 
const uint16_t ThresholdValue[]__at(0x800C000)={1000,1000,1000,1000,1000,1000,1000,1000} ;

/*wrtie to flash*/
 FLASH_Unlock();
 FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); 
 if((ret1=FLASH_ErasePage((uint32_t)&ThresholdValue))!=FLASH_COMPLETE)while(1)
  Printf(" flash_erase_err=%d ",ret1);
 for(i=0;i

magiclakesz 发表于 2012-3-8 13:47:22

RE:关于flash,AD,复位的纠结

纠结啊
开始怀疑是擦除的时候把flash全部都插除了所以第一次可以运行(在ram中有代码),第二次就没代码了。
于是将擦除前与擦除后的flash全部都通过串口读出来,发现是一样的。这样就不知道问题出在什么地方了。
有哪位朋友能提供点帮助啊 ,可能是什么地方出问题了呢 ?

发表于 2012-3-8 14:46:04

RE:关于flash,AD,复位的纠结

第二次写FLASH的时候,死到这里了, 擦除的时候用FLASH_ErasePage这个函数。

火雷达 发表于 2012-3-8 22:29:56

回复:关于flash,AD,复位的纠结

是不是你有程序加密的功能?在程序里面加密?
我以前遇到过这种问题,如果有程序加密的话,写flash好像是有问题的。

magiclakesz 发表于 2012-3-9 19:56:41

回复:关于flash,AD,复位的纠结

回复第 5 楼 于2012-03-08 06:46:04发表:
第二次写FLASH的时候,死到这里了, 擦除的时候用FLASH_ErasePage这个函数。 

能麻烦说的稍微详细点么。 我擦除用的是FLASH_ErasePage这个函数啊。然后第二次擦除发生在系统复位重启后才发生,第二次复位后整个系统就无法启动了,测试了下根本就不会运行到flash擦除这个地方来。
如果我第一次运行程序在擦除flash前让系统复位,那么第二次就可以正常启动系统并运行程序。但如果第二次程序对flash进行过操作,那么复位后第三次就无法启动系统。

magiclakesz 发表于 2012-3-9 19:57:46

回复:关于flash,AD,复位的纠结

回复第 6 楼 于2012-03-08 14:29:56发表:
是不是你有程序加密的功能?在程序里面加密?
我以前遇到过这种问题,如果有程序加密的话,写flash好像是有问题的。 

我的程序没有设置加密功能,明天把加密选上试试看。太纠结了。
页: [1]
查看完整版本: 关于flash,AD,复位的纠结