zoukankan      html  css  js  c++  java
  • STC单片机Flash做EEPROM的代码

    STC官方给出的建议:

     1 /***************************************************************Author:Liming***
     2   * @brief  读取参数
     3   * @param  None
     4   * @retval None
     5 ****************************************************************0x49E7FC7B*****/
     6 void ReadParam(void)
     7 {
     8     uint16_t i;
     9     uint8_t buffer[64][8];//1扇区分为64块存储区 1块内的8个字节
    10 
    11     EepromReadBytes(IAP_SECTOR0, &buffer[0][0], 0x200);
    12 
    13   #ifdef DEBUG
    14   for(i=0; i<64; i++)//调试模式输出数据
    15   { 
    16     SendBytes(&buffer[i][0], 8);
    17     SendString("
    ");
    18     Delay(25);
    19   }
    20   #endif
    21   
    22     for(i=0; i<64; i++)
    23     {
    24         if((buffer[i][0] == 0xff) && buffer[i][1] != 0xff)
    25         {
    26             LocalID = buffer[i][1];
    27             return;
    28         }
    29     }
    30 }
    31 
    32 
    33 /***************************************************************Author:Liming***
    34   * @brief  保存参数
    35   针对STC单片机Flash作为EEPROM,0只能通过扇区擦除才能变为1,但是1可以
    36   写入改为0,发现如果对单个字节写入一次数据比如0x63,再写入0x00,读出的值为0x40并
    37   不是理论上的0x00,但第一次写入数据都没问题。所以采用以下方法:
    38   一扇区512字节以8字节为一块分为64块,每一块的第一字节为标志位,如果为0xff则后面
    39   的7字节为有效数据,如果为0x00则后面的7字节已经作废。
    40   * @param  
    41   * @retval None
    42 ****************************************************************0x49E7FC7B*****/
    43 void SaveParam(void)
    44 {
    45     uint16_t i;
    46     uint8_t buffer[64][8];//1扇区分为64块存储区 1块内的8个字节
    47     
    48     EepromReadBytes(IAP_SECTOR0, buffer, 0x200);
    49 
    50     for(i=0; i<64; i++)
    51     {
    52     if((buffer[i][0] == 0xff) && (buffer[i][1] == 0xff))
    53     {
    54       IapProgramByte(IAP_SECTOR0+(i*8)+1, LocalID);
    55       if(i != 0x00)
    56       {
    57         IapProgramByte(IAP_SECTOR0+(i*8)-8, 0x00);//用过的存储块更改标志
    58       }
    59       return;
    60     }
    61     }
    62     IapEraseSector(IAP_SECTOR0);
    63     IapProgramByte(IAP_SECTOR0+1, LocalID);
    64 }
  • 相关阅读:
    【模拟7.22】方程的解(拓展欧几里德)
    Dijkstra堆优化模板
    7.19考后总结
    《机器学习实战》读书笔记
    从K近邻算法、距离度量谈到KD树、SIFT+BBF算法
    《c程序设计语言》-3.2 字符串转换
    《c程序设计语言》-3.1 判断语句多少影响时间
    《c程序设计语言》-2.10 不用if-else 转换大小写
    《c程序设计语言》-2.9
    《c程序设计语言》-2.6~2.8
  • 原文地址:https://www.cnblogs.com/IdeaMing/p/11925386.html
Copyright © 2011-2022 走看看