From f03cf3ae7a36954e64fc014e6bb7afd20c5a5247 Mon Sep 17 00:00:00 2001
From: jinlicong <493886250@qq.com>
Date: Wed, 12 Jun 2024 17:22:08 +0800
Subject: [PATCH] 增加IAP功能,准备测试上位机升级

---
 Function/STORAGE/system_flash_mem_manage.c |  110 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 110 insertions(+), 0 deletions(-)

diff --git a/Function/STORAGE/system_flash_mem_manage.c b/Function/STORAGE/system_flash_mem_manage.c
index 5e1ad20..eae51fc 100644
--- a/Function/STORAGE/system_flash_mem_manage.c
+++ b/Function/STORAGE/system_flash_mem_manage.c
@@ -1,6 +1,116 @@
 #include "system_flash_mem_manage.h"
+#include "off_chip_flash.h"
+#include "system_general_para.h"
+#include "mbcrc1.h"
+
+
+//flash����д��Ͷ�ȡ���,ֻ֧��1024���ֽڵ�д�����ȡ���
+ErrorStatus	FlashWriteAndReadCheck(uint8_t * write_data,uint32_t addr,uint16_t length)
+{
+	uint8_t	buf_l[1024];
+	
+	if(length >1024)	
+		return FAIL;
+	
+
+	
+	OUT_FLASH_CTRL_ENABLE;
+	Out_Flash_MultipleWrite(write_data,addr,length);
+	
+	Out_Flash_MultipleRead(buf_l,addr,length);
+	OUT_FLASH_CTRL_DISABLE;
+	
+	return ucharcmp(write_data,buf_l,length);
+}
+
+
+//flash���ݶ��д�룬д�����ʱ�����д
+ErrorStatus	FlashMultipleWriteAndReadCheck(uint8_t * write_data,uint32_t addrA,uint16_t length)
+{
+	ErrorStatus	return_flag = PASS;
+	if(FlashWriteAndReadCheck(write_data,addrA,length)==FAIL)
+	{
+		if(FlashWriteAndReadCheck(write_data,addrA,length)==FAIL)
+		{
+			return_flag = FAIL;
+		}
+	}
+	
+	return return_flag;
+}
+
+
+//flash���ݶ�ȡ����У��CRC
+ErrorStatus	FlashMultipleReadAndCrcCheck(uint8_t * read_data,uint32_t addrA,uint16_t length)
+{
+	ErrorStatus	return_flag = PASS;
+	uint8_t	buf_l[1024];
+	uint16_t crc_modbus = 0;
+	
+	if(length >1024)	
+		return FAIL;
+	OUT_FLASH_CTRL_ENABLE;
+	Out_Flash_MultipleRead(buf_l,addrA,length);
+	crc_modbus = buf_l[0] + ((uint16_t)buf_l[1]<<8);
+	if(crc_modbus != usMBCRC16(0xFFFF,&buf_l[2], length - sizeof(crc_modbus) )){
+		Out_Flash_MultipleRead(buf_l,addrA,length);
+		crc_modbus = buf_l[0] + ((uint16_t)buf_l[1]<<8);
+		if(crc_modbus != usMBCRC16(0xFFFF,&buf_l[2], length - sizeof(crc_modbus) )){
+			return_flag = FAIL;
+		}else{
+			arrayA_2_arrayB(buf_l,read_data,length,LITTLE_ENDIAN);
+		}
+	}else
+	{
+		arrayA_2_arrayB(buf_l,read_data,length,LITTLE_ENDIAN);
+	}
+	
+	OUT_FLASH_CTRL_DISABLE;
+	
+	return return_flag;
+}
 
 
 
 
 
+
+
+/*flash��־������ַ�ж�,�������̫�࣬����ѭ���ȽϱȽϷ�ʱ�䣬��Ҫ����!!!!!!!!!
+*input��OpAddr:������ַ��  StartAddr����ʼ��ַ    length��������־����			MaxNum����־�������
+*return������FAIL��ʾ��ַ����ȷ
+*/
+ErrorStatus	FlashLogAddrCheck(uint32_t OpAddr,uint32_t StartAddr,uint16_t length,uint16_t MaxNum)
+{
+	uint32_t	count_i = 0;
+	uint32_t	next_addr = StartAddr;
+	if((MaxNum ==0)||(OpAddr>=OUT_FLASH_ALL_SIZE)||(StartAddr>=OUT_FLASH_ALL_SIZE)||(length >1024))
+		return FAIL;
+	
+	while(count_i<MaxNum){
+		if(OpAddr == next_addr)
+			return PASS;
+		else
+			next_addr += length;
+		
+		if(++count_i > 0xFFFF){
+			break;
+		}
+	}
+	return FAIL;
+}
+
+/*flash��־��ȡ��һ����ַ�����ж���һ����ַ�Ƿ��������
+*input��OpAddr:������ַ��  StartAddr����ʼ��ַ    length��������־����			EndAddr��������ַ
+*return����һ����ַ
+*/
+uint32_t	FlashLogPreviousAddrGet(uint32_t OpAddr,uint32_t StartAddr,uint16_t length,uint32_t EndAddr)
+{
+	uint32_t	previous_addr = StartAddr;
+	if(OpAddr == StartAddr){
+		previous_addr = EndAddr;
+	}else{
+		previous_addr	= OpAddr - length;
+	}
+	return previous_addr;
+}

--
Gitblit v1.9.3