You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 21:48:04