[应用方案] NV32 操作 EEPROM

[复制链接]
 楼主| hanzhen654 发表于 2020-3-29 15:02 | 显示全部楼层 |阅读模式
本帖最后由 hanzhen654 于 2020-3-29 15:04 编辑

擦除adr所在的扇区(512字节)
  1. uint16_t Adress_Js(uint32_t adr)
  2. {
  3.     uint16_t err = EEPROM_ERR_SUCCESS;

  4.     if(adr & 0x03)
  5.     {
  6.         err = EEPROM_ERR_INVALID_PARAM;
  7.         return (err);
  8.         }
  9.   
  10.     if(adr >1024)
  11.     {
  12.         err=EEPROM_ADR_OverFlow;
  13.       return(err);
  14.     }
  15.     return(err);
  16. }


 楼主| hanzhen654 发表于 2020-3-29 15:03 | 显示全部楼层
擦除adr所在的512bytes eeprom
  1. uint16_t EEPROM_Erase(uint32_t adr)
  2. {
  3.     uint16_t err = EEPROM_ERR_SUCCESS;
  4.     uint32_t e_adr;

  5.      if(adr & 0x03)
  6.     {
  7.         err = EEPROM_ERR_INVALID_PARAM;
  8.         return (err);
  9.         }
  10.   
  11.     if(adr >1024)
  12.     {
  13.         err=EEPROM_ADR_OverFlow;
  14.    
  15.       return(err);
  16.     }
  17.    
  18.     e_adr=adr+EEPROM_START_ADR;
  19.     err = Flash_EraseSector(e_adr);  
  20.     return(err);
  21. }


 楼主| hanzhen654 发表于 2020-3-29 15:04 | 显示全部楼层
读取地址所在的eeprom
  1. uint32_t EEPROM_Read(uint32_t adr)
  2. {
  3.     uint16_t err = EEPROM_ERR_SUCCESS;
  4.     uint32_t e_adr;
  5.     uint32_t data;
  6.    
  7.     if(adr & 0x03)
  8.     {
  9.         err = EEPROM_ERR_INVALID_PARAM;
  10.         return (err);
  11.         }
  12.   
  13.     if(adr >1024)
  14.     {
  15.         err=EEPROM_ADR_OverFlow;
  16.       return(err);
  17.     }
  18.    
  19.     e_adr=adr+EEPROM_START_ADR;
  20.     data = M32(e_adr);
  21.     return(data);
  22.    
  23. }


 楼主| hanzhen654 发表于 2020-3-29 15:05 | 显示全部楼层
EEPROM 写函数,写地址所在的eeprom
  1. uint16_t EEPROM_Write(uint32_t adr, uint32_t Data)
  2. {
  3.   
  4.     uint32_t err = EEPROM_ERR_SUCCESS;
  5.     uint32_t e_adr;
  6.     uint32_t r_data;
  7.     uint16_t i;
  8.     uint32_t start_adr;
  9. //   uint32_t modify_adr;
  10.     uint32_t EEPROM_DATA[128];

  11.     if(adr & 0x03)
  12.     {
  13.         err = EEPROM_ERR_INVALID_PARAM;
  14.                 return (err);
  15.                 }
  16.   
  17.     if(adr >1024)
  18.     {
  19.         err=EEPROM_ADR_OverFlow;
  20.       return(err);
  21.     }

  22.    
  23.     r_data = EEPROM_Read(adr);
  24.    
  25.     e_adr=adr+EEPROM_START_ADR;

  26.     if(r_data== EEPROM_BLANK) //如果要写的位置是空的,则直接写
  27.     {
  28.       err= Flash_Program1LongWord(e_adr,Data);
  29.     }
  30.    else if((r_data&Data) == Data)//如果要写的位置对应的bit,和要写的数据一致,或者是1,也是可以直接写
  31.      {
  32.       err= Flash_Program1LongWord(e_adr,Data);
  33.     }
  34.     else if(r_data == Data) //如果要写的数据和现有的数据一致,就不进行任何操作,直接返回
  35.     {
  36.       return(err);
  37.     }
  38.     else
  39.     {
  40.         start_adr = e_adr & EEPROM_SECTOR_MASK; //计算出sector的头地址   
  41.         
  42.         for( i=0;i<128;i++ ) //如果要写的位置不为空,则先把flash内容读取出来,放在sram中,修改
  43.         {
  44.           EEPROM_DATA[i] = M32(start_adr + 4*i);
  45.         }
  46.             
  47.         EEPROM_DATA[(adr&EEPROM_ARRAY_ADR_MASK)>>2] = Data; //修改SRAM 中的数据
  48.         
  49.         err=EEPROM_Erase(adr);
  50.      
  51.         err=Flash_Program(start_adr,(uint8_t*)EEPROM_DATA,512);//然后写入flash
  52.     }
  53.     return(err);
  54.    
  55. }


 楼主| hanzhen654 发表于 2020-3-29 15:06 | 显示全部楼层
