N76E003之模擬EEPROM

在使用STM32時,常可以將內部1flash的一部分劃作數據儲存區(EEPROM),用於掉電後的數據保存。而N76E003單片機也可實現類似的功能。
在這裏插入圖片描述
在這裏插入圖片描述
下圖爲N76E003的內存分配圖,我們可以從下圖中看到APROM使用的地址範圍(APROM + LDROM = 18K,當LDROM爲0時,APROM的地址爲0000~0x47FF)
在這裏插入圖片描述
下面的程序爲新唐官方所給出的例程,我只進行了粗淺的註釋

//***********************************************************************************************************
//  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"

#define ADDR_BASE 0x4700//位於地址末端.4700~47FF共256字節

#define FLASH_L_LOW			ADDR_BASE+1
#define FLASH_L_HIGH		ADDR_BASE+2
#define FLASH_H_LOW			ADDR_BASE+3
#define FLASH_H_HIGH		ADDR_BASE+4

volatile unsigned char xdata page_buffer[128];

/*********************************************************
功能:讀取APROM中的一位數據
參數:需要讀取的內存地址(addr)
*********************************************************/
UINT8 Read_APROM_BYTE(UINT16 code *u16_addr)
{
	UINT8 rdata;
	rdata = *u16_addr>>8;
	return rdata;
}
/*****************************************************************************************************************
write_DATAFLASH_BYTE :
寫入flash數據
user can copy all this subroutine into project, then call this function in main.
用戶能複製這所有的代碼區工程中,然後調用這個函數在主函數中

功能:在指定Flash地址寫入數據
參數:需要寫入的flash地址、需要寫入的數據、
******************************************************************************************************************/		
void Write_DATAFLASH_BYTE(unsigned int u16EPAddr,unsigned char u8EPData)
{
	unsigned char looptmp=0;
	unsigned int u16_addrl_r;
	unsigned int RAMtmp;
	
//Check page start address
	u16_addrl_r=(u16EPAddr/128)*128;
//Save APROM data to XRAM0
	for(looptmp=0;looptmp<0x80;looptmp++)
	{
		RAMtmp = Read_APROM_BYTE((unsigned int code *)(u16_addrl_r+looptmp));
		page_buffer[looptmp]=RAMtmp;
	}
// Modify customer data in XRAM
		page_buffer[u16EPAddr&0x7f] = u8EPData;
	
//Erase APROM DATAFLASH page
		IAPAL = u16_addrl_r&0xff;
		IAPAH = (u16_addrl_r>>8)&0xff;
		IAPFD = 0xFF;
	  set_IAPEN; 
		set_APUEN;
    IAPCN = 0x22; 		
 		set_IAPGO; 
		
//Save changed RAM data to APROM DATAFLASH
		set_IAPEN; 
		set_APUEN;
	  IAPCN = 0x21;
		for(looptmp=0;looptmp<0x80;looptmp++)
		{
			IAPAL = (u16_addrl_r&0xff)+looptmp;
      IAPAH = (u16_addrl_r>>8)&0xff;
			IAPFD = page_buffer[looptmp];
			set_IAPGO;			
		}
		clr_APUEN;
		clr_IAPEN;
}	
	
/******************************************************************************************************************/	


void main (void) 
{
		UINT8 datatemp;
		UINT16 system16highsite;
/* -------------------------------------------------------------------------*/
/*  Dataflash use APROM area, please ALWAYS care the address of you code    */
數據閃存使用APROM區,請一定保證這部分數據和你的代碼地址不會衝突
/*	APROM 0x3800~0x38FF demo as dataflash 				      				      			*/
APRON 地址爲0x3800~0x38ff  演示作爲數據內存
/* 	Please use Memory window key in C:0x3800 to check earse result					*/	  
請使用內存窗口密匙 (C:0x3800)去檢查結果?????    
/* -------------------------------------------------------------------------*/
		InitialUART0_Timer1(115200);//串口初始化
//call write byte 
		Write_DATAFLASH_BYTE (0x3802,0x34);//在0x3802地址寫入數據0x34
		Write_DATAFLASH_BYTE (FLASH_L_LOW,0x55);//在0x4700地址寫入數據0x55
		Write_DATAFLASH_BYTE (FLASH_L_HIGH,0x56);//0x4701寫入0x56
		Write_DATAFLASH_BYTE (FLASH_H_LOW,0xaa);//0x4702寫入0xaa
		Write_DATAFLASH_BYTE (FLASH_H_HIGH,0x66);//0x4703寫入0x66
//call read byte
		datatemp = Read_APROM_BYTE(0x3802);
		system16highsite = ((Read_APROM_BYTE(FLASH_H_HIGH)<<8)+Read_APROM_BYTE(FLASH_H_LOW));

    while(1)
		{
//				printf ("\n data temp = 0x%bx", datatemp);//打印datatemp中數據
		}
}

總結:使用flash作爲eeprom時,最好按實際需求從47FF倒着寫,以此保證不會干擾程序的正常運行。

https://blog.csdn.net/DZRYWYBL/article/details/86320325在此感謝這位博主分享經驗)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章