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("\r\n");
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 }
posted @ 2019-11-25 00:29  上官梦舞  阅读(751)  评论(0编辑  收藏  举报