板子断电重启 FLASH内容丢失

[复制链接]
3031|5
 楼主| arlenchan 发表于 2013-5-6 09:52 | 显示全部楼层 |阅读模式
使用的是STM32内部FLASH编程,写FLASH函数主要调用了STM32库函数FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data),

调试的时候,是写进去了,读出来也有,但是板子断电重启后,再读数据就丢失了。怀疑是根本没写到FLASH内,而是写到了RAM中,那么如何写到FLASH中去,写大侠们指点。
IJK 发表于 2013-5-6 10:46 | 显示全部楼层
感觉是 FLASH编程 的步骤没有做完
 楼主| arlenchan 发表于 2013-5-6 11:01 | 显示全部楼层
IJK 发表于 2013-5-6 10:46
感觉是 FLASH编程 的步骤没有做完

写FLASH的代码
  1. void STMFLASH_Write(u32 WriteAddr,u8 *pBuffer,u16 NumToWrite)       
  2. {
  3.         u16 byteN = 0;

  4.         if(( WriteAddr > STM32_FLASH_BASE ) && (WriteAddr < ( STM32_FLASH_BASE + 1024*STM32_FLASH_SIZE )))
  5.         {
  6.                 FLASH_Unlock();
  7.                 FLASH_ErasePage(WriteAddr);

  8.                 while(NumToWrite)
  9.                 {       
  10.                         Flash_Temp16.un_temp8[0] = *( pBuffer + byteN );
  11.                         Flash_Temp16.un_temp8[1] = *( pBuffer + byteN + 1 );                       
  12.                         FLASH_ProgramHalfWord(( WriteAddr + byteN ), Flash_Temp16.un_temp16 );                  
  13.                         if( 1 == NumToWrite )
  14.                         {
  15.                                 break;                                                                                                          
  16.                         }
  17.                         else//
  18.                         {
  19.                                 byteN += 2;
  20.                                 NumToWrite -= 2;
  21.                         }         
  22.                 }
  23.                 FLASH_Lock();//
  24.         }
  25. }

读FLASH的代码
  1. void FlashReadStr( u32 flash_add, u16 len, u8* data )
  2. {
  3.         u16 byteN = 0;
  4.         if(( flash_add > STM32_FLASH_BASE ) && (flash_add < (STM32_FLASH_BASE+1024*STM32_FLASH_SIZE))
  5.                 && ( NULL != data ))
  6.         {       
  7.                 while( len )
  8.                 {
  9.                         Flash_Temp16.un_temp16 = *(vu16*)(flash_add+byteN);
  10.                         if( 1==len )
  11.                         {
  12.                                 *(data+byteN) = Flash_Temp16.un_temp8[0];
  13.                                 break;                          
  14.                         }
  15.                         else
  16.                         {               
  17.                                 *(data+byteN) = Flash_Temp16.un_temp8[0];
  18.                                 *(data+byteN+1) = Flash_Temp16.un_temp8[1];
  19.                                 byteN += 2;
  20.                                 len -= 2;
  21.                         }
  22.                 }
  23.         }
  24. }
拿起书本 发表于 2013-5-6 16:00 | 显示全部楼层
flash的读写时by sector的也就是说即使你只写一个byte 它也会把整个扇区重写. 这需要一定的时间, 所以如果你立刻断电数据不一定写进去了,因为他需要写整整一个扇区的数据.

 楼主| arlenchan 发表于 2013-5-6 16:09 | 显示全部楼层
拿起书本 发表于 2013-5-6 16:00
flash的读写时by sector的也就是说即使你只写一个byte 它也会把整个扇区重写. 这需要一定的时间, 所以如果 ...

你的意思是说我要在FLASH上锁前,延迟一段时间?给写FLASH一段时间?
liuhuaqiang1118 发表于 2018-5-31 20:42 | 显示全部楼层
arlenchan 发表于 2013-5-6 16:09
你的意思是说我要在FLASH上锁前,延迟一段时间?给写FLASH一段时间?

你好这问题解决没呢,我也遇到,偶尔掉电DATAFLASH也会掉
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

9

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部