static u32 flash_program_data(u32 start_address, u8 *input_data, u16 num_elements) { u16 iter; u32 current_address = start_address; u32 page_address = start_address; u32 flash_status = 0; /*check if start_address is in proper range*/ if((start_address - FLASH_BASE) >= (FLASH_PAGE_SIZE * (FLASH_PAGE_NUM_MAX+1))) return 1; /*calculate current page address*/ if(start_address % FLASH_PAGE_SIZE) page_address -= (start_address % FLASH_PAGE_SIZE); flash_unlock(); /*Erasing page*/ flash_erase_page(page_address); flash_status = flash_get_status_flags(); if(flash_status != FLASH_SR_EOP) return flash_status; /*programming flash memory*/ for(iter=0; iter<num_elements; iter += 4) { /*programming word data*/ flash_program_word(current_address+iter, *((u32*)(input_data + iter))); flash_status = flash_get_status_flags(); if(flash_status != FLASH_SR_EOP) return flash_status; /*verify if correct data is programmed*/ if(*((u32*)(current_address+iter)) != *((u32*)(input_data + iter))) return FLASH_WRONG_DATA_WRITTEN; } return 0; }
void flash_wait_for_last_operation(void) { while ((flash_get_status_flags() & FLASH_SR_BSY) == FLASH_SR_BSY); }