打印
[STM32F1]

UCOS 2中用FLASH模拟EEPROM,往里写数据时会死机原因

[复制链接]
2066|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gozzz|  楼主 | 2015-11-24 10:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用UCOS2 FLASH模拟EEPROM,往里写数据时有时会死机,请教大侠帮忙分析原因
void EE_Program(void)
{       
        u32 EraseCounter = 0x00;        
        u32 NbrOfPage = 0x00;
        FLASH_Status FLASHStatus;
        u32 Address = EE_StartAddr;        
        u32 *pData;       
        u16 i;
        u32 Data;
       
       
//        OS_EXIT_CRITICAL();
       
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //开关预取指缓存
        FLASH_SetLatency(FLASH_Latency_2);  //设置代码延时2周期

        FLASH_Unlock();         //解锁

        NbrOfPage = (EE_EndAddr - EE_StartAddr) / FLASH_PAGE_SIZE;
        //清除FLASH待处理标志位
        FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);        

        //摖除页面
        FLASHStatus = FLASH_COMPLETE;
        for ( EraseCounter = 0; (EraseCounter < NbrOfPage) && (FLASHStatus == FLASH_COMPLETE); EraseCounter++ ) {
                FLASHStatus = FLASH_ErasePage(EE_StartAddr + (FLASH_PAGE_SIZE * EraseCounter));
        }
       
        Address = EE_StartAddr;       
        pData = (u32 *)&Ux[0][1];
        FLASHStatus = FLASH_ProgramWord(Address, *pData);

        Address+=4;
        pData = (u32 *)&Ux[1][1];
        FLASHStatus = FLASH_ProgramWord(Address, *pData);
               
        Address+=4;
        pData = (u32 *)&Ux[2][1];
        FLASHStatus = FLASH_ProgramWord(Address, *pData);
               
        Address+=4;
        pData = (u32 *)&Ix[0][1];
        FLASHStatus = FLASH_ProgramWord(Address, *pData);

        Address+=4;
        pData = (u32 *)&Ix[1][1];
        FLASHStatus = FLASH_ProgramWord(Address, *pData);
               
        Address+=4;
        pData = (u32 *)&Ix[2][1];
        FLASHStatus = FLASH_ProgramWord(Address, *pData);

        Address+=4;
        pData = (u32 *)&Ix[3][1];
        FLASHStatus = FLASH_ProgramWord(Address, *pData);
       
        Address+=4;       
        Data = Sys.LdAct;
        Data <<=8;
        Data |= Sys.LdActT;
        Data <<=8;
        Data |= Sys.LdVar;       
        FLASHStatus = FLASH_ProgramWord(Address, Data);
       
        Address+=4;       
        Data = Sys.In;
        Data <<=8;
        Data |= Sys.Bps;
        Data <<=8;
        Data |= Sys.InT;       
        FLASHStatus = FLASH_ProgramWord(Address, Data);
       
        Address+=4;       
        Data = Sys.Un;
        Data <<=8;
        Data |= Sys.UlT;
        Data <<=8;
        Data |= Sys.ChT;       
        Data <<=8;
        Data |= Sys.ChT_H;       
        FLASHStatus = FLASH_ProgramWord(Address, Data);
       
        Address+=4;       
        Data = Sys.Addr[0];
        Data <<=16;
        Data |= Sys.Addr[1];
        FLASHStatus = FLASH_ProgramWord(Address, Data);
       
        Address+=4;       
        Data = Sys.Uh;
        Data <<=16;
        Data |= Sys.Ul;       
        FLASHStatus = FLASH_ProgramWord(Address,Data);
       
        Address+=4;       
        Data = Sys.Uh;
        Data <<=16;
        Data |= Sys.Ul;       
        FLASHStatus = FLASH_ProgramWord(Address,Data);
       
        for(i=0;i<100;i++) {
                Address+=4;       
                Data = ErrData[i].ErrTime.Sec;
                Data <<=8;
                Data |= ErrData[i].ErrTime.Min;       
                Data <<=8;
                Data |= ErrData[i].ErrTime.Hour;       
                Data <<=8;
                Data |= ErrData[i].ErrTime.Day;       
                FLASHStatus = FLASH_ProgramWord(Address,Data);       
               
                Address+=4;       
                Data = ErrData[i].ErrTime.Week;
                Data <<=8;
                Data |= ErrData[i].ErrTime.Month;       
                Data <<=8;
                Data |= ErrData[i].ErrTime.Year;       
                Data <<=8;
                Data = ErrData[i].ErrType;
                FLASHStatus = FLASH_ProgramWord(Address,Data);       
               
                Address+=4;
                Data = ErrData[i].ErrVar;       
                FLASHStatus = FLASH_ProgramWord(Address,Data);                       
        }
       
        FLASH_Lock();
       
//        OS_ENTER_CRITICAL();
}
沙发
gozzz|  楼主 | 2015-11-24 12:22 | 只看该作者
顶起

使用特权

评论回复
板凳
ticomi| | 2015-11-24 13:22 | 只看该作者
主要看下,地址是否对齐和偶数地址开始写数据!

使用特权

评论回复
地板
gozzz|  楼主 | 2015-11-24 13:40 | 只看该作者
#define EE_StartAddr  ((u32)0x0800F000)        //必须0x8000000+代码大小以上   73576  1b0
#define EE_EndAddr    ((u32)0x08010000)
#define FLASH_PAGE_SIZE    ((u16)1024)

使用特权

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

本版积分规则

17

主题

314

帖子

2

粉丝