打印
[技术问答]

新塘N76E003如何在XRAM或者FLASH中模拟eeprom,实现数据存储

[复制链接]
5405|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小白flame|  楼主 | 2018-1-18 20:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
新塘N76E003如何在XRAM或者FLASH中模拟eeprom,实现数据存储
评论
Walter_gan 2018-7-24 14:44 回复TA
官网例程在demo板上,无法正常读取存储的数据,为何啊?读出的都是00,盼解决 
沙发
caidenghua| | 2018-1-18 21:37 | 只看该作者
模拟eeprom得用flash,断电后数据才不会丢,每次使用不同的位置,当一页写满后,擦除再使用,存储数据先读到RAM后再擦除

使用特权

评论回复
板凳
jiekou001| | 2018-1-18 21:38 | 只看该作者
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2017 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/

//***********************************************************************************************************
//  Nuvoton Technoledge Corp.
//  Website: http://www.nuvoton.com
//  E-Mail : MicroC-8bit@nuvoton.com
//  Date   : Apr/21/2017
//***********************************************************************************************************

//***********************************************************************************************************
//  File Function: N76E003 APROM program DATAFLASH as EEPROM way
//***********************************************************************************************************
#include "N76E003.h"
#include "Common.h"
#include "Delay.h"
#include "SFR_Macro.h"
#include "Function_define.h"


/*****************************************************************************************************************
write_DATAFLASH_BYTE :
user can copy all this subroutine into project, then call this function in main.
******************************************************************************************************************/               
void write_DATAFLASH_BYTE(UINT16 u16_addr,UINT8 u8_data)
{
        UINT8 looptmp=0,u8_addrl_r;
        unsigned char code *cd_longaddr;
        unsigned char xdata *xd_tmp;
       
//Check page start address
        u8_addrl_r = u16_addr;
        if (u8_addrl_r<0x80)
        {
                u8_addrl_r = 0;
        }
        else
        {
                u8_addrl_r = 0x80;
        }
//Save APROM data to XRAM
        xd_tmp = 0x80;
        cd_longaddr = (u16_addr&0xff00)+u8_addrl_r;       
        while (xd_tmp !=0x100)
        {
                *xd_tmp = *cd_longaddr;
                looptmp++;
                xd_tmp++;
                cd_longaddr++;
        }
// Modify customer data in XRAM
        u8_addrl_r = u16_addr;
        if (u8_addrl_r<0x80)
        {
                xd_tmp = u8_addrl_r+0x80;
        }
        else
        {
                xd_tmp = u8_addrl_r+0;
        }
        *xd_tmp = u8_data;
//Erase APROM DATAFLASH page
                IAPAL = u16_addr;
                IAPAH = u16_addr>>8;
                IAPFD = 0xFF;
          set_IAPEN;
                set_APUEN;
    IAPCN = 0x22;                
                set_IAPGO;
//Save changed RAM data to APROM DATAFLASH
        u8_addrl_r = u16_addr;
        if (u8_addrl_r<0x80)
        {
                u8_addrl_r =0;
        }
        else
        {
                u8_addrl_r = 0x80;
        }
                xd_tmp = 0x280;
          IAPAL = u8_addrl_r;
    IAPAH = u16_addr>>8;
                set_IAPEN;
                set_APUEN;
          IAPCN = 0x21;
                while (xd_tmp !=0xFF)
                {
                        IAPFD = *xd_tmp;
                        set_IAPGO;
                        IAPAL++;
                        xd_tmp++;
                }
                clr_APUEN;
                clr_IAPEN;
}       
       
//-------------------------------------------------------------------------
UINT8 read_APROM_BYTE(UINT16 code *u16_addr)
{
        UINT8 rdata;
        rdata = *u16_addr>>8;
        return rdata;
}

/******************************************************************************************************************/       


void main (void)
{
                UINT8 datatemp;
/* -------------------------------------------------------------------------*/
/*  Dataflash use APROM area, please ALWAYS care the address of you code    */
/*        APROM 0x3800~0x38FF demo as dataflash                                                                                                     */
/*         Please use Memory window key in C:0x3800 to check earse result                                        */             
/* -------------------------------------------------------------------------*/
                InitialUART0_Timer1(115200);
//call write byte
                write_DATAFLASH_BYTE (0x3881,0x55);
                write_DATAFLASH_BYTE (0x3882,0x56);
                write_DATAFLASH_BYTE (0x3855,0xaa);
                write_DATAFLASH_BYTE (0x3856,0x66);
//call read byte
                datatemp = read_APROM_BYTE(0x3882);

    while(1)
                {
//                                printf ("\n data temp = 0x%bx", datatemp);
                }
}
//-----------------------------------------------------------------------------------------------------------

