打印
[STM32F1]

往里写数据时有时会死机

[复制链接]
589|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dengdc|  楼主 | 2016-9-29 22:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用UCOS2 FLASH模拟EEPROM,往里写数据时有时会死机,请教大侠帮忙分析原因
沙发
jiajs| | 2016-9-29 22:32 | 只看该作者
楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
板凳
dengdc|  楼主 | 2016-9-29 22:32 | 只看该作者
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();
}

使用特权

评论回复
地板
wuhany| | 2016-9-29 22:32 | 只看该作者
主要看下,地址是否对齐和偶数地址开始写数据!

使用特权

评论回复
5
dengdc|  楼主 | 2016-9-29 22:33 | 只看该作者
#define EE_StartAddr  ((u32)0x0800F000)        //必须0x8000000+代码大小以上   73576  1b0
#define EE_EndAddr    ((u32)0x08010000)
#define FLASH_PAGE_SIZE    ((u16)1024)

使用特权

评论回复
6
jiahy| | 2016-9-29 22:33 | 只看该作者
什么意思?不是很明白你说的什么,能再解释一下这个现象吗

使用特权

评论回复
7
dengdc|  楼主 | 2016-9-29 22:34 | 只看该作者
唉,还是没有什么结果,算了,先结贴吧,多谢大家啦

使用特权

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

本版积分规则

892

主题

13885

帖子

7

粉丝