#include "Flash.h" #include "Uart.h" /******************************** * @brief OTA参数初始化 * @retval FLASH_COMPLETE初始成功 ********************************/ uint8_t Flash_RangeErase(uint32_t FlashAddress, uint32_t Size) { uint8_t flag = 1; uint32_t msize=0; fmc_state_enum FlashStatus = FMC_READY; while(Size > msize) { fmc_unlock();/* 解锁flash */ fmc_flag_clear(FMC_FLAG_BANK0_END);//清除操作结束标志 fmc_flag_clear(FMC_FLAG_BANK0_WPERR);//清除擦除/错误标志 fmc_flag_clear(FMC_FLAG_BANK0_PGERR);//清楚页编程错误标志 FlashStatus = fmc_page_erase(FlashAddress+msize);//擦除指定的页,参数页地址 fmc_lock();/* flash加锁,禁止编程 */ /* If erase operation was failed, a Flash error code is returned */ if (FlashStatus != FMC_READY) { flag = 0; break; } msize += FLASH_PAGE_SIZE; } return flag; } uint8_t Flash_PageErase(uint8_t _PageNumber) { uint8_t flag = 0; if(_PageNumber > 127) return 0; fmc_unlock();/* 解锁flash */ fmc_flag_clear(FMC_FLAG_BANK0_END);//清除操作结束标志 fmc_flag_clear(FMC_FLAG_BANK0_WPERR);//清除擦除/错误标志 fmc_flag_clear(FMC_FLAG_BANK0_PGERR);//清楚页编程错误标志 if( fmc_page_erase(FLASH_USER_START_ADDR + (FLASH_PAGE_SIZE * _PageNumber)) == FMC_READY ) { flag = 1; } fmc_lock();/* flash加锁,禁止编程 */ // Lock the Flash to disable the flash control register access return flag; } uint8_t Flash_BufferWrite(uint32_t address, uint32_t *p_buffer, uint32_t len) { uint8_t flag = 1; uint32_t EndAddr = 0; //uint32_t *p_buffer = (uint32_t *)buffer; if(address%4||len%4) { return 0; } fmc_unlock();/* 解锁flash */ fmc_flag_clear(FMC_FLAG_BANK0_END);//清除操作结束标志 fmc_flag_clear(FMC_FLAG_BANK0_WPERR);//清除擦除/错误标志 fmc_flag_clear(FMC_FLAG_BANK0_PGERR);//清楚页编程错误标志 EndAddr = address + len; while (address < EndAddr) { if (fmc_word_program(address, *p_buffer) == FMC_READY) { p_buffer++; address += 4; } else { flag = 0;// Error occurred while writing data in Flash memory. break; } } fmc_lock();/* flash加锁,禁止编程 */ return flag; } uint8_t Flash_BufferWrite_uint16(uint32_t address, uint16_t *p_buffer, uint32_t len) { uint8_t flag = 1; uint32_t EndAddr = 0; fmc_unlock();/* 解锁flash */ fmc_flag_clear(FMC_FLAG_BANK0_END);//清除操作结束标志 fmc_flag_clear(FMC_FLAG_BANK0_WPERR);//清除擦除/错误标志 fmc_flag_clear(FMC_FLAG_BANK0_PGERR);//清楚页编程错误标志 EndAddr = address + len; while (address < EndAddr) { if (fmc_halfword_program(address, *p_buffer) == FMC_READY) { p_buffer++; address += 2; } else { flag = 0;// Error occurred while writing data in Flash memory. break; } } fmc_lock();/* flash加锁,禁止编程 */ return flag; } void Flash_BufferRead(uint32_t address, uint8_t *buffer, uint32_t len) { uint32_t EndAddr = 0; uint8_t *p_buffer = (uint8_t *)buffer; // if(address%4||len%4) { // return ; // } fmc_unlock();/* 解锁flash */ fmc_flag_clear(FMC_FLAG_BANK0_END);//清除操作结束标志 fmc_flag_clear(FMC_FLAG_BANK0_WPERR);//清除擦除/错误标志 fmc_flag_clear(FMC_FLAG_BANK0_PGERR);//清楚页编程错误标志 EndAddr = address + len; while (address < EndAddr) { *p_buffer++ = *(__IO uint8_t *)address; address += 1; } fmc_lock();/* flash加锁,禁止编程 */ } void Flash_BufferRead_btye4(uint32_t address, uint8_t *buffer, uint32_t len) { uint32_t EndAddr = 0; uint32_t *p_buffer = (uint32_t *)buffer; if(address%4||len%4) { return ; } fmc_unlock();/* 解锁flash */ fmc_flag_clear(FMC_FLAG_BANK0_END);//清除操作结束标志 fmc_flag_clear(FMC_FLAG_BANK0_WPERR);//清除擦除/错误标志 fmc_flag_clear(FMC_FLAG_BANK0_PGERR);//清楚页编程错误标志 EndAddr = address + len; while (address < EndAddr) { *p_buffer++ = *(__IO uint32_t *)address; address += 4; } fmc_lock();/* flash加锁,禁止编程 */ } //读取flash中有效数据的长度 uint32_t Flash_DatalenRead(uint32_t address,uint32_t len) { uint32_t BeginAddr = 0; uint32_t addrlen = 0; uint32_t data; if(address%4||len%4) { return addrlen; } fmc_unlock();/* 解锁flash */ fmc_flag_clear(FMC_FLAG_BANK0_END);//清除操作结束标志 fmc_flag_clear(FMC_FLAG_BANK0_WPERR);//清除擦除/错误标志 fmc_flag_clear(FMC_FLAG_BANK0_PGERR);//清楚页编程错误标志 BeginAddr = address + len - 4; while(address < BeginAddr) { data = *(__IO uint32_t *)BeginAddr; if(data != 0xFFFFFFFF) break; BeginAddr -= 4; } fmc_lock();/* flash加锁,禁止编程 */ if(address <= BeginAddr) { addrlen = (BeginAddr+4) - address; } return addrlen; } void flash_test(void) { uint8_t data[8] = {11,22,33,45,100,23,67,89}; uint8_t i = 0,outda[8] = {0}; printf("eraser flash one page 0x8018000\r\n"); Flash_RangeErase(0x8018000,2048); printf("write flash 0x8018000\r\n"); Flash_BufferWrite(0x8018000,(uint32_t*)data,8);//正常的flash 写入 printf("read flash 0x8018000\r\n"); Flash_BufferRead(0x8018000,outda,8);//数据存入到outda中 for(i=0;i<8;i++){ printf("%d, ",outda[i]); } printf("\r\n"); Flash_RangeErase(0x8018000,2048); printf("eraser flash and test finish\r\n"); }