打印
[DemoCode下载]

N76E003 flash模拟EEPROM例程

[复制链接]
3139|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yiyigirl2014|  楼主 | 2018-4-14 10:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
N76E003 flash.zip (1.98 KB)
本例程可以一次读写多个字节,支持跨页读写。并且在写入前会对待写入区域检测是否是空白的,如果空白就不执行擦除动作就直接写入数据,这样可以节省时间。
沙发
yiyigirl2014|  楼主 | 2018-4-14 10:02 | 只看该作者
//=======================================================================================                                                                                                      */
// Copyright(c) 2017 Nuvoton(SH) Technology Corp. All rights reserved.                       
// Website: http://www.nuvoton.com
// Date   : 6/1/2017
//=======================================================================================                                                                                                      */
#include "N76E003.h"
#include "SFR_Macro.h"
#include "Function_define.h"
#include "Flash.h"





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


void main (void)
{
        UINT8 xdata datatemp[8];       

        datatemp[0]=0x10;
        datatemp[1]=0x21;
        datatemp[2]=0x32;
        datatemp[3]=0x43;

    WriteDataFlash (0x3800,datatemp+0,1);
        WriteDataFlash (0x3801,datatemp+1,3);
        ReadDataFlash (0x3800,datatemp+4,4);
    while(1)
        {
//                                printf ("\n data temp = 0x%bx", datatemp);
        }
}

使用特权

评论回复
板凳
yiyigirl2014|  楼主 | 2018-4-14 10:03 | 只看该作者
#ifndef  __FLASH_H
#define  __FLASH_H

#define     CID_READ            0x0B
#define     DID_READ            0x0C

#define     PAGE_ERASE_AP       0x22
#define     BYTE_READ_AP        0x00
#define     BYTE_PROGRAM_AP     0x21
#define     PAGE_SIZE           128u

#define     ERASE_FAIL          0x70
#define     PROGRAM_FAIL        0x71
#define     IAPFF_FAIL          0x72
#define     IAP_PASS            0x00



//=======================================================================================
// 输入 u16_addr,  待写入APROM的起始地址
//      pDat,      待写数据的起始地址
//      num,       总共写入数据的字节数
//支持跨page写,写数据时不需要擦flash,函数内部会自己擦除
//=======================================================================================
void WriteDataFlash(uint16_t u16_addr,uint8_t *pDat,uint16_t num);

//=======================================================================================
// 输入 u16_addr,  待读出APROM的起始地址
//      pDat,      待读数据的起始地址
//      num,       总共读出数据的字节数
//支持跨page读
//=======================================================================================
void ReadDataFlash(uint16_t u16_addr,uint8_t *pDat,uint16_t num);
#endif //__FLASH_H

使用特权

评论回复
地板
yiyigirl2014|  楼主 | 2018-4-14 10:03 | 只看该作者
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2017 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/

//***********************************************************************************************************
//  Website: http://www.nuvoton.com
//  E-Mail : MicroC-8bit@nuvoton.com
//  Date   : Jan/21/2017
//***********************************************************************************************************

//***********************************************************************************************************
//  File Function: N76E003 APROM program DATAFLASH as EEPROM way
//***********************************************************************************************************
#include "N76E003.h"
#include "Flash.h"

static bit EA_Save_bit;

void Enable_IAP_Mode(void)
{
  EA_Save_bit=EA;
        EA=0;
        TA=0xAA;
        TA=0x55;
        CHPCON|=0x01 ;
        TA=0xAA;
        TA=0x55;
        IAPUEN|=0x01;
        EA=EA_Save_bit;
}
//-----------------------------------------------------------------------------------------------------------
void Disable_IAP_Mode(void)
{
  EA_Save_bit=EA;
  EA=0;
  TA=0xAA;
  TA=0x55;
  IAPUEN&=~0x01;
  TA=0xAA;
  TA=0x55;
  CHPCON&=~0x01;
  EA=EA_Save_bit;
}
//-----------------------------------------------------------------------------------------------------------
void Trigger_IAP(void)
{
        EA_Save_bit=EA;
        EA=0;
        TA=0xAA;
        TA=0x55;
        IAPTRG|=0x01;
        EA=EA_Save_bit;
}

       
uint8_t WriteDataToOnePage(uint16_t u16_addr,const uint8_t *pDat,uint8_t num)
{
  uint8_t i,offset;
  uint8_t code *pCode;
  uint8_t xdata xd_tmp[128];

        Enable_IAP_Mode();
        offset=u16_addr&0x007F;
        i = PAGE_SIZE - offset;
        if(num>i)num=i;
  pCode = (uint8_t code *)u16_addr;
  for(i=0;i<num;i++)
  {
    if(pCode[i]!=0xFF)break;
  }
        if(i==num)
        {
          IAPCN =BYTE_PROGRAM_AP;
                IAPAL = u16_addr;
                IAPAH = u16_addr>>8;
                for(i=0;i<num;i++)
                {
                        IAPFD = pDat[i];
                        Trigger_IAP();
                        IAPAL++;
                }
                for(i=0;i<num;i++)
                {
                        if(pCode[i]!=pDat[i])break;
                }
                if(i!=num) goto WriteDataToPage20;
        }
        else
        {
                WriteDataToPage20:
                pCode = (uint8_t code *)(u16_addr&0xff80);
                for(i=0;i<128;i++)
                {
                        xd_tmp[i] = pCode[i];
                }
                for(i=0;i<num;i++)
                {
                        xd_tmp[offset+i] = pDat[i];
                }
                do
                {
                        IAPAL = (u16_addr&0xff80);
                        IAPAH = u16_addr>>8;
                        IAPCN = PAGE_ERASE_AP;
                        IAPFD = 0xFF;       
                        Trigger_IAP();
                        IAPCN =BYTE_PROGRAM_AP;
                        for(i=0;i<128;i++)
                        {
                                IAPFD = xd_tmp[i];
                                Trigger_IAP();
                                IAPAL++;
                        }
                        for(i=0;i<128;i++)
                        {
                                if(pCode[i]!=xd_tmp[i])break;
                        }
                }while(i!=128);
               
        }
        Disable_IAP_Mode();
       
        return num;
}       