字节写函数
  1. uint16_t EEPROM_WriteByte(uint32_t adr, uint8_t Data)
  2. {
  3.     uint32_t err = EEPROM_ERR_SUCCESS;
  4.     uint32_t data_mask;
  5.     uint32_t r_data;
  6.     uint32_t data_m0;
  7.     uint32_t data_m1;
  8.     uint32_t word_adr = adr &0x3fc;
  9.     uint32_t  b_sit= adr & 0x3;
  10.    

  11. //先让高位为FF
  12.                 data_m0 = Data << b_sit*8;   
  13.     data_mask = 0xFFFFFFFF<<(b_sit+1)*8;      
  14.         //然后让低位为FF   
  15.     data_m1 = 0xFFFFFFFF >> (32-b_sit*8);
  16.     data_m1 = data_m1 | data_m0 | data_mask ;


  17.     r_data = EEPROM_Read(word_adr);
  18.           r_data |= 0xFF<< b_sit*8;

  19.     data_m1 = data_m1 & r_data;
  20.                           
  21.     err = EEPROM_Write(word_adr , data_m1);
  22.    
  23.     return(err);

  24. }


 楼主| hanzhen654 发表于 2020-3-29 15:09 | 显示全部楼层
字节读函数
  1. uint8_t EEPROM_ReadByte(uint32_t adr)
  2. {
  3.    uint32_t r_data;
  4.    uint32_t word_adr = adr &0x3fc;
  5.    uint32_t b_sit= adr & 0x3;
  6.    uint8_t  data;
  7.    
  8.     r_data = EEPROM_Read(word_adr);
  9.     data = (r_data>>b_sit*8)& 0xff;
  10.     return(data);
  11.    
  12.    
  13. }


 楼主| hanzhen654 发表于 2020-3-29 15:11 | 显示全部楼层
写函数,写一个长度为bytesize,到eeprom
  1. uint16_t EERPOM_Writeup4byte(uint32_t adr,uint8_t *pData,uint32_t length)
  2. {
  3.         uint8_t buf[512];
  4.         uint8_t *pbuf;
  5.         uint32_t e_adr;
  6.         uint32_t e_sec;
  7.         uint32_t e_offset;
  8.         uint32_t a;
  9.         uint32_t err = EEPROM_ERR_SUCCESS;
  10.        
  11.    #ifdef IAR
  12.     if(adr & 0x03)
  13.     {
  14.         err = EEPROM_ERR_INVALID_PARAM;
  15.               return (err);
  16.            }
  17.     #endif
  18.   
  19.     if((adr + length )>1024)
  20.     {
  21.         err=EEPROM_ADR_OverFlow;
  22.       return(err);
  23.     }
  24.    
  25.         e_adr=adr+EEPROM_START_ADR;
  26.         e_sec=e_adr & EEPROM_SECTOR_MASK;
  27.         e_offset=e_adr & 0x1ff;

  28.        
  29.         while (length>0){
  30.           //如果起始地址不等于0,或者长度小于512 都进入这个循环
  31.                 if (e_offset||(length<512)){
  32.                         pbuf=buf;
  33.                         a=512-e_offset;
  34.                         a=(length>a?a:length);
  35.                        
  36.                         memcpy(buf,(uint8_t*)e_sec,512);
  37.                         memcpy(&buf[e_offset],pData,a);
  38.                         pData+=a;
  39.                         length-=a;
  40.                         e_offset=0;

  41.                 }else{ //如果起始地址等于0且长度大于512
  42.                         pbuf=pData;
  43.                         pData+=512;
  44.                         length-=512;
  45.                 }
  46.                 err=Flash_EraseSector(e_sec);
  47.                 err=Flash_Program(e_sec,(uint8_t*)pbuf,512);//然后写入flash
  48.                 e_sec+=0x200;
  49.         }
  50.         return err;
  51. }


您需要登录后才可以回帖 登录 | 注册

本版积分规则

73

主题

1766

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部