forked from SZV10X_Software/SZV103_FM33A0xxEV_SiZhu

jinlicong
2024-06-12 f03cf3ae7a36954e64fc014e6bb7afd20c5a5247
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;
}