发新帖我要提问
12
返回列表
打印
[51单片机]

C8051 FLASH 掉电保存问题

[复制链接]
楼主: archiew
手机看帖
扫描二维码
随时随地手机跟帖
21
ayb_ice| | 2019-3-18 11:32 | 只看该作者 回帖奖励 |倒序浏览
archiew 发表于 2019-3-18 11:29
这是芯片FLASH空间分配,我用的是下面的可用部分地址。0xF000左右,避开了程序代码存储区 ...

要不直接上代码吧

使用特权

评论回复
22
archiew|  楼主 | 2019-3-18 11:44 | 只看该作者
本帖最后由 archiew 于 2019-3-18 11:45 编辑
ayb_ice 发表于 2019-3-18 11:32
要不直接上代码吧
// FLASH读写
// 测试代码
FLADDR start_address = 0xF000;
U8 test_byte;
test_byte = FLASH_ByteRead(start_address);
FLASH_PageErase(start_address);
FLASH_ByteWrite(start_address, test_byte+1);
test_byte = FLASH_ByteRead(start_address);


使用特权

评论回复
23
ayb_ice| | 2019-3-18 11:46 | 只看该作者

这能看到什么呢
看驱动才行

使用特权

评论回复
24
archiew|  楼主 | 2019-3-18 11:46 | 只看该作者

使用特权

评论回复
25
archiew|  楼主 | 2019-3-18 11:48 | 只看该作者
ayb_ice 发表于 2019-3-18 11:46
这能看到什么呢
看驱动才行

FLASH读写的代码怎么发不上去?

使用特权

评论回复
26
archiew|  楼主 | 2019-3-18 11:50 | 只看该作者
ayb_ice 发表于 2019-3-18 11:46
这能看到什么呢
看驱动才行

使用特权

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

使用特权

评论回复
28
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

使用特权

评论回复
29
archiew|  楼主 | 2019-3-18 14:24 | 只看该作者
ayb_ice 发表于 2019-3-18 13:12
这是我之前的代码,具体芯片型号可能不一样,供参考
//_______________________________________________ ...

OK,我研究研究,谢谢了

使用特权

评论回复
30
ayb_ice| | 2019-3-19 11:09 | 只看该作者
archiew 发表于 2019-3-18 14:24
OK,我研究研究,谢谢了

搞定没有

使用特权

评论回复
31
archiew|  楼主 | 2019-3-19 22:32 | 只看该作者

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

执行完写FLASH,就跳到上一句FLASH擦除了,程序无法继续往下走

使用特权

评论回复
32
ayb_ice| | 2019-3-20 08:28 | 只看该作者
archiew 发表于 2019-3-19 22:32
可以掉电保存了,但是还有点问题:启用VDD monitor之后,每次上电需要手动复位才能读出来值;关掉VDD mon ...

官方应该有例程

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则