收藏0 举报
/*---------------------------------------------------------------------------------------------------------*/ /* */ /* Copyright(c) 2017 Nuvoton Technology Corp. All rights reserved. */ /* */ /*---------------------------------------------------------------------------------------------------------*/ //*********************************************************************************************************** //*********************************************************************************************************** //*********************************************************************************************************** // 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); } } //-----------------------------------------------------------------------------------------------------------
lizhenming 发表于 2018-6-1 08:29 搞不懂例程为什么先将数据保存到XRAM?之后再写入flash?
hj007 发表于 2018-6-1 08:50 楼主可以先把官方的例程看懂。 这是我之前回复被人的,可以参考一下。 https://bbs.21ic.com/forum.php?mo ...
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
人才类勋章
22
129
2
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号