//-------------------------------------------------------------------------
void WriteDataFlash(uint16_t u16_addr,uint8_t *pDat,uint16_t num)
{
        uint8_t CPageAddr,EPageAddr,cnt;
        CPageAddr=u16_addr>>7;
        EPageAddr=(u16_addr+num)>>7;
        while(CPageAddr!=EPageAddr)
        {
                cnt=WriteDataToOnePage(u16_addr,pDat,128);
                u16_addr+=cnt;
                pDat+=cnt;
                num-=cnt;
                CPageAddr=u16_addr>>7;
        }
        if(num)
        {
                WriteDataToOnePage(u16_addr,pDat,num);
        }
}
//-------------------------------------------------------------------------
void ReadDataFlash(uint16_t u16_addr,uint8_t *pDat,uint16_t num)
{
        uint16_t i;
        for(i=0;i<num;i++)
    pDat[i] = *(uint8_t code *)(u16_addr+i);
}
//-----------------------------------------------------------------------------------------------------------

使用特权

评论回复
5
dongliushui| | 2018-4-14 10:24 | 只看该作者
是验证过的?收下了。

使用特权

评论回复
6
598330983| | 2018-4-14 17:24 | 只看该作者
//******************************************************************************
// This code illustrates how to use IAP to make APROM 201h as a byte of
// Data Flash when user code is executed in APROM.
//******************************************************************************
#define PAGE_ERASE_AP 0x22
#define BYTE_PROGRAM_AP 0x21
/*Data Flash, as part of APROM, is read by MOVC. Data Flash can be defined as
128-element array in “code” area from absolute address 0x0200 */
volatile unsigned char code Data_Flash[128] _at_ 0x0200;
Main (void)
{
TA = 0xAA; //CHPCON is TA protected
TA = 0x55;
CHPCON |= 0x01; //IAPEN = 1, enable IAP mode
TA = 0xAA; //IAPUEN is TA protected
TA = 0x55;
IAPUEN |= 0x01; //APUEN = 1, enable APROM update
IAPCN = PAGE_ERASE_AP; //Erase page 200h~27Fh
IAPAH = 0x02;
IAPAL = 0x00;
IAPFD = 0xFF;
TA = 0xAA; //IAPTRG is TA protected
TA = 0x55;
IAPTRG |= 0x01; //write ‘1’ to IAPGO to trigger IAP process
IAPCN = BYTE_PROGRAM_AP; // Program 201h with 55h
IAPAH = 0x02;
IAPAL = 0x01;
IAPFD = 0x55;
TA = 0xAA;
TA = 0x55;
IAPTRG |= 0x01; //write ‘1’ to IAPGO to trigger IAP process
TA = 0xAA; //IAPUEN is TA protected
TA = 0x55;
IAPUEN &= ~0x01; //APUEN = 0, disable APROM update
TA = 0xAA; //CHPCON is TA protected
TA = 0x55;
CHPCON &= ~0x01; //IAPEN = 0, disable IAP mode
P0 = Data_Flash[1]; //Read content of address 200h+1
while(1);
}

使用特权

评论回复
7
huangcunxiake| | 2018-4-15 08:52 | 只看该作者
楼上的这个看着更简单。

使用特权

评论回复
8
gejigeji521| | 2018-4-15 10:45 | 只看该作者
官方提供的也有这个例子的。BSP里面。

使用特权

评论回复
9
pmw_56| | 2018-4-15 15:53 | 只看该作者
mark

使用特权

评论回复
10
幸福小强| | 2018-4-15 22:46 | 只看该作者
可以节约一片存储颗粒,还可以用于掉电数据保护。

使用特权

评论回复
11
zhuomuniao110| | 2018-4-16 17:17 | 只看该作者
通过IAP方式实现吗

使用特权

评论回复
12
yiy| | 2018-4-16 21:25 | 只看该作者
MARK,应该可以。

使用特权

评论回复
13
yiy| | 2018-4-16 21:26 | 只看该作者
这个用的人还是很多的。

使用特权

评论回复
14
shuben| | 2018-4-19 18:19 | 只看该作者
mark

使用特权

评论回复
15
xuanhuanzi| | 2018-4-20 22:35 | 只看该作者
IAP下的一种操作方式。

使用特权

评论回复
16
dongliushui| | 2018-4-20 23:32 | 只看该作者
用IAP指令操作存储区

使用特权

评论回复
17
奇立电源| | 2019-5-23 22:31 | 只看该作者
时间怎么样

使用特权

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

本版积分规则

199

主题

3461

帖子

10

粉丝