📄 flashprog.c
字号:
#include "FlashProg.h"
#include "Buffer.h"
static enum {
ST_PROG,
ST_WAIT
} CurState;
static u8 FlashType;
static u32 ProgAddr, ProgData[2], ProgSize;
unsigned FlashProg_ErrSize;
void FlashProg_Reset(u8 type)
{
FlashType = type;
if(type)
ExtFlash_ChipErase();
else
FLASH_SectorErase(FLASH_B0);
CurState = ST_PROG;
ProgAddr = 0;
FlashProg_ErrSize = 0;
}
unsigned FlashProg_GetSize(void)
{
return ProgAddr;
}
int FlashProg_Action(void)
{
if(FlashType)
{
u32 data;
switch(CurState)
{
case ST_PROG:
if((ProgAddr & 2) || !Buf_Get(ProgData, 1))
{
if(ProgAddr > 0x200000 - 2)
return -1;
ExtFlash_Command(0x5555, 0xAAAA);
ExtFlash_Command(0x2AAA, 0x5555);
ExtFlash_Command(0x5555, 0xA0A0);
*(vu16 *)(EXT_FLASH_BASE + ProgAddr) = ProgData[0];
CurState = ST_WAIT;
}
else
return 1;
break;
case ST_WAIT:
data = *(vu16 *)(EXT_FLASH_BASE + ProgAddr);
if(data == *(vu16 *)(EXT_FLASH_BASE + ProgAddr))
{
if(data != (ProgData[0] & 0xFFFF))
FlashProg_ErrSize += 2;
ProgAddr += 2, ProgData[0] >>= 16;
CurState = ST_PROG;
}
break;
}
}
else
{
switch(CurState)
{
case ST_PROG:
if(!Buf_Get(ProgData, 2))
{
if(ProgAddr > 0x40000 - 8)
return -1;
FLASHR->CR0 |= FLASH_DWPG_Mask;
FLASHR->AR = ProgAddr;
FLASHR->DR0 = ProgData[0];
FLASHR->DR1 = ProgData[1];
FLASHR->CR0 |= FLASH_WMS_Mask;
ProgSize = 8;
CurState = ST_WAIT;
}
else if(!Buf_Get(ProgData, 1))
{
if(ProgAddr > 0x40000 - 4)
return -1;
FLASHR->CR0 |= FLASH_WPG_Mask;
FLASHR->AR = ProgAddr;
FLASHR->DR0 = ProgData[0];
FLASHR->CR0 |= FLASH_WMS_Mask;
ProgSize = 4;
CurState = ST_WAIT;
}
else
return 1;
break;
case ST_WAIT:
if(!(FLASHR->CR0 & 0x16))
{
if(*(vu32 *)(INT_FLASH_BASE + ProgAddr) != ProgData[0])
FlashProg_ErrSize += 4;
if(ProgSize > 4 && *(vu32 *)(INT_FLASH_BASE + 4 + ProgAddr) != ProgData[1])
FlashProg_ErrSize += 4;
ProgAddr += ProgSize;
CurState = ST_PROG;
}
break;
}
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -