MPLAB C语言开发如何实现修改后的初始化变量掉电永久保存
问题解决方案
你当前变量存在RAM内存中,掉电后RAM数据会全部清空,因此每次上电都会被重新赋值为默认值9。要实现掉电记忆功能,需要将变量存储到MCU自带的非易失性存储介质中,PIC系列MCU一般自带EEPROM,也可使用程序Flash模拟存储,以下是MPLAB XC编译器下的具体实现方案:
实现逻辑
- 分配2个固定的EEPROM存储地址:1个存标记位判断是否首次启动,1个存
M1sps的实际值 - 首次上电检测到标记位未初始化时,写入默认值和初始化标记
- 后续上电直接从EEPROM读取已保存的
M1sps值 - 每次修改
M1sps值后,同步写入EEPROM完成更新
示例代码
#include <xc.h> // 配置EEPROM相关宏,根据你的MCU型号调整,以下为通用示例 #define EEPROM_FLAG_ADDR 0x00 // 首次启动标记存储地址 #define EEPROM_M1SPS_ADDR 0x01 // M1sps值存储地址 #define INIT_FLAG 0xAA // 首次初始化完成标记 // EEPROM读函数 unsigned char EEPROM_Read(unsigned char addr) { EEADR = addr; EECON1bits.EEPGD = 0; EECON1bits.RD = 1; return EEDATA; } // EEPROM写函数 void EEPROM_Write(unsigned char addr, unsigned char data) { EEADR = addr; EEDATA = data; EECON1bits.EEPGD = 0; EECON1bits.WREN = 1; // 关中断避免写入出错 GIE = 0; // 固定写入时序 EECON2 = 0x55; EECON2 = 0xAA; EECON1bits.WR = 1; // 等待写入完成 while(EECON1bits.WR); EECON1bits.WREN = 0; // 恢复中断 GIE = 1; } void main (void) { unsigned char M1sps; // 上电首先读取EEPROM标记判断是否首次启动 if(EEPROM_Read(EEPROM_FLAG_ADDR) != INIT_FLAG) { // 首次启动,写入默认值 M1sps = 9; EEPROM_Write(EEPROM_M1SPS_ADDR, M1sps); // 写入初始化标记,后续上电不再走初始化逻辑 EEPROM_Write(EEPROM_FLAG_ADDR, INIT_FLAG); } else { // 非首次启动,读取EEPROM存储的数值 M1sps = EEPROM_Read(EEPROM_M1SPS_ADDR); } while(1) { if (M1sps == 9) { M1sps = 20; // 修改值后同步写入EEPROM EEPROM_Write(EEPROM_M1SPS_ADDR, M1sps); } } }
注意事项
- EEPROM有擦写次数上限(一般为10万次左右),不要高频循环执行写入操作
- 如果你的MCU没有硬件EEPROM,可参考对应芯片手册使用程序Flash模拟非易失性存储,XC编译器也提供了对应Flash操作库函数
- 部分MCU的EEPROM操作需要先开启对应外设时钟,可根据你的实际芯片型号调整代码
内容的提问来源于stack exchange,提问作者Chronic
相关产品推荐
相关产品推荐

