[51单片机] C8051 FLASH 掉电保存问题

[复制链接]
3968|31
ayb_ice 发表于 2019-3-18 11:32 | 显示全部楼层
archiew 发表于 2019-3-18 11:29
这是芯片FLASH空间分配,我用的是下面的可用部分地址。0xF000左右,避开了程序代码存储区 ...

要不直接上代码吧
 楼主| archiew 发表于 2019-3-18 11:44 | 显示全部楼层
本帖最后由 archiew 于 2019-3-18 11:45 编辑
ayb_ice 发表于 2019-3-18 11:32
要不直接上代码吧
  1. // FLASH读写
  1. // 测试代码
  2. FLADDR start_address = 0xF000;
  3. U8 test_byte;
  4. test_byte = FLASH_ByteRead(start_address);
  5. FLASH_PageErase(start_address);
  6. FLASH_ByteWrite(start_address, test_byte+1);
  7. test_byte = FLASH_ByteRead(start_address);


ayb_ice 发表于 2019-3-18 11:46 | 显示全部楼层

这能看到什么呢
看驱动才行
 楼主| archiew 发表于 2019-3-18 11:46 | 显示全部楼层
 楼主| archiew 发表于 2019-3-18 11:48 | 显示全部楼层
ayb_ice 发表于 2019-3-18 11:46
这能看到什么呢
看驱动才行

FLASH读写的代码怎么发不上去?
 楼主| archiew 发表于 2019-3-18 11:50 | 显示全部楼层
ayb_ice 发表于 2019-3-18 11:46
这能看到什么呢
看驱动才行

ayb_ice 发表于 2019-3-18 13:07 | 显示全部楼层
本帖最后由 ayb_ice 于 2019-3-18 13:11 编辑
需要先页擦除
感觉差不多,没什么大问题,注意点细节即可
去掉禁止中断的相关代码,可以这样写
#pragma disable
u8 Flash_WriteByte(...)
...
然后读根本不需要什么API,直接读内存即可
u8 var = CBYTE(0x7c00);
ayb_ice 发表于 2019-3-18 13:12 | 显示全部楼层

这是我之前的代码,具体芯片型号可能不一样,供参考
//______________________________________________________________
// c8051f_eeprom_page_erase(10);
//______________________________________________________________
//
// 页擦除
// n = 页编号,0~xx
//
// 注意:页大小一般为512字节,最后两页不要使用。
//
#if EN_c8051f_eeprom_page_erase > 0
#pragma __EE_DISABLE
bool c8051f_eeprom_page_erase(U8 n)
{
        U8 xdata * px;

        if(n >= (NUMBER_OF_EE_PAGE - 1)){                // 最后一页一般保留,不能使用
                return false;
        }

        px = (U8 xdata *)(SIZEOF_C8051F_EE_PAGE * n);

        PSCTL = PSEE + PSWE;
        FLKEY = FLKEY_1;
        FLKEY = FLKEY_2;

        px[0] = 0;        // 启动擦除操作

        PSCTL = 0;

        return true;
}
#endif

//______________________________________________________________
// if(true != c8051f_eeprom_page_check(10))...
//______________________________________________________________
//
// 页擦除检查
// n = 页编号,0~xx
//
// 注意:页大小一般为512字节
//
#if EN_c8051f_eeprom_page_check > 0
bool c8051f_eeprom_page_check(U8 n)
{
        U16 k;
        U8 code * pc;

        if(n >= (NUMBER_OF_EE_PAGE - 1)){                // 最后一页一般保留,不能使用
                return false;
        }

        pc = (U8 code *)(SIZEOF_C8051F_EE_PAGE * n);

        for(k=SIZEOF_C8051F_EE_PAGE; k; k--,pc++){
                if(pc[0] != 0xff){
                        return false;
                }else{
                        __debug();
                }
        }

        return true;
}
#endif

//______________________________________________________________
// c8051f_eeprom_write_offset(10, 0, 55);
//______________________________________________________________
//
// 字节写
// n = 页编号
// offset = 偏移值
// k = 待写值
//
#if EN_c8051f_eeprom_write_offset > 0
#pragma __EE_DISABLE
bool c8051f_eeprom_write_offset(U8 n, U8 offset, U8 k)
{
        U8 xdata * px;

        if(n >= (NUMBER_OF_EE_PAGE - 1)){                // 最后一页一般保留,不能使用
                return false;
        }

        px = (U8 xdata *)(SIZEOF_C8051F_EE_PAGE * n + offset);

        PSCTL = PSWE;
        FLKEY = FLKEY_1;
        FLKEY = FLKEY_2;

        px[0] = k;

        PSCTL = 0;

//__________________________________
// 校验写入的值
        if(((U8 code *)px)[0] != k){                // U8 code *
                return false;        // 硬件调试时可能错误,脱机运行正确
        }else{
                __debug();
        }

        return true;
}
#endif
 楼主| archiew 发表于 2019-3-18 14:24 | 显示全部楼层
ayb_ice 发表于 2019-3-18 13:12
这是我之前的代码,具体芯片型号可能不一样,供参考
//_______________________________________________ ...

OK,我研究研究,谢谢了
ayb_ice 发表于 2019-3-19 11:09 | 显示全部楼层
archiew 发表于 2019-3-18 14:24
OK,我研究研究,谢谢了

搞定没有
 楼主| archiew 发表于 2019-3-19 22:32 | 显示全部楼层

可以掉电保存了,但是还有点问题:启用VDD monitor之后,每次上电需要手动复位才能读出来值;关掉VDD monitor就读不到值了,debug发现在写FLASH时
  1. FLASH_PageErase(start_address);
  2. FLASH_ByteWrite(start_address, test_byte+1);

执行完写FLASH,就跳到上一句FLASH擦除了,程序无法继续往下走
ayb_ice 发表于 2019-3-20 08:28 | 显示全部楼层
archiew 发表于 2019-3-19 22:32
可以掉电保存了,但是还有点问题:启用VDD monitor之后,每次上电需要手动复位才能读出来值;关掉VDD mon ...

官方应该有例程
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部