STC 官方给出的建议:
- /***************************************************************Author:Liming***
- * @brief 读取参数
- * @param None
- * @retval None
- ****************************************************************0x49E7FC7B*****/
- void ReadParam(void)
- {
- uint16_t i;
- uint8_t buffer[64][8];//1 扇区分为 64 块存储区 1 块内的 8 个字节
- EepromReadBytes(IAP_SECTOR0, &buffer[0][0], 0x200);
- #ifdef DEBUG
- for(i=0; i<64; i++)// 调试模式输出数据
- {
- SendBytes(&buffer[i][0], 8);
- SendString("\r\n");
- Delay(25);
- }
- #endif
- for(i=0; i<64; i++)
- {
- if((buffer[i][0] == 0xff) && buffer[i][1] != 0xff)
- {
- LocalID = buffer[i][1];
- return;
- }
- }
- }
- /***************************************************************Author:Liming***
- * @brief 保存参数
- 针对 STC 单片机 Flash 作为 EEPROM,0 只能通过扇区擦除才能变为 1, 但是 1 可以
- 写入改为 0, 发现如果对单个字节写入一次数据比如 0x63, 再写入 0x00, 读出的值为 0x40 并
- 不是理论上的 0x00, 但第一次写入数据都没问题. 所以采用以下方法:
- 一扇区 512 字节以 8 字节为一块分为 64 块, 每一块的第一字节为标志位, 如果为 0xff 则后面
- 的 7 字节为有效数据, 如果为 0x00 则后面的 7 字节已经作废.
- * @param
- * @retval None
- ****************************************************************0x49E7FC7B*****/
- void SaveParam(void)
- {
- uint16_t i;
- uint8_t buffer[64][8];//1 扇区分为 64 块存储区 1 块内的 8 个字节
- EepromReadBytes(IAP_SECTOR0, buffer, 0x200);
- for(i=0; i<64; i++)
- {
- if((buffer[i][0] == 0xff) && (buffer[i][1] == 0xff))
- {
- IapProgramByte(IAP_SECTOR0+(i*8)+1, LocalID);
- if(i != 0x00)
- {
- IapProgramByte(IAP_SECTOR0+(i*8)-8, 0x00);// 用过的存储块更改标志
- }
- return;
- }
- }
- IapEraseSector(IAP_SECTOR0);
- IapProgramByte(IAP_SECTOR0+1, LocalID);
- }
来源: http://www.bubuko.com/infodetail-3303006.html