BOOL Flash_InPage_Save( uint16_t const * Buffer, uint16_t Count ) { uint16_t i; Flash_Unlock(); if ( !Flash_Page_Erase( EBASE_PAGE0 )) { return FALSE; } if ( Flash_isBusy( ProgramTimeout )) { return FALSE; } SET_BIT( FLASH->CR, FLASH_CR_PG ); for ( i = 0; i < Count; ++i ) { (( __IO uint16_t * )EBASE_PAGE0)[i] = ~ Buffer[i]; if ( Flash_isBusy( ProgramTimeout )) { return FALSE; } } CLEAR_BIT( FLASH->CR, FLASH_CR_PG ); Flash_Lock(); return TRUE; }
BOOL STM32_Flash_Save( uint16_t VirtualAddress, void const * Buffer, uint16_t Count ) { if ( ! Flash_Page_Check( EBASE_PAGE0 )) { Flash_Unlock(); Flash_Page_Write( EBASE_PAGE0, VirtualAddress, Buffer, Count ); if ( Flash_Page_Check( EBASE_PAGE0 )) { Flash_Page_Erase( EBASE_PAGE1 ); Flash_Lock(); return TRUE; } else { ; // 校验失败,保留当前数据 Flash_Lock(); return FALSE; } } else { Flash_Unlock(); Flash_Page_Write( EBASE_PAGE1, VirtualAddress, Buffer, Count ); if ( Flash_Page_Check( EBASE_PAGE1 )) { Flash_Page_Erase( EBASE_PAGE0 ); Flash_Lock(); return TRUE; } else { ; // 校验失败,保留当前数据 Flash_Lock(); return FALSE; } } }
/** * Erase flash sectors * * @param TargetAddress Always from 0 to FLS_TOTAL_SIZE * @param Length * @return */ Std_ReturnType Fls_Erase(Fls_AddressType TargetAddress, Fls_LengthType Length) { #if FLS_BASE_ADDRESS > 0 /* Avoid compiler warning */ TargetAddress += FLS_BASE_ADDRESS; #endif /** @req SWS_Fls_00218 */ /** @req SWS_Fls_00220 */ /** @req SWS_Fls_00327 */ /** @req SWS_Fls_00065 */ VALIDATE_W_RV( Fls_Global.status != MEMIF_UNINIT, FLS_ERASE_ID, FLS_E_UNINIT, E_NOT_OK ); /** @req SWS_Fls_00023 */ VALIDATE_W_RV( Fls_Global.status != MEMIF_BUSY, FLS_ERASE_ID, FLS_E_BUSY, E_NOT_OK ); /** @req SWS_Fls_00020 */ VALIDATE_W_RV( E_OK == sectorAligned( TargetAddress ), FLS_ERASE_ID, FLS_E_PARAM_ADDRESS, E_NOT_OK ); /** @req SWS_Fls_00021 */ VALIDATE_W_RV( (Length != 0) && (EE_OK == sectorAligned( TargetAddress + Length)), FLS_ERASE_ID, FLS_E_PARAM_LENGTH, E_NOT_OK ); #if defined(CFG_MPC5777M) VALIDATE_W_RV((E_OK == checkValidChunk(TargetAddress, TargetAddress + Length - 1)), FLS_ERASE_ID, FLS_E_INVALID_AREA, E_NOT_OK); #endif Fls_Global.status = MEMIF_BUSY; /** @req SWS_Fls_00328 */ Fls_Global.jobResultType = MEMIF_JOB_PENDING; /** @req SWS_Fls_00329 */ Fls_Global.jobType = FLS_JOB_ERASE; Fls_Global.flashAddr = TargetAddress; Fls_Global.length = Length; LOG_HEX2("Fls_Erase() ",TargetAddress," ", Length); /* Unlock */ Flash_Lock(Fls_Global.config->FlsInfo,FLASH_OP_UNLOCK,TargetAddress, Length ); /** @req SWS_Fls_00145 */ if (EE_OK != Flash_Erase(Fls_Global.config->FlsInfo,TargetAddress, Length, NULL )) { return E_NOT_OK; } return E_OK; /** @req SWS_Fls_00330 */ }
/** * Erase flash sectors * * @param TargetAddress Always from 0 to FLS_TOTAL_SIZE * @param Length * @return */ Std_ReturnType Fls_Erase(Fls_AddressType TargetAddress, Fls_LengthType Length) { TargetAddress += FLS_BASE_ADDRESS; /** @req FLS250 3.0/4.0 */ /** @req FLS218 3.0/4.0 */ /** @req FLS220 3.0/4.0 */ /** @req FLS327 4.0 */ /** @req FLS065 */ VALIDATE_W_RV( Fls_Global.status != MEMIF_UNINIT, FLS_ERASE_ID, FLS_E_UNINIT, E_NOT_OK ); /** @req FLS023 */ VALIDATE_W_RV( Fls_Global.status != MEMIF_BUSY, FLS_ERASE_ID, FLS_E_BUSY, E_NOT_OK ); /** @req FLS020 3.0/4.0 */ VALIDATE_W_RV( E_OK == fls_SectorAligned( TargetAddress ), FLS_ERASE_ID, FLS_E_PARAM_ADDRESS, E_NOT_OK ); /** @req FLS021 3.0/4.0 */ VALIDATE_W_RV( (Length != 0) && (EE_OK == fls_SectorAligned( TargetAddress + Length)), FLS_ERASE_ID, FLS_E_PARAM_LENGTH, E_NOT_OK ); // Check if we trying to erase a partition that we are executing in #if 0 pc = fls_GetPc(); #endif Fls_Global.status = MEMIF_BUSY; /** @req FLS219 3.0 */ /** @req FLS328 4.0 */ Fls_Global.jobResultType = MEMIF_JOB_PENDING; /** @req FLS329 4.0 */ Fls_Global.jobType = FLS_JOB_ERASE; Fls_Global.flashAddr = TargetAddress; Fls_Global.length = Length; LOG_HEX2("Fls_Erase() ",TargetAddress," ", Length); /* Unlock */ Flash_Lock(Fls_Global.config->FlsInfo,FLASH_OP_UNLOCK,TargetAddress, Length ); /** @req FLS145 */ Flash_Erase(Fls_Global.config->FlsInfo,TargetAddress, Length, NULL ); return E_OK; /** @req FLS330 4.0 */ }
Std_ReturnType Fls_Write(Fls_AddressType TargetAddress, const uint8 *SourceAddressPtr, Fls_LengthType Length) { #if FLS_BASE_ADDRESS > 0 /* Avoid compiler warning */ TargetAddress += FLS_BASE_ADDRESS; #endif /** @req SWS_Fls_00223 */ /** @req SWS_Fls_00225 */ /** @req SWS_Fls_00226 */ /** @req SWS_Fls_00066 */ VALIDATE_W_RV(Fls_Global.status != MEMIF_UNINIT,FLS_WRITE_ID, FLS_E_UNINIT,E_NOT_OK ); /** @req SWS_Fls_00030 */ VALIDATE_W_RV(Fls_Global.status != MEMIF_BUSY,FLS_WRITE_ID, FLS_E_BUSY,E_NOT_OK ); /** @req SWS_Fls_00157 */ VALIDATE_W_RV(SourceAddressPtr != NULL,FLS_WRITE_ID, FLS_E_PARAM_DATA,E_NOT_OK ); /** @req SWS_Fls_00026 */ VALIDATE_W_RV( ((TargetAddress % FLASH_PAGE_SIZE) == 0) && (E_OK == checkValidAddress(TargetAddress)), FLS_WRITE_ID, FLS_E_PARAM_ADDRESS, E_NOT_OK ); /** @req SWS_Fls_00027 */ VALIDATE_W_RV( ((Length != 0) && ((((TargetAddress + Length) % FLASH_PAGE_SIZE) == 0) && (E_OK == checkValidAddress(TargetAddress + Length -1 )))), FLS_WRITE_ID, FLS_E_PARAM_LENGTH, E_NOT_OK ); #if defined(CFG_MPC5777M) VALIDATE_W_RV((E_OK == checkValidChunk(TargetAddress, TargetAddress + Length - 1)), FLS_WRITE_ID, FLS_E_INVALID_AREA, E_NOT_OK); #endif // Destination is FLS_BASE_ADDRESS + TargetAddress /** @req SWS_Fls_333 */ Fls_Global.jobResultType = MEMIF_JOB_PENDING; /** @req SWS_Fls_332 */ Fls_Global.status = MEMIF_BUSY; Fls_Global.jobType = FLS_JOB_WRITE; // Fill in the required fields for programming... /** @req SWS_Fls_331 */ Fls_Global.flashWriteInfo.source = (uint32)SourceAddressPtr; /*lint !e923 Intended use */ Fls_Global.flashWriteInfo.dest = TargetAddress; Fls_Global.flashWriteInfo.left = Length; if( Fls_Global.mode == MEMIF_MODE_FAST ) { Fls_Global.flashWriteInfo.chunkSize = Fls_Global.config->FlsMaxWriteFastMode; } else { Fls_Global.flashWriteInfo.chunkSize = Fls_Global.config->FlsMaxWriteNormalMode; } // unlock flash for the entire range. Flash_Lock(Fls_Global.config->FlsInfo,FLASH_OP_UNLOCK, TargetAddress, Length ); LOG_HEX2("Fls_Write() ",Fls_Global.flashWriteInfo.dest," ", Fls_Global.flashWriteInfo.left); /* Save to original request */ Fls_Global.flashWriteInfo.pDest = TargetAddress; Fls_Global.flashWriteInfo.pLeft = Length; /** @req SWS_Fls_146 */ if (EE_OK != Flash_ProgramPageStart( Fls_Global.config->FlsInfo, &Fls_Global.flashWriteInfo.dest, &Fls_Global.flashWriteInfo.source, &Fls_Global.flashWriteInfo.left, NULL)) { return E_NOT_OK; } return E_OK; /** @req SWS_Fls_334 */ }
Std_ReturnType Fls_Write(Fls_AddressType TargetAddress, const uint8 *SourceAddressPtr, Fls_LengthType Length) { TargetAddress += FLS_BASE_ADDRESS; /** @req FLS251 3.0 */ /** @req FLS223 3.0 */ /** @req FLS225 3.0/4.0 */ /** @req FLS226 3.0/4.0 */ /** @req FLS066 3.0/4.0 */ /** @req FLS030 3.0/4.0 */ /** @req FLS157 3.0/4.0 */ /** @req FLS026 3.0/4.0 */ /** @req FLS027 3.0/4.0 */ VALIDATE_W_RV(Fls_Global.status != MEMIF_UNINIT,FLS_WRITE_ID, FLS_E_UNINIT,E_NOT_OK ); VALIDATE_W_RV(Fls_Global.status != MEMIF_BUSY,FLS_WRITE_ID, FLS_E_BUSY,E_NOT_OK ); VALIDATE_W_RV(SourceAddressPtr != ((void *)0),FLS_WRITE_ID, FLS_E_PARAM_DATA,E_NOT_OK ); VALIDATE_W_RV( (TargetAddress % FLASH_PAGE_SIZE == 0) && (E_OK == fls_CheckValidAddress(TargetAddress)), FLS_WRITE_ID, FLS_E_PARAM_ADDRESS, E_NOT_OK ); VALIDATE_W_RV( (Length != 0) && (((TargetAddress + Length) % FLASH_PAGE_SIZE) == 0 && (E_OK == fls_CheckValidAddress(TargetAddress + Length))), FLS_WRITE_ID, FLS_E_PARAM_LENGTH, E_NOT_OK ); // Destination is FLS_BASE_ADDRESS + TargetAddress /** @req FLS224 3.0 */ /** @req FLS333 4.0 */ Fls_Global.jobResultType = MEMIF_JOB_PENDING; /** @req FLS332 4.0 */ Fls_Global.status = MEMIF_BUSY; Fls_Global.jobType = FLS_JOB_WRITE; // Fill in the required fields for programming... /** @req FLS331 4.0 */ Fls_Global.flashWriteInfo.source = (uint32) SourceAddressPtr; Fls_Global.flashWriteInfo.dest = TargetAddress; Fls_Global.flashWriteInfo.left = Length; if( Fls_Global.mode == MEMIF_MODE_FAST ) { Fls_Global.flashWriteInfo.chunkSize = Fls_Global.config->FlsMaxWriteFastMode; } else { Fls_Global.flashWriteInfo.chunkSize = Fls_Global.config->FlsMaxWriteNormalMode; } // unlock flash for the entire range. Flash_Lock(Fls_Global.config->FlsInfo,FLASH_OP_UNLOCK, TargetAddress, Length ); LOG_HEX2("Fls_Write() ",Fls_Global.flashWriteInfo.dest," ", Fls_Global.flashWriteInfo.left); #if defined(CFG_FLS_EXTRA_CHECKS) for( int i=0;i<Fls_Global.flashWriteInfo.left;i++) { if( *((uint8 *)Fls_Global.flashWriteInfo.dest + i) != 0xff ) { while(1) {}; } } #endif /* Save to original request */ Fls_Global.flashWriteInfo.pDest = TargetAddress; Fls_Global.flashWriteInfo.pLeft = Length; /** @req FLS146 3.0/4.0 */ Flash_ProgramPageStart( Fls_Global.config->FlsInfo, &Fls_Global.flashWriteInfo.dest, &Fls_Global.flashWriteInfo.source, &Fls_Global.flashWriteInfo.left, NULL); return E_OK; /** @req FLS334 4.0 */ }