使用特权

评论回复
评论
Walter_gan 2018-7-24 14:41 回复TA
就是这个例程,但我仿真的时候,读出的是00,为何? 
地板
jiekou001| | 2018-1-18 21:38 | 只看该作者
去官网下载
N76E003_BSP_Keil_C51_V1.0.4
这个

使用特权

评论回复
5
小白flame|  楼主 | 2018-1-18 22:33 | 只看该作者
jiekou001 发表于 2018-1-18 21:38
去官网下载
N76E003_BSP_Keil_C51_V1.0.4
这个

使用特权

评论回复
6
xinxianshi| | 2018-1-19 18:43 | 只看该作者
这个方面,官方提供了例子,我之前跑了一次测试, 没问题。

使用特权

评论回复
评论
changjiong 2018-4-12 23:32 回复TA
你好,为什么我使用官方的例程"IAP_Dataflash_EEPROM"不行呢,是要设置哪里吗? 
7
小白flame|  楼主 | 2018-1-19 20:57 | 只看该作者
eeprom 的有多大的区域,起始地址一般是多少?code会不会对存储区域有影响

使用特权

评论回复
8
mintspring| | 2018-1-23 20:20 | 只看该作者
太复杂了

使用特权

评论回复
9
huangcunxiake| | 2018-1-24 15:17 | 只看该作者
按照例子没搞定吗,这个好多人都用过的。

使用特权

评论回复
评论
小白flame 2018-1-24 16:38 回复TA
不是没搞定 ,例程中代码eeprom是存储在FLASH中的,如果我flash区域有code,是不是会有影响呢? 
10
huangcunxiake| | 2018-1-24 17:41 | 只看该作者
不会有影响,编译器会给你分开的。

使用特权

评论回复
11
小白flame|  楼主 | 2018-1-29 19:48 | 只看该作者
huangcunxiake 发表于 2018-1-24 17:41
不会有影响,编译器会给你分开的。

首先写操作的时候,接口函数会擦除整页数据的啊.
然后假设我的ROM使用5k的个字节,然后我写的EEPROM数据的首地址正好在这5K数据中,会不会对这块内存(code区域)中有影响.

使用特权

评论回复
12
xinxianshi| | 2018-4-17 16:11 | 只看该作者
小白flame 发表于 2018-1-29 19:48
首先写操作的时候,接口函数会擦除整页数据的啊.
然后假设我的ROM使用5k的个字节,然后我写的EEPROM数据的 ...

肯定会有影响啊,所以你要代码在前,EEPROM放后面,这样错开。

使用特权

评论回复
13
xinxianshi| | 2018-4-17 16:11 | 只看该作者
还有就是编译器编译后有个消息,告诉你用了多少RAM和多少ROM。

使用特权

评论回复
14
511602231| | 2018-4-27 15:22 | 只看该作者
你好,请问新唐003 flash当EEPROM的搞定了没

使用特权

评论回复
15
Walter_gan| | 2018-7-24 14:42 | 只看该作者
xinxianshi 发表于 2018-1-19 18:43
这个方面,官方提供了例子,我之前跑了一次测试, 没问题。

我也是,无法正常读出数据。读出的是00,盼新唐解决。

使用特权

评论回复
16
xinxianshi| | 2018-7-29 13:07 | 只看该作者
Walter_gan 发表于 2018-7-24 14:42
我也是,无法正常读出数据。读出的是00,盼新唐解决。

看下个版本了。自己按照手册操作是没问题的。

使用特权

评论回复
17
xixi2017| | 2018-7-29 15:33 | 只看该作者
发现新手不知道去下载BSP

使用特权

评论回复
18
cyj1232| | 2018-9-11 13:28 | 只看该作者
没有,我用官方的例程和论坛上的例子,都没有写进去,不知道什么原因,编译是没有问题,在调试窗口看,没有改写到,读出来,通过串口显示,读出的值为零,将读出地址改为其他已编程程序数据区,读出数据是正确的,就是数据没有写进去

使用特权

评论回复
19
cyj1232| | 2018-9-11 13:30 | 只看该作者
xixi2017“发现新手不知道去下载BSP”
当EEPROM用,和BSP有关系吗?

使用特权

评论回复
20
liulcf2018| | 2018-10-20 21:17 | 只看该作者
用新唐N76E003 BSP里的FLSAH模拟EEPROM,读写数据时会改变其他XRAM中的数据,什么原因????

使用特权

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

本版积分规则

5

主题

20

帖子

1

粉丝