[STM32F1] 往里写数据时有时会死机

[复制链接]
722|12
 楼主| dengdc 发表于 2018-12-10 17:03 | 显示全部楼层 |阅读模式
我用UCOS2 FLASH模拟EEPROM,往里写数据时有时会死机,请教大侠帮忙分析原因
jiajs 发表于 2018-12-10 17:07 | 显示全部楼层
楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因
 楼主| dengdc 发表于 2018-12-10 17:11 | 显示全部楼层
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 发表于 2018-12-10 17:14 | 显示全部楼层
主要看下,地址是否对齐和偶数地址开始写数据!
 楼主| dengdc 发表于 2018-12-10 17:18 | 显示全部楼层

#define EE_StartAddr  ((u32)0x0800F000)        //必须0x8000000+代码大小以上   73576  1b0
#define EE_EndAddr    ((u32)0x08010000)
#define FLASH_PAGE_SIZE    ((u16)1024)
jiahy 发表于 2018-12-10 17:22 | 显示全部楼层
什么意思?不是很明白你说的什么,能再解释一下这个现象吗
 楼主| dengdc 发表于 2018-12-10 17:25 | 显示全部楼层
唉,还是没有什么结果,算了,先结贴吧,多谢大家啦
八层楼 发表于 2018-12-13 12:58 | 显示全部楼层
死机的话没有遇到过 是不是等待标志位置位了
八层楼 发表于 2018-12-13 12:58 | 显示全部楼层
死机的话没有遇到过 是不是等待标志位置位了
观海 发表于 2018-12-13 13:03 | 显示全部楼层
估计是死在while里边,了
heimaojingzhang 发表于 2018-12-13 16:34 | 显示全部楼层
卡死在标志位上了应该
paotangsan 发表于 2018-12-13 17:00 | 显示全部楼层
供电稳定吗
wowu 发表于 2018-12-13 17:15 | 显示全部楼层
是不是有强噪音啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

892

主题

13885

帖子

7

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