N76E003 Flash
找到可用的N76e003Flash 这里注意 N76E003这种 51 内核 都是大端数据
MAIN
//======================================================================================= */ // 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" struct { UINT16 a; UINT32 b; UINT8 c; }StructData; UINT8 ArrayData[4]; /******************************************************************************************************************/ void main (void) { ArrayData[0]=0x10; ArrayData[1]=0x21; ArrayData[2]=0x32; ArrayData[3]=0x43; StructData.a=0x1234; StructData.b=0x56784321; StructData.c=0x55; WriteDataFlash(0x3800,ArrayData+0,1);//write 1 byte to flash WriteDataFlash(0x3801,ArrayData+1,3);//write 3 bytes WriteDataFlash(0x3804,(uint8_t *)&StructData,sizeof(StructData));//write structure ArrayData[0]=0; ArrayData[1]=0; ArrayData[2]=0; ArrayData[3]=0; StructData.a=0; StructData.b=0; StructData.c=0; ReadDataFlash(0x3800, ArrayData+0,4); ReadDataFlash (0x3804,(uint8_t *)&StructData,sizeof(StructData)); if(ArrayData[0]!=0x10||ArrayData[1]!=0x21||ArrayData[2]!=0x32||ArrayData[3]!=0x43) { while(1); } if(StructData.a!=0x1234||StructData.b!=0x56784321||StructData.c!=0x55) { while(1); } while(1); }
H文件
#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
C文件
/*---------------------------------------------------------------------------------------------------------*/ /* */ /* 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); } //-----------------------------------------------------------------------------------------------------------

浙公网安备 33010602011771号