打印

板子断电重启 FLASH内容丢失

[复制链接]
2394|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的代码
void STMFLASH_Write(u32 WriteAddr,u8 *pBuffer,u16 NumToWrite)        
{
        u16 byteN = 0;

        if(( WriteAddr > STM32_FLASH_BASE ) && (WriteAddr < ( STM32_FLASH_BASE + 1024*STM32_FLASH_SIZE )))
        {
                FLASH_Unlock();
                FLASH_ErasePage(WriteAddr);

                while(NumToWrite)
                {       
                        Flash_Temp16.un_temp8[0] = *( pBuffer + byteN );
                        Flash_Temp16.un_temp8[1] = *( pBuffer + byteN + 1 );                       
                        FLASH_ProgramHalfWord(( WriteAddr + byteN ), Flash_Temp16.un_temp16 );                  
                        if( 1 == NumToWrite )
                        {
                                break;                                                                                                          
                        }
                        else//
                        {
                                byteN += 2;
                                NumToWrite -= 2;
                        }         
                }
                FLASH_Lock();//
        }
}

读FLASH的代码
void FlashReadStr( u32 flash_add, u16 len, u8* data )
{
        u16 byteN = 0;
        if(( flash_add > STM32_FLASH_BASE ) && (flash_add < (STM32_FLASH_BASE+1024*STM32_FLASH_SIZE))
                && ( NULL != data ))
        {       
                while( len )
                {
                        Flash_Temp16.un_temp16 = *(vu16*)(flash_add+byteN);
                        if( 1==len )
                        {
                                *(data+byteN) = Flash_Temp16.un_temp8[0];
                                break;                          
                        }
                        else
                        {               
                                *(data+byteN) = Flash_Temp16.un_temp8[0];
                                *(data+byteN+1) = Flash_Temp16.un_temp8[1];
                                byteN += 2;
                                len -= 2;
                        }
                }
        }
}

使用特权

评论回复
地板
拿起书本| | 2013-5-6 16:00 | 只看该作者
flash的读写时by sector的也就是说即使你只写一个byte 它也会把整个扇区重写. 这需要一定的时间, 所以如果你立刻断电数据不一定写进去了,因为他需要写整整一个扇区的数据.

使用特权

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

你的意思是说我要在FLASH上锁前,延迟一段时间?给写FLASH一段时间?

使用特权

评论回复
6
liuhuaqiang1118| | 2018-5-31 20:42 | 只看该作者
arlenchan 发表于 2013-5-6 16:09
你的意思是说我要在FLASH上锁前,延迟一段时间?给写FLASH一段时间?

你好这问题解决没呢,我也遇到,偶尔掉电DATAFLASH也会掉

使用特权

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

本版积分规则

2

主题

9

帖子

0

粉丝