예제 #1
0
void Flash_Init(void)
{
	uint8_t i;
	for (i = 0; i < USED_SIZE / 4; i++)
	{
		Using_Values[i] = 0xFFFFFFFF;
	}
	SYS_UnlockReg();
	_FMC_ENABLE_ISP();
	//SYS_LockReg();
}
예제 #2
0
void DataFlashRead(uint32_t addr, uint32_t size, uint32_t buffer)
{
    /* This is low level read function of USB Mass Storage */
    int32_t len;

    /* Modify the address to MASS_STORAGE_OFFSET */
    addr += MASS_STORAGE_OFFSET;
    
    len = (int32_t)size;
    
    UNLOCKREG();
    _FMC_ENABLE_ISP();
    
    while(len >= FLASH_PAGE_SIZE)
    {
        FMC_ReadPage(addr, (uint32_t *)buffer);
        addr   += FLASH_PAGE_SIZE;
        buffer += FLASH_PAGE_SIZE;
        len  -= FLASH_PAGE_SIZE;
    }
    
    _FMC_DISABLE_ISP();
    LOCKREG();
}
예제 #3
0
파일: Flash.c 프로젝트: antijiang/CTEDUST
void Flash_Init(void)
{
    SYS_UnlockReg();
    _FMC_ENABLE_ISP();
    //SYS_LockReg();
}
예제 #4
0
void DataFlashWrite(uint32_t addr, uint32_t size, uint32_t buffer)
{
    /* This is low level write function of USB Mass Storage */
    int32_t len, i, offset;
    uint32_t *pu32;
    uint32_t alignAddr;

    /* Modify the address to MASS_STORAGE_OFFSET */
    addr += MASS_STORAGE_OFFSET;

    len = (int32_t)size;
    
    UNLOCKREG();
    _FMC_ENABLE_ISP();

    if ( len == FLASH_PAGE_SIZE && ((addr & (FLASH_PAGE_SIZE-1)) == 0) )
    {
        FMC_Erase(addr);

        while (len >= FLASH_PAGE_SIZE)
        {
            FMC_ProgramPage(addr, (uint32_t *) buffer);
            len    -= FLASH_PAGE_SIZE;
            buffer += FLASH_PAGE_SIZE;
            addr   += FLASH_PAGE_SIZE;      
        }
    }
    else
    {
        do
        {
            alignAddr = addr & 0x1FE00;
            
            /* Get the sector offset*/
            offset = ( addr & (FLASH_PAGE_SIZE-1) );  
            
            if ( offset || (size < FLASH_PAGE_SIZE) )
            {
                /* Non 4k alignment. Note: It needs to avoid add MASS_STORAGE_OFFSET twice. */
                DataFlashRead(alignAddr - MASS_STORAGE_OFFSET, FLASH_PAGE_SIZE, (uint32_t)&g_sectorBuf[0]);

            }
            
            /* Update the data */
            pu32 = (uint32_t *)buffer;
            len = FLASH_PAGE_SIZE - offset;
            if (size < len)
                len = size;
            
            for (i=0;i<len/4;i++)
            {
                g_sectorBuf[offset/4 + i] = pu32[i];
            }
            
            FMC_Erase(alignAddr);
            
            for(i=0;i<16;i++)
            {
                FMC_ProgramPage(alignAddr + (i << 8), (uint32_t *) g_sectorBuf + (i << 8));
            }

            size -= len;
            addr += len;
            buffer += len;
            
        } while (size > 0);       
    }
    
    _FMC_DISABLE_ISP();
    LOCKREG();
}