272 lines
6.9 KiB
C
272 lines
6.9 KiB
C
|
|
/*
|
|||
|
|
*********************************************************************************************************
|
|||
|
|
* IAR Development Kits
|
|||
|
|
* on the
|
|||
|
|
*
|
|||
|
|
* M451
|
|||
|
|
*
|
|||
|
|
* Filename : fmc_config.h
|
|||
|
|
* Version : V1.00
|
|||
|
|
* Programmer(s) : Qian Xianghong
|
|||
|
|
*********************************************************************************************************
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
*********************************************************************************************************
|
|||
|
|
* INCLUDE FILES
|
|||
|
|
*********************************************************************************************************
|
|||
|
|
*/
|
|||
|
|
#include "includes.h"
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ<EFBFBD><D6B7>116K
|
|||
|
|
#define DATA_FLASH_BASE 118784ul
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ 119K
|
|||
|
|
#define CONFIG_PARTITON_BASE 121856ul
|
|||
|
|
|
|||
|
|
// Flash<73>ɲ<EFBFBD><C9B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
|
|||
|
|
#define FLASH_ERASE_SIZE 512
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>÷<EFBFBD><C3B7><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>=<3D>ɲ<EFBFBD><C9B2><EFBFBD>ҳ<EFBFBD><D2B3>С
|
|||
|
|
#define CONFIG_PARTITION_SIZE 2048
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>÷ֿ<C3B7><D6BF><EFBFBD>С<EFBFBD><D0A1>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ4<CEAA><34><EFBFBD>飬ѭ<E9A3AC><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD>룩
|
|||
|
|
#define CONFIG_BLOCK_SIZE 512
|
|||
|
|
|
|||
|
|
// ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD>ÿ黮<C3BF><E9BBAE>Ϊ4<CEAA><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
#define CONFIG_DC_SIZE DATA_BUFF_SIZE
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: 0~1, <20>ֿ<EFBFBD><D6BF><EFBFBD>: 0~3<><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: 0~3
|
|||
|
|
#define CONFIG_PARTITION(partition) (partition)
|
|||
|
|
#define CONFIG_BLOCK(block) (block)
|
|||
|
|
#define CONFIG_DC(DC) ((DC) - 1)
|
|||
|
|
|
|||
|
|
// <20><>дFlash<73><68><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
|
|||
|
|
static rd_buff_t rdBuff;
|
|||
|
|
|
|||
|
|
// CAN<41><4E><EFBFBD>͵<EFBFBD><CDB5><EFBFBD>
|
|||
|
|
//OS_MUTEX Config_saveLock;
|
|||
|
|
|
|||
|
|
static uint32_t SetDataFlashBase(uint32_t u32DFBA)
|
|||
|
|
{
|
|||
|
|
uint32_t au32Config[2];
|
|||
|
|
|
|||
|
|
/* Read current User Configuration */
|
|||
|
|
FMC_ReadConfig(au32Config, 1);
|
|||
|
|
|
|||
|
|
/* Just return when Data Flash has been enabled */
|
|||
|
|
if(!(au32Config[0] & 0x1))
|
|||
|
|
return TRUE;
|
|||
|
|
|
|||
|
|
/* Enable User Configuration Update */
|
|||
|
|
FMC_ENABLE_CFG_UPDATE();
|
|||
|
|
|
|||
|
|
/* Erase User Configuration */
|
|||
|
|
FMC_Erase(FMC_CONFIG_BASE);
|
|||
|
|
|
|||
|
|
/* Write User Configuration to Enable Data Flash */
|
|||
|
|
au32Config[0] &= ~0x1;
|
|||
|
|
au32Config[1] = u32DFBA;
|
|||
|
|
|
|||
|
|
if(FMC_WriteConfig(au32Config, 2))
|
|||
|
|
return FALSE;
|
|||
|
|
|
|||
|
|
printf("\nSet Data Flash base as 0x%x.\n", FMC_ReadDataFlashBaseAddr());
|
|||
|
|
|
|||
|
|
/* Perform chip reset to make new User Config take effect */
|
|||
|
|
SYS->IPRST_CTL1 |= SYS_IPRST_CTL1_CHIP_RST_Msk;
|
|||
|
|
|
|||
|
|
return TRUE;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static uint32_t Flash_ErasePartition(uint8_t partition)
|
|||
|
|
{
|
|||
|
|
uint32_t u32StartAddr = CONFIG_PARTITON_BASE
|
|||
|
|
+ CONFIG_PARTITION(partition) * CONFIG_PARTITION_SIZE;
|
|||
|
|
uint32_t u32EndAddr = u32StartAddr + CONFIG_PARTITION_SIZE;
|
|||
|
|
|
|||
|
|
while(u32StartAddr < u32EndAddr)
|
|||
|
|
{
|
|||
|
|
FMC_Erase(u32StartAddr);
|
|||
|
|
u32StartAddr += FLASH_ERASE_SIZE;
|
|||
|
|
}
|
|||
|
|
return TRUE;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static uint32_t Flash_WriteDC(uint8_t partition, uint8_t block, uint8_t DC, rd_buff_t *dataBuff)
|
|||
|
|
{
|
|||
|
|
uint32_t u32StartAddr = CONFIG_PARTITON_BASE
|
|||
|
|
+ CONFIG_PARTITION(partition) * CONFIG_PARTITION_SIZE
|
|||
|
|
+ CONFIG_BLOCK(block) * CONFIG_BLOCK_SIZE
|
|||
|
|
+ CONFIG_DC(DC) * CONFIG_DC_SIZE;
|
|||
|
|
uint32_t u32EndAddr = u32StartAddr + CONFIG_DATA_LEN(DC);
|
|||
|
|
uint32_t u32Addr;
|
|||
|
|
uint8_t i = 0;
|
|||
|
|
|
|||
|
|
for(u32Addr = u32StartAddr; u32Addr < u32EndAddr; u32Addr += 4)
|
|||
|
|
{
|
|||
|
|
FMC_Write(u32Addr, dataBuff->buff32[i++]);
|
|||
|
|
}
|
|||
|
|
return TRUE;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static uint32_t Flash_ReadDC(uint8_t partition, uint8_t block, uint8_t DC, rd_buff_t *dataBuff)
|
|||
|
|
{
|
|||
|
|
uint32_t u32StartAddr = CONFIG_PARTITON_BASE
|
|||
|
|
+ CONFIG_PARTITION(partition) * CONFIG_PARTITION_SIZE
|
|||
|
|
+ CONFIG_BLOCK(block) * CONFIG_BLOCK_SIZE
|
|||
|
|
+ CONFIG_DC(DC) * CONFIG_DC_SIZE;
|
|||
|
|
uint32_t u32EndAddr = u32StartAddr + CONFIG_DATA_LEN(DC);
|
|||
|
|
|
|||
|
|
uint32_t u32Addr;
|
|||
|
|
uint8_t i = 0;
|
|||
|
|
|
|||
|
|
for(u32Addr = u32StartAddr; u32Addr < u32EndAddr; u32Addr += 4)
|
|||
|
|
{
|
|||
|
|
dataBuff->buff32[i++] = FMC_Read(u32Addr);
|
|||
|
|
}
|
|||
|
|
return TRUE;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static uint32_t Flash_ReadBlock(uint8_t partition, uint8_t block, uint32_t forTest)
|
|||
|
|
{
|
|||
|
|
if(!Flash_ReadDC(partition, block, CAN_DC_BOTTLE_CONFIG, &rdBuff) || !Config_CheckValid(&rdBuff, CAN_DC_BOTTLE_CONFIG))
|
|||
|
|
return FALSE;
|
|||
|
|
if(forTest)
|
|||
|
|
return TRUE;
|
|||
|
|
dcBuff.configBottle = rdBuff.configBottle;
|
|||
|
|
|
|||
|
|
if(!Flash_ReadDC(partition, block, CAN_DC_SENSOR_CONFIG, &rdBuff) || !Config_CheckValid(&rdBuff, CAN_DC_SENSOR_CONFIG))
|
|||
|
|
return FALSE;
|
|||
|
|
dcBuff.configSensor = rdBuff.configSensor;
|
|||
|
|
|
|||
|
|
if(!Flash_ReadDC(partition, block, CAN_DC_DATA_CONFIG, &rdBuff) || !Config_CheckValid(&rdBuff, CAN_DC_DATA_CONFIG))
|
|||
|
|
return FALSE;
|
|||
|
|
dcBuff.configData = rdBuff.configData;
|
|||
|
|
|
|||
|
|
if(!Flash_ReadDC(partition, block, CAN_DC_DISPLAY_CONFIG, &rdBuff) || !Config_CheckValid(&rdBuff, CAN_DC_DISPLAY_CONFIG))
|
|||
|
|
return FALSE;
|
|||
|
|
dcBuff.configDisplay = rdBuff.configDisplay;
|
|||
|
|
|
|||
|
|
return TRUE;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static uint32_t Flash_ReadConfig(uint8_t partition, uint32_t forTest, uint8_t *blockNo)
|
|||
|
|
{
|
|||
|
|
uint8_t block;
|
|||
|
|
|
|||
|
|
for(block = 0; block < 4; block++)
|
|||
|
|
{
|
|||
|
|
if(Flash_ReadBlock(partition, block, forTest))
|
|||
|
|
{
|
|||
|
|
*blockNo = block;
|
|||
|
|
return TRUE;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return FALSE;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static uint32_t Flash_WriteConfig(uint8_t partition)
|
|||
|
|
{
|
|||
|
|
uint8_t block = 0;
|
|||
|
|
uint8_t i;
|
|||
|
|
|
|||
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĿ<DDB5><C4BF><EFBFBD>
|
|||
|
|
if(!Flash_ReadConfig(partition, TRUE, &block))
|
|||
|
|
block = 3;
|
|||
|
|
|
|||
|
|
for(i = 0; i < 4; i++)
|
|||
|
|
{
|
|||
|
|
// ȷ<><C8B7>ѭ<EFBFBD><D1AD>д<EFBFBD><D0B4><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>
|
|||
|
|
block = (block + 1) % 4;
|
|||
|
|
|
|||
|
|
if(!Flash_ErasePartition(partition))
|
|||
|
|
return FALSE;
|
|||
|
|
|
|||
|
|
rdBuff.configBottle = dcBuff.configBottle;
|
|||
|
|
if(!Flash_WriteDC(partition, block, CAN_DC_BOTTLE_CONFIG, &rdBuff))
|
|||
|
|
continue;
|
|||
|
|
|
|||
|
|
rdBuff.configSensor = dcBuff.configSensor;
|
|||
|
|
if(!Flash_WriteDC(partition, block, CAN_DC_SENSOR_CONFIG, &rdBuff))
|
|||
|
|
continue;
|
|||
|
|
|
|||
|
|
rdBuff.configData = dcBuff.configData;
|
|||
|
|
if(!Flash_WriteDC(partition, block, CAN_DC_DATA_CONFIG, &rdBuff))
|
|||
|
|
continue;
|
|||
|
|
|
|||
|
|
rdBuff.configDisplay = dcBuff.configDisplay;
|
|||
|
|
if(!Flash_WriteDC(partition, block, CAN_DC_DISPLAY_CONFIG, &rdBuff))
|
|||
|
|
continue;
|
|||
|
|
|
|||
|
|
return TRUE;
|
|||
|
|
}
|
|||
|
|
return FALSE;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
uint32_t Config_LoadConfig()
|
|||
|
|
{
|
|||
|
|
uint8_t block;
|
|||
|
|
|
|||
|
|
if(Flash_ReadConfig(0, FALSE, &block))
|
|||
|
|
return TRUE;
|
|||
|
|
return Flash_ReadConfig(1, FALSE, &block);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
uint32_t Config_SaveConfig()
|
|||
|
|
{
|
|||
|
|
// OS_ERR err;
|
|||
|
|
// CPU_TS ts;
|
|||
|
|
uint32_t ret, ret1;
|
|||
|
|
|
|||
|
|
// OSMutexPend(&Config_saveLock, 0, OS_OPT_PEND_BLOCKING, &ts, &err);
|
|||
|
|
|
|||
|
|
Config_ForceValid((rd_buff_t *) &dcBuff.configBottle, CAN_DC_BOTTLE_CONFIG);
|
|||
|
|
Config_ForceValid((rd_buff_t *) &dcBuff.configSensor, CAN_DC_SENSOR_CONFIG);
|
|||
|
|
Config_ForceValid((rd_buff_t *) &dcBuff.configData, CAN_DC_DATA_CONFIG);
|
|||
|
|
Config_ForceValid((rd_buff_t *) &dcBuff.configDisplay, CAN_DC_DISPLAY_CONFIG);
|
|||
|
|
|
|||
|
|
ret = Flash_WriteConfig(0);
|
|||
|
|
ret1= Flash_WriteConfig(1);
|
|||
|
|
|
|||
|
|
// OSMutexPost(&Config_saveLock, OS_OPT_POST_NONE, &err);
|
|||
|
|
|
|||
|
|
return ret || ret1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void Config_Init()
|
|||
|
|
{
|
|||
|
|
FMC_Open();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void Config_Open()
|
|||
|
|
{
|
|||
|
|
// OS_ERR err;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD>
|
|||
|
|
// OSMutexCreate(&Config_saveLock, "", &err);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD>ϵͳ<CFB5><CDB3>Ϣ
|
|||
|
|
Config_fillSampleInfo(&dcBuff);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4>ϵͳ<CFB5><CDB3>Ϣ
|
|||
|
|
Config_fillPowerInfo(&dcBuff);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>ϵͳ<CFB5><CDB3>Ϣ
|
|||
|
|
Config_fillDisplayInfo(&dcBuff);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3>Ϣ
|
|||
|
|
Config_fillBluetoothInfo(&dcBuff);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD>
|
|||
|
|
Config_setBottleDefParam(&dcBuff);
|
|||
|
|
Config_setSensorDefParam(&dcBuff);
|
|||
|
|
Config_setDataDefParam(&dcBuff);
|
|||
|
|
Config_setDisplayDefParam(&dcBuff);
|
|||
|
|
|
|||
|
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
SetDataFlashBase(DATA_FLASH_BASE);
|
|||
|
|
Config_LoadConfig();
|
|||
|
|
}
|