feat: KT mBMS 펌웨어 3종(HW1/2/3) 및 통합 빌드 환경 초기 커밋 (V4.0.0.1)
This commit is contained in:
253
APP_R3323/App/Hardware/flash_if.c
Normal file
253
APP_R3323/App/Hardware/flash_if.c
Normal file
@@ -0,0 +1,253 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file flash_if.h
|
||||
* @author AMG Energy Solution Team
|
||||
* @version V1.0.0
|
||||
* @date 07-Feb-2022
|
||||
* @brief This file provides all the headers of the flash memory functions.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2022 AMG</center></h2>
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/** @addtogroup mBMS2
|
||||
* @{
|
||||
*/
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "flash_if.h"
|
||||
#include "stdio.h"
|
||||
|
||||
/* Private typedef -----------------------------------------------------------*/
|
||||
/* Private define ------------------------------------------------------------*/
|
||||
/* Private macro -------------------------------------------------------------*/
|
||||
/* Private variables ---------------------------------------------------------*/
|
||||
FW_INFO fwinfo;
|
||||
|
||||
/* Private function prototypes -----------------------------------------------*/
|
||||
/* Private functions ---------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* @brief Unlocks Flash for write access
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void FLASH_If_Init(void)
|
||||
{
|
||||
/* Unlock EFM. */
|
||||
EFM_Unlock();
|
||||
|
||||
/* Enable flash. */
|
||||
EFM_FlashCmd(Enable);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function does an erase of all user flash area
|
||||
* @param StartSector: start of user flash area
|
||||
* @retval 0: user flash area successfully erased
|
||||
* 1: error occurred
|
||||
*/
|
||||
uint32_t FLASH_If_Erase(uint32_t StartSector, uint32_t uSize)
|
||||
{
|
||||
uint32_t UserStartSector, UserEndSector, i = 0;
|
||||
|
||||
/* Unlock EFM. */
|
||||
EFM_Unlock();
|
||||
|
||||
/* Enable flash. */
|
||||
EFM_FlashCmd(Enable);
|
||||
/* Wait flash ready. */
|
||||
while(Set != EFM_GetFlagStatus(EFM_FLAG_RDY))
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
/* Get the sector where start the user flash area */
|
||||
UserStartSector = StartSector;
|
||||
UserEndSector = (StartSector + uSize);
|
||||
|
||||
for(i = UserStartSector; i <= UserEndSector; i += SECTOR_SIZE)
|
||||
{
|
||||
/* Reload IWDG counter */
|
||||
WDT_RefreshCounter();
|
||||
|
||||
/* Device voltage range supposed to be [2.7V to 3.6V], the operation will
|
||||
be done by word */
|
||||
if (EFM_SectorErase(i) != Ok)
|
||||
{
|
||||
/* Error occurred while page erase */
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
|
||||
/* Lock EFM. */
|
||||
EFM_Lock();
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function does an erase of all user flash area
|
||||
* @param StartSector: start of user flash area
|
||||
* @retval 0: user flash area successfully erased
|
||||
* 1: error occurred
|
||||
*/
|
||||
uint32_t FLASH_If_SingleSectorErase(uint32_t SectorAddr)
|
||||
{
|
||||
uint32_t result = 0;
|
||||
|
||||
/* Unlock EFM. */
|
||||
EFM_Unlock();
|
||||
|
||||
/* Enable flash. */
|
||||
EFM_FlashCmd(Enable);
|
||||
/* Wait flash ready. */
|
||||
while(Set != EFM_GetFlagStatus(EFM_FLAG_RDY))
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
/* Reload IWDG counter */
|
||||
WDT_RefreshCounter();
|
||||
|
||||
/* Device voltage range supposed to be [2.7V to 3.6V], the operation will
|
||||
be done by word */
|
||||
if (EFM_SectorErase(SectorAddr) != Ok)
|
||||
{
|
||||
/* Error occurred while page erase */
|
||||
result = (1);
|
||||
}
|
||||
|
||||
/* Lock EFM. */
|
||||
EFM_Lock();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function writes a data buffer in flash (data are 32-bit aligned).
|
||||
* @note After writing data buffer, the flash content is checked.
|
||||
* @param FlashAddress: start address for writing data buffer
|
||||
* @param Data: pointer on data buffer
|
||||
* @param DataLength: length of data buffer (unit is 32-bit word)
|
||||
* @retval 0: Data successfully written to Flash memory
|
||||
* 1: Error occurred while writing data in Flash memory
|
||||
* 2: Written Data in flash memory is different from expected one
|
||||
*/
|
||||
uint32_t FLASH_If_Write(__IO uint32_t* FlashAddress, uint32_t* Data, uint32_t DataLength)
|
||||
{
|
||||
uint32_t i = 0;
|
||||
uint32_t result = 0;
|
||||
|
||||
/* Unlock EFM. */
|
||||
EFM_Unlock();
|
||||
|
||||
/* Enable flash. */
|
||||
EFM_FlashCmd(Enable);
|
||||
/* Wait flash ready. */
|
||||
while(Set != EFM_GetFlagStatus(EFM_FLAG_RDY))
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
for (i = 0; (i < DataLength) && (*FlashAddress <= (mBMS_FW_DN_END_ADDRESS - 4)); i++)
|
||||
{
|
||||
/* Device voltage range supposed to be [2.7V to 3.6V], the operation will
|
||||
be done by word */
|
||||
if (EFM_SingleProgram(*FlashAddress, *(uint32_t *)(Data + i)) == Ok)
|
||||
{
|
||||
/* Check the written value */
|
||||
if (*(uint32_t*)*FlashAddress != *(uint32_t *)(Data + i))
|
||||
{
|
||||
/* Flash content doesn't match SRAM content */
|
||||
result = 2;
|
||||
break;
|
||||
}
|
||||
/* Increment FLASH destination address */
|
||||
*FlashAddress += 4;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Error occurred while writing data in Flash memory */
|
||||
result = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Lock EFM. */
|
||||
EFM_Lock();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
///**
|
||||
// * @brief Returns the write protection status of user flash area.
|
||||
// * @param None
|
||||
// * @retval 0: No write protected sectors inside the user flash area
|
||||
// * 1: Some sectors inside the user flash area are write protected
|
||||
// */
|
||||
//uint16_t FLASH_If_GetWriteProtectionStatus(void)
|
||||
//{
|
||||
// uint32_t UserStartSector = FLASH_Sector_1;
|
||||
|
||||
// /* Get the sector where start the user flash area */
|
||||
// UserStartSector = GetSector(APPLICATION_ADDRESS);
|
||||
|
||||
// /* Check if there are write protected sectors inside the user flash area */
|
||||
// if ((FLASH_OB_GetWRP() >> (UserStartSector/8)) == (0xFFF >> (UserStartSector/8)))
|
||||
// { /* No write protected sectors inside the user flash area */
|
||||
// return 1;
|
||||
// }
|
||||
// else
|
||||
// { /* Some sectors inside the user flash area are write protected */
|
||||
// return 0;
|
||||
// }
|
||||
//}
|
||||
|
||||
///**
|
||||
// * @brief Disables the write protection of user flash area.
|
||||
// * @param None
|
||||
// * @retval 1: Write Protection successfully disabled
|
||||
// * 2: Error: Flash write unprotection failed
|
||||
// */
|
||||
//uint32_t FLASH_If_DisableWriteProtection(void)
|
||||
//{
|
||||
// __IO uint32_t UserStartSector = FLASH_Sector_1, UserWrpSectors = OB_WRP_Sector_1;
|
||||
|
||||
// /* Get the sector where start the user flash area */
|
||||
// UserStartSector = GetSector(APPLICATION_ADDRESS);
|
||||
|
||||
// /* Mark all sectors inside the user flash area as non protected */
|
||||
// UserWrpSectors = 0xFFF-((1 << (UserStartSector/8))-1);
|
||||
//
|
||||
// /* Unlock the Option Bytes */
|
||||
// FLASH_OB_Unlock();
|
||||
|
||||
// /* Disable the write protection for all sectors inside the user flash area */
|
||||
// FLASH_OB_WRPConfig(UserWrpSectors, DISABLE);
|
||||
|
||||
// /* Start the Option Bytes programming process. */
|
||||
// if (FLASH_OB_Launch() != FLASH_COMPLETE)
|
||||
// {
|
||||
// /* Error: Flash write unprotection failed */
|
||||
// return (2);
|
||||
// }
|
||||
|
||||
// /* Write Protection successfully disabled */
|
||||
// return (1);
|
||||
//}
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/*******************(C)COPYRIGHT 2022 AMG ********************END OF FILE******/
|
||||
Reference in New Issue
Block a user