Merge branch 'gary'
This commit is contained in:
commit
bfb093481d
|
@ -0,0 +1,33 @@
|
|||
# 忽略 Keil5 生成的中间文件和备份文件
|
||||
*.obj
|
||||
*.lst
|
||||
*.bak
|
||||
*.rpt
|
||||
*.plg
|
||||
*.uvgui.*
|
||||
*.crf
|
||||
*.map
|
||||
*.hex
|
||||
*.axf
|
||||
*.sct
|
||||
*.o
|
||||
*.s19
|
||||
|
||||
# 忽略编译器输出目录(如果您有自定义的输出目录)
|
||||
Objects/
|
||||
Listings/
|
||||
Exe/
|
||||
|
||||
# 忽略用户设置文件,通常包含调试和布局等信息
|
||||
*.uvoptx
|
||||
|
||||
# 如果使用 Visual Studio Code,可以忽略以下目录和文件
|
||||
.vscode/
|
||||
*.code-workspace
|
||||
|
||||
# 忽略操作系统生成的文件
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
# 如果使用其他外部工具(例如,IDE 生成的临时文件)
|
||||
*.log
|
563
bsp/bsp_eeprom.c
563
bsp/bsp_eeprom.c
|
@ -1,563 +0,0 @@
|
|||
#include "kit_data.h"
|
||||
#include "kit_debug.h"
|
||||
//#include "bsp_head.h"
|
||||
//#include "bsp_flash.h"
|
||||
|
||||
#include "bsp_eeprom.h"
|
||||
|
||||
|
||||
#define BSP_EEPROM_HEAD_LEN 0x0C
|
||||
#define BSP_EEPROM_DATA_EMPTY 0xFFFFFFFF
|
||||
|
||||
|
||||
EEpromItem *_eeprom_item;
|
||||
|
||||
static bool eeprom_format(EEpromItem * item, AreaItem * area);
|
||||
static bool eeprom_transfer(EEpromItem * item, AreaItem * area);
|
||||
static bool eeprom_load_area(EEpromItem * item, AreaItem * area);
|
||||
static bool eeprom_load_def_data(EEpromItem * item, AreaItem * area);
|
||||
static bool eeprom_check_data(uint16_t idx, uint16_t value, EepromDataType type);
|
||||
static bool eeprom_write_static_data(EEpromItem * item, uint16_t idx, uint32_t value);
|
||||
static bool eeprom_is_remain_enough(AreaItem * area, uint32_t need_space);
|
||||
static uint8_t eeprom_get_area_type(EEpromItem * item, uint16_t idx);
|
||||
|
||||
static uint8_t eeprom_get_area_type(EEpromItem * item, uint16_t idx)
|
||||
{
|
||||
return (item->format[idx].property & BSP_EEPROM_AREA_BIT_MASK);
|
||||
}
|
||||
|
||||
|
||||
static bool eeprom_is_remain_enough(AreaItem * area, uint32_t need_space)
|
||||
{
|
||||
KIT_ASSERT_PARAM(area != NULL);
|
||||
|
||||
return ((area->write_addr + need_space) <= (area->main_addr + area->area_size));
|
||||
}
|
||||
|
||||
|
||||
static bool eeprom_format(EEpromItem * item, AreaItem * area)
|
||||
{
|
||||
bool res = false;
|
||||
|
||||
KIT_ASSERT_PARAM((item != NULL) && (area != NULL));
|
||||
|
||||
if((flash_series_erase_page(item->flash, area->main_addr, area->erase_page_num) == kKitResult_Ok)
|
||||
&& (flash_series_erase_page(item->flash, area->sub_addr, area->erase_page_num) == kKitResult_Ok)
|
||||
&& (bsp_head_set_status(item->flash, area->main_addr, kHeadStatus_Start) == kKitResult_Ok)
|
||||
&& (bsp_head_set_status(item->flash, area->main_addr, kHeadStatus_Finsih) == kKitResult_Ok))
|
||||
{
|
||||
area->write_addr = area->main_addr + BSP_EEPROM_HEAD_LEN;
|
||||
res = true;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
/***********************************************************************************
|
||||
*Case full move read = write res
|
||||
* 1 1 1 1 1
|
||||
* 2 1 1 0 0
|
||||
* 3 1 0 - 0
|
||||
* 4 0 - 1 1
|
||||
* 5 0 - 0 0
|
||||
*************************************************************************************/
|
||||
static bool eeprom_write_static_data(EEpromItem * item, uint16_t idx, uint32_t value)
|
||||
{
|
||||
bool res;
|
||||
uint32_t write_cnt = 0;
|
||||
|
||||
KIT_ASSERT_PARAM(item != NULL);
|
||||
|
||||
value &= 0x0000FFFF;
|
||||
value |= ((uint32_t)idx << 16);
|
||||
while (write_cnt++ <= BSP_EEPROM_REWRITE_CNT)
|
||||
{
|
||||
res = flash_write_u32_with_check_in(item->flash, &item->static_area.write_addr, value);
|
||||
res &= flash_checken_write_u32(item->flash, item->static_area.write_addr + item->check_addr_offset - 4, ~value); //写校验值
|
||||
if(res == true)
|
||||
item->data_buf[idx] = value;
|
||||
|
||||
if ((eeprom_is_remain_enough(&item->static_area, 4) == false) && (eeprom_transfer(item, &item->static_area) == false))
|
||||
return false;
|
||||
|
||||
if (res == true)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/***************************搬运时意外情况************************
|
||||
1.写完head1后掉电或者未搬完掉电(valid receive)
|
||||
|
||||
*****************************************************************/
|
||||
|
||||
static bool eeprom_transfer(EEpromItem * item, AreaItem * area)
|
||||
{
|
||||
uint32_t idx, tmp, addr, write_cnt = 0;
|
||||
|
||||
KIT_ASSERT_PARAM((item != NULL) && (area != NULL));
|
||||
|
||||
if (bsp_head_get_status(item->flash, area->sub_addr) != kHeadStatus_None)
|
||||
{
|
||||
if (flash_series_erase_page(item->flash, area->sub_addr, area->erase_page_num) != kKitResult_Ok)
|
||||
return false;
|
||||
}
|
||||
|
||||
if (bsp_head_set_status(item->flash, area->sub_addr, kHeadStatus_Start) != kKitResult_Ok)
|
||||
return false;
|
||||
|
||||
addr = area->sub_addr + BSP_EEPROM_HEAD_LEN;
|
||||
for (idx = 0; idx < item->total_data_cnt; idx++)
|
||||
{
|
||||
write_cnt = 0;
|
||||
if (eeprom_get_area_type(item, idx) == area->type)
|
||||
{
|
||||
tmp = ((uint32_t)idx << 16) | item->data_buf[idx];
|
||||
while (write_cnt++ < BSP_EEPROM_REWRITE_CNT)
|
||||
{
|
||||
if (flash_write_u32_with_check_in(item->flash, &addr, tmp) == true)
|
||||
{
|
||||
if((area->type == BSP_EEPROM_AREA_STATIC)
|
||||
&& (flash_checken_write_u32(item->flash, addr + item->check_addr_offset - 4, ~tmp) == false))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(write_cnt >= BSP_EEPROM_REWRITE_CNT)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
//搬完数据后立即写标志后再擦除
|
||||
if ((flash_series_erase_page(item->flash, area->main_addr, area->erase_page_num) == kKitResult_Ok)
|
||||
&& (bsp_head_set_status(item->flash, area->sub_addr, kHeadStatus_Finsih) == kKitResult_Ok))
|
||||
{
|
||||
tmp = area->main_addr;
|
||||
area->main_addr = area->sub_addr;
|
||||
area->sub_addr = tmp;
|
||||
area->write_addr = addr;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
#define EEPROM_INIT_FLAG_NUM 40
|
||||
static bool eeprom_load_data(EEpromItem * item, AreaItem * area)
|
||||
{
|
||||
bool res = true;
|
||||
uint32_t is_data_load[EEPROM_INIT_FLAG_NUM];
|
||||
uint32_t tmp = 0, ntmp = 0, idx, read_addr, end_addr;
|
||||
|
||||
KIT_ASSERT_PARAM((item != NULL) && (area != NULL));
|
||||
|
||||
read_addr = area->main_addr + BSP_EEPROM_HEAD_LEN;
|
||||
end_addr = area->main_addr + area->area_size;
|
||||
kit_set_buf(is_data_load, EEPROM_INIT_FLAG_NUM * 4, 0);
|
||||
|
||||
while (read_addr < end_addr)
|
||||
{
|
||||
flash_read_u32(item->flash, read_addr, &tmp);
|
||||
if(area->type == BSP_EEPROM_AREA_STATIC)
|
||||
flash_read_u32(item->flash, read_addr + item->check_addr_offset, &ntmp);
|
||||
else
|
||||
ntmp = ~tmp;
|
||||
|
||||
if (tmp == BSP_EEPROM_DATA_EMPTY)
|
||||
break;
|
||||
|
||||
read_addr += 4;
|
||||
|
||||
if(tmp + ntmp == 0xFFFFFFFF)
|
||||
{
|
||||
idx = (uint16_t)(tmp >> 16);
|
||||
if ((idx < item->total_data_cnt) && (eeprom_get_area_type(item, idx) == area->type))
|
||||
{
|
||||
KIT_SET_32B_ARRAY_BIT(is_data_load, idx);
|
||||
item->data_buf[idx] = (uint16_t)tmp;
|
||||
}
|
||||
}
|
||||
}
|
||||
area->write_addr = read_addr;
|
||||
|
||||
if(area->type == BSP_EEPROM_AREA_STATIC)
|
||||
{
|
||||
for (idx = 0; idx < item->total_data_cnt; idx++)
|
||||
{
|
||||
//TODO 初始化满,且正好新加了一个参数
|
||||
if ((KIT_GET_32B_ARRAY_BIT(is_data_load, idx) == 0)
|
||||
&& (eeprom_get_area_type(item, idx) == BSP_EEPROM_AREA_STATIC))
|
||||
{
|
||||
tmp = item->format[idx].config_default;
|
||||
res &= eeprom_write_static_data(item, idx, tmp);
|
||||
}
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
static bool eeprom_load_def_data(EEpromItem * item, AreaItem * area)
|
||||
{
|
||||
bool res = true;
|
||||
uint32_t idx;
|
||||
|
||||
KIT_ASSERT_PARAM((item != NULL) && (area != NULL));
|
||||
|
||||
//只加载静态区默认值
|
||||
if (area->type == BSP_EEPROM_AREA_STATIC)
|
||||
{
|
||||
for (idx = 0; idx < item->total_data_cnt; idx++)
|
||||
{
|
||||
if (eeprom_get_area_type(item, idx) == area->type)
|
||||
{
|
||||
item->data_buf[idx] = item->format[idx].config_default;
|
||||
res &= eeprom_write_static_data(item, idx, item->data_buf[idx]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
/*******************************************************************************
|
||||
B1 B2 MB 情况
|
||||
1. V E B1 正常模式
|
||||
2. V RI B1 换页中掉电
|
||||
3. V RD B2 换完页后掉电
|
||||
4. O RD B2 头部未擦除完全
|
||||
4. E RD B2 擦除页时掉电
|
||||
4. E V B2 完成换页
|
||||
*******************************************************************************/
|
||||
static bool eeprom_load_area(EEpromItem * item, AreaItem * area)
|
||||
{
|
||||
bool res = false;
|
||||
HeadStatus head_part1_st, head_part2_st;
|
||||
|
||||
uint32_t tmp;
|
||||
|
||||
KIT_ASSERT_PARAM((item != NULL) && (area != NULL));
|
||||
|
||||
head_part1_st = bsp_head_get_status(item->flash, area->main_addr);
|
||||
head_part2_st = bsp_head_get_status(item->flash, area->sub_addr);
|
||||
|
||||
if (head_part2_st == kHeadStatus_Finsih)
|
||||
{
|
||||
tmp = area->main_addr;
|
||||
area->main_addr = area->sub_addr;
|
||||
area->sub_addr = tmp;
|
||||
}
|
||||
/***********************************************************************************
|
||||
*Case block1 block2 mark
|
||||
* 1 empty(sub) valid(main) normal
|
||||
* 2 valid(main) empty(sub) normal
|
||||
***********************************************************************************/
|
||||
if(((head_part1_st == kHeadStatus_Finsih) && (head_part2_st == kHeadStatus_None))
|
||||
||((head_part1_st == kHeadStatus_None) && (head_part2_st == kHeadStatus_Finsih)))
|
||||
{
|
||||
if (eeprom_load_data(item, area) == true)
|
||||
{
|
||||
if (area->type == BSP_EEPROM_AREA_DYNAMIC)
|
||||
{
|
||||
tmp = area->data_cnt << 3;
|
||||
}
|
||||
else
|
||||
{
|
||||
tmp = 4 * 10;
|
||||
}
|
||||
//可能在需要换页擦除时掉电,上电需要检测是否需要换页
|
||||
if((eeprom_is_remain_enough(area, tmp) == false)
|
||||
&& (eeprom_transfer(item, area) == false))
|
||||
return false;
|
||||
|
||||
res = true;
|
||||
}
|
||||
}
|
||||
/*************************************************************************************
|
||||
*Case block1 block2 mark
|
||||
* 1 valid(main) receiving(sub) interrupt while transfer(should continue the transfer)
|
||||
* 2 receiving(sub) valid(main) interrupt while transfer(should continue the transfer)
|
||||
**************************************************************************************/
|
||||
else if(((head_part1_st == kHeadStatus_Finsih) && (head_part2_st == kHeadStatus_Start))
|
||||
||((head_part1_st == kHeadStatus_Start) && (head_part2_st == kHeadStatus_Finsih)))
|
||||
{
|
||||
if((flash_series_erase_page(item->flash, area->sub_addr, area->erase_page_num) == kKitResult_Ok)
|
||||
&& (eeprom_load_data(item, area) == true)
|
||||
&& (eeprom_transfer(item, area) == true))
|
||||
res = true;
|
||||
}
|
||||
/***********************************************************************************
|
||||
*Case Page0 Page1 mark
|
||||
* 1 empty(sub) received(main) interrupt while modify the flag or interrupt while erase(transfer finish)
|
||||
* 2 received(main) empty(sub) interrupt while modify the flag or interrupt while erase(transfer finish)
|
||||
***********************************************************************************/
|
||||
// else if((head_joint & kBspEepromHeadSt_Received) == kBspEepromHeadSt_Received)
|
||||
// {
|
||||
// if((flash_series_erase_page(item->flash, area->sub_addr, area->page_num * area->type) == kKitResult_Ok)
|
||||
// && (eeprom_set_head_status(area->main_addr, BSP_EEPROM_HEAD_PART3) == true)
|
||||
// && (eeprom_load_data(item, area) == true))
|
||||
// res = true;
|
||||
// }
|
||||
/***********************************************************************************
|
||||
*Case Page0 Page1 mark
|
||||
* 1 empty empty maybe first to use or exception
|
||||
* 2 valid valid exception
|
||||
* 3 receive receive exception
|
||||
* 4 other other page0 or page1 or both not the set state
|
||||
************************************************************************************/
|
||||
else
|
||||
{
|
||||
if((eeprom_format(item, area) == true)
|
||||
&& (eeprom_load_def_data(item, area) == true))
|
||||
res = true;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
/*********************************************************************************************
|
||||
1.eeprom数据结构:备份区可选,主区和校验区可放置在1个page中,主区和副区会相互转换
|
||||
+-------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| | | | | | | | | |
|
||||
| 备份区| S主区 |校验区 | S副区 | 校验 | D主区 | D副区 | | |
|
||||
| | | | | 副区 | | | | |
|
||||
| | | | | | | | | |
|
||||
+-------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||
**********************************************************************************************/
|
||||
|
||||
bool bsp_eeprom_init(EEpromItem *item, uint8_t backup_page_num, uint8_t static_page_num, uint8_t dynamic_page_num, uint32_t start_addr)
|
||||
{
|
||||
bool res = true;
|
||||
uint32_t idx, tmp, static_num = 0, dynamic_num = 0;
|
||||
|
||||
KIT_ASSERT_PARAM(item != NULL);
|
||||
|
||||
if (item != NULL)
|
||||
{
|
||||
_eeprom_item = item;
|
||||
item->backup_area_addr = start_addr;
|
||||
item->backup_area_page_num = backup_page_num;
|
||||
//计算静态区和动态区数据个数
|
||||
for (idx = 0; idx < item->total_data_cnt; idx++)
|
||||
{
|
||||
if (eeprom_get_area_type(item, idx) == BSP_EEPROM_AREA_STATIC)
|
||||
static_num++;
|
||||
else if (eeprom_get_area_type(item, idx) == BSP_EEPROM_AREA_DYNAMIC)
|
||||
dynamic_num++;
|
||||
}
|
||||
//407 小容量页较少,将主区和校验区放在一个页中,即将一个页分为两个区用
|
||||
#if defined(STM32F40_41xxx) || defined(STM32F429_439xx)
|
||||
tmp = flash_get_page_size(item->flash) >> 1;
|
||||
#else
|
||||
tmp = flash_get_page_size(item->flash);
|
||||
#endif
|
||||
if ((((static_num + 4) << 2) >= tmp * static_page_num)
|
||||
|| (((dynamic_num + 4) << 2) >= tmp * dynamic_page_num))
|
||||
return false;
|
||||
|
||||
item->check_addr_offset = tmp * static_page_num;
|
||||
item->static_area.data_cnt = static_num;
|
||||
item->dynamic_area.data_cnt = dynamic_num;
|
||||
|
||||
item->static_area.type = BSP_EEPROM_AREA_STATIC;
|
||||
item->static_area.area_size = tmp * static_page_num;
|
||||
item->static_area.main_addr = (start_addr + backup_page_num * tmp);
|
||||
item->static_area.sub_addr = (item->static_area.main_addr + static_page_num * tmp *2);
|
||||
|
||||
item->dynamic_area.type = BSP_EEPROM_AREA_DYNAMIC;
|
||||
item->dynamic_area.area_size = tmp * static_page_num;
|
||||
item->dynamic_area.main_addr = (item->static_area.sub_addr + static_page_num * tmp * 2);
|
||||
#if defined(STM32F40_41xxx) || defined(STM32F429_439xx)
|
||||
item->dynamic_area.erase_page_num = item->static_area.erase_page_num = 1;
|
||||
item->dynamic_area.sub_addr = (item->dynamic_area.main_addr + dynamic_page_num * tmp * 2);
|
||||
#else
|
||||
item->static_area.erase_page_num = static_page_num * BSP_EEPROM_AREA_STATIC;
|
||||
item->dynamic_area.erase_page_num = dynamic_page_num * BSP_EEPROM_AREA_DYNAMIC;
|
||||
item->dynamic_area.sub_addr = (item->dynamic_area.main_addr + dynamic_page_num * tmp);
|
||||
#endif
|
||||
|
||||
#if defined(STM32F429_439xx) //20231005 by songman 防止配置恢复默认配置
|
||||
if((item->static_area.main_addr == start_addr)
|
||||
&& ((ARM_READ_INT32U(0x08006010) == 0xFFFFFFFF) && (ARM_READ_INT32U(0x08006014) == 0xFFFFFFFF)))
|
||||
{
|
||||
flash_series_write_u32(item->flash, 0x08006000, (uint8_t *)0x08008000, 0x2000);
|
||||
flash_series_erase_page(item->flash, 0x08008000, 1);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (static_num != 0)
|
||||
res &= eeprom_load_area(item, &item->static_area);
|
||||
|
||||
if (dynamic_num != 0)
|
||||
res &= eeprom_load_area(item, &item->dynamic_area);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static bool eeprom_check_data(uint16_t idx, uint16_t value, EepromDataType type)
|
||||
{
|
||||
bool res = false;
|
||||
uint32_t max, min;
|
||||
|
||||
if (((_eeprom_item->format[idx].property) & BSP_EEPROM_CHECK_MAX_MIN_BIT_MASK) == BSP_EEPROM_CHECK_MAX_MIN_ON)
|
||||
{
|
||||
max = _eeprom_item->format[idx].config_max;
|
||||
min = _eeprom_item->format[idx].config_min;
|
||||
if (((type == kEepromDataType_Full) && (value >= min) && (value <= max ))
|
||||
|| ((type == kEepromDataType_High) && (value >= (min >> 8)) && (value <= (max >> 8)))
|
||||
|| ((type == kEepromDataType_Low) && (value >= (uint8_t)min) && (value <= (uint8_t)max)))
|
||||
{
|
||||
res = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
res = true;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
bool bsp_eeprom_set_data(uint16_t idx, uint32_t value, EepromDataType type)
|
||||
{
|
||||
bool res = false;
|
||||
uint16_t write_value;
|
||||
|
||||
KIT_ASSERT_PARAM((idx < _eeprom_item->total_data_cnt) && (type < kEepromDataType_End));
|
||||
|
||||
if ((idx < _eeprom_item->total_data_cnt)
|
||||
&& (type < kEepromDataType_End)
|
||||
&& (eeprom_check_data(idx, value, type) == true))
|
||||
{
|
||||
res = true;
|
||||
write_value = _eeprom_item->data_buf[idx];
|
||||
if (type == kEepromDataType_High)
|
||||
write_value = (write_value & 0x00FF) | (value << 8);
|
||||
else if (type == kEepromDataType_Low)
|
||||
write_value = (write_value & 0xFF00) | (value & 0x00FF);
|
||||
else if (type == kEepromDataType_Full)
|
||||
write_value = value;
|
||||
else
|
||||
{
|
||||
//如果4字节,先写低16位,再写高16位
|
||||
if(_eeprom_item->data_buf[idx] != (uint16_t)value)
|
||||
{
|
||||
_eeprom_item->data_buf[idx] = (uint16_t)value;
|
||||
}
|
||||
write_value = value >>16;
|
||||
idx++;
|
||||
}
|
||||
if (_eeprom_item->data_buf[idx] != write_value)
|
||||
{
|
||||
_eeprom_item->data_buf[idx] = (uint16_t)write_value;
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
bool bsp_eeprom_save_data(uint16_t idx, uint32_t value, EepromDataType type)
|
||||
{
|
||||
bool res = false;
|
||||
uint16_t write_value;
|
||||
|
||||
KIT_ASSERT_PARAM((idx < _eeprom_item->total_data_cnt) && (type < kEepromDataType_End));
|
||||
|
||||
if ((idx < _eeprom_item->total_data_cnt) && (type < kEepromDataType_End) && (eeprom_check_data(idx, value, type) == true))
|
||||
{
|
||||
res = true;
|
||||
write_value = _eeprom_item->data_buf[idx];
|
||||
if (type == kEepromDataType_High)
|
||||
write_value = (write_value & 0x00FF) | (value << 8);
|
||||
else if (type == kEepromDataType_Low)
|
||||
write_value = (write_value & 0xFF00) | (value & 0x00FF);
|
||||
else if (type == kEepromDataType_Full)
|
||||
write_value = value;
|
||||
else
|
||||
{
|
||||
if((_eeprom_item->data_buf[idx] != (uint16_t)value)
|
||||
|| ((_eeprom_item->format[idx].property & BSP_EEPROM_CHECK_EQUAL_BIT_MASK) == false))
|
||||
{
|
||||
res &= eeprom_write_static_data(_eeprom_item, idx, (uint16_t)value);
|
||||
}
|
||||
|
||||
write_value = value >>16;
|
||||
idx++;
|
||||
}
|
||||
if((_eeprom_item->data_buf[idx] != (uint16_t)write_value)
|
||||
|| ((_eeprom_item->format[idx].property & BSP_EEPROM_CHECK_EQUAL_BIT_MASK) == false))
|
||||
{
|
||||
res &= eeprom_write_static_data(_eeprom_item, idx, write_value);
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
uint32_t bsp_eeprom_get_data(uint16_t idx, EepromDataType type)
|
||||
{
|
||||
uint32_t value = 0;
|
||||
|
||||
KIT_ASSERT_PARAM((idx < _eeprom_item->total_data_cnt) && (type < kEepromDataType_End));
|
||||
|
||||
if ((idx < _eeprom_item->total_data_cnt) && (type < kEepromDataType_End))
|
||||
{
|
||||
value = _eeprom_item->data_buf[idx];
|
||||
|
||||
if (type == kEepromDataType_High)
|
||||
value >>= 8;
|
||||
else if (type == kEepromDataType_Low)
|
||||
value &= 0x00FF;
|
||||
else if (type == kEepromDataType_Double)
|
||||
value |= (uint32_t)_eeprom_item->data_buf[idx + 1] << 16;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
bool bsp_eeprom_backup_static_area(void)
|
||||
{
|
||||
uint32_t i, write, addr = _eeprom_item->backup_area_addr;
|
||||
|
||||
if ((_eeprom_item->backup_area_page_num != 0) && (flash_series_erase_page(_eeprom_item->flash, addr, _eeprom_item->static_area.erase_page_num) == kKitResult_Ok))
|
||||
{
|
||||
for (i = 0; i < _eeprom_item->total_data_cnt; i++)
|
||||
{
|
||||
write = (uint32_t)_eeprom_item->data_buf[i] | (i << 16);
|
||||
if (flash_write_u32_with_check_in(_eeprom_item->flash, &addr, write) == false)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool bsp_eeprom_recovery_static_area(EEpromItem *item, uint16_t except_idx)
|
||||
{
|
||||
bool res = false;
|
||||
|
||||
uint16_t data = bsp_eeprom_get_data(except_idx, kEepromDataType_Full);
|
||||
|
||||
if((eeprom_format(item, &item->static_area) == true)
|
||||
&& (eeprom_load_def_data(item, &item->static_area) == true))
|
||||
{
|
||||
res = true;
|
||||
bsp_eeprom_save_data(except_idx, data, kEepromDataType_Full);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
void bsp_eeprom_power_off_save_data(EepromPoData *data, uint32_t len)
|
||||
{
|
||||
uint32_t i, idx, write_cnt;
|
||||
//静态区页满情况:在上电换页时掉电,此时静态区数据不用存
|
||||
if((data != NULL) && (_eeprom_item != NULL) && (len <= _eeprom_item->dynamic_area.data_cnt)
|
||||
&& (eeprom_is_remain_enough(&_eeprom_item->dynamic_area, _eeprom_item->dynamic_area.data_cnt << 3) == true))
|
||||
{
|
||||
for (i = 0; i < len; i++)
|
||||
{
|
||||
write_cnt = 0;
|
||||
idx = data[i].item.idx;
|
||||
if ((idx < _eeprom_item->total_data_cnt) && (_eeprom_item->data_buf[idx] != data[i].item.value)
|
||||
&& (eeprom_get_area_type(_eeprom_item, idx) == BSP_EEPROM_AREA_DYNAMIC))
|
||||
{
|
||||
while ((flash_write_u32_with_check_in(_eeprom_item->flash, &_eeprom_item->dynamic_area.write_addr, data[i].value) == false)
|
||||
&& (write_cnt++ < BSP_EEPROM_REWRITE_CNT))
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,53 @@
|
|||
编辑 .gitignore 文件可以帮助您忽略一些不需要版本控制的文件和文件夹。对于 Keil5 项目,通常不需要将编译生成的中间文件和临时文件添加到 Git 仓库中。以下是一个适合 Keil5 项目的 .gitignore 示例:
|
||||
|
||||
plaintext
|
||||
复制代码
|
||||
# 忽略 Keil5 生成的中间文件和备份文件
|
||||
*.obj
|
||||
*.lst
|
||||
*.bak
|
||||
*.rpt
|
||||
*.plg
|
||||
*.uvgui.*
|
||||
*.crf
|
||||
*.map
|
||||
*.hex
|
||||
*.axf
|
||||
*.sct
|
||||
*.o
|
||||
*.s19
|
||||
|
||||
# 忽略编译器输出目录(如果您有自定义的输出目录)
|
||||
Objects/
|
||||
Listings/
|
||||
Exe/
|
||||
|
||||
# 忽略用户设置文件,通常包含调试和布局等信息
|
||||
*.uvoptx
|
||||
|
||||
# 如果使用 Visual Studio Code,可以忽略以下目录和文件
|
||||
.vscode/
|
||||
*.code-workspace
|
||||
|
||||
# 忽略操作系统生成的文件
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
# 如果使用其他外部工具(例如,IDE 生成的临时文件)
|
||||
*.log
|
||||
如何编辑 .gitignore
|
||||
创建或编辑文件:在项目根目录下创建一个名为 .gitignore 的文件(如果不存在的话)。在文本编辑器中打开该文件。
|
||||
|
||||
添加忽略规则:在文件中添加需要忽略的文件和文件夹规则,每条规则占一行。
|
||||
|
||||
* 表示通配符。例如,*.obj 表示忽略所有 .obj 文件。
|
||||
/ 表示目录。例如,Objects/ 表示忽略 Objects 目录。
|
||||
以 # 开头的行表示注释,不会影响忽略规则。
|
||||
应用 .gitignore 更改:编辑完成后,保存 .gitignore 文件。Git 会自动应用该文件中的规则,对于已经被跟踪的文件,可以通过以下命令清除缓存使其生效:
|
||||
|
||||
bash
|
||||
复制代码
|
||||
git rm -r --cached .
|
||||
git add .
|
||||
git commit -m "Apply .gitignore rules"
|
||||
这样就可以保持 Git 仓库干净,只包含必要的源代码和配置文件,避免不必要的二进制文件、备份文件等进入版本控制。
|
Loading…
Reference in New Issue