#define FLASH_PAGE_SIZE 2048
#define FLASH_PRG_ADDR  ((uint32_t)0x08000000)
#define FLASH_DATA_ADDR (FLASH_PRG_ADDR + (1024 * 1024 - FLASH_PAGE_SIZE))
//------------------------------
void flashPageRead(uint8_t *pBuf)
{
    uint32_t* src = (void*)FLASH_DATA_ADDR;
    uint32_t* dest = (void*)pBuf;
    for (uint16_t i = 0; i < FLASH_PAGE_SIZE / 4; i++)
        dest[i] = src[i];
}
//------------------------------
void flashPageWrite(uint8_t *pBuf)
{
    flash_unlock();
    flash_sector_erase(FLASH_DATA_ADDR);
    flash_lock();
	
    flash_unlock();
    flash_status_type status = FLASH_OPERATE_DONE;
    uint32_t* src = (void*)pBuf;
	
    for (uint16_t i = 0; i < FLASH_PAGE_SIZE / 4; i++)
    {
        status = flash_word_program(FLASH_DATA_ADDR + i * 4, src[i]);
		
        if (status != FLASH_OPERATE_DONE)
            break;
    }
    flash_lock();
}