#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++; } }