#include "stm32f10x.h"
 
#define FLASH_PAGE_SIZE      ((u16)0x400)
#define FLASH_START_ADDR     ((u32)0x08008000)
#define FLASH_END_ADDR       ((u32)0x0800C000)
#define FLASH_NUMBER_OF_PAGE ((u32)(FLASH_END_ADDR - FLASH_START_ADDR) / FLASH_PAGE_SIZE)
#define FLASH_DATA_SIZE      ((u32)(FLASH_END_ADDR - FLASH_START_ADDR) / 4)
 
/**
 * Flash - cteni a zapis.
 *
 * Jakub Trmota (trmotjak)
 */
 
/**
 * Zapis dat z bufferu do pameti flash.
 * @param buffer buffer wordu
 * @param bufferSize velikost bufferu
 */
void FlashWrite(uint32_t *buffer, uint32_t bufferSize)
{
	FLASH_Status flashStatus = FLASH_COMPLETE;
	uint32_t address = FLASH_START_ADDR;
	uint32_t eraseCounter = 0;
	uint32_t bufferIndex = 0;
 
	/* Unlock the Flash Program Erase controller */
	FLASH_Unlock();
 
	/* Clear All pending flags */
	FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);	
 
	/* Erase the FLASH pages */
	for(eraseCounter = 0; (eraseCounter < FLASH_NUMBER_OF_PAGE) && (flashStatus == FLASH_COMPLETE); eraseCounter++)
	{
		flashStatus = FLASH_ErasePage(FLASH_START_ADDR + (FLASH_PAGE_SIZE * eraseCounter));
	}
 
	/*  FLASH Word program of data 0x15041979 at addresses defined by StartAddr and EndAddr */	
	while((bufferIndex < bufferSize) && (address < FLASH_END_ADDR) && (flashStatus == FLASH_COMPLETE))
	{
		flashStatus = FLASH_ProgramWord(address, *buffer);
		address += 4;
		buffer++;
		bufferIndex++;
	}
}
 
/**
 * Cteni dat z pameti flash a ulozeni do bufferu.
 * @param buffer buffer wordu
 * @param bufferSize velikost bufferu
 */
void FlashRead(uint32_t *buffer, uint32_t bufferSize)
{
	uint32_t address = FLASH_START_ADDR;
	uint32_t bufferIndex = 0;
 
	while((bufferIndex < bufferSize) && (address < FLASH_END_ADDR))
	{
		*buffer = (*(uint32_t*) address);
 
		address += 4;
		buffer++;
		bufferIndex++;
	}	
}