收藏0 举报
/*---------------------------------------------------------------------------------------------------------*/ /* */ /* 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 (APROM) demo code //*********************************************************************************************************** #include "N76E003.h" #include "SFR_Macro.h" #include "Function_define.h" #include "Common.h" #include "Delay.h" //*********************************************************************************************************** #define CID_READ 0x0B #define DID_READ 0x0C /* Since the DATAFLASH is in the APROM. Program command is same as program APROM */ #define PAGE_ERASE_AP 0x22 #define BYTE_READ_AP 0x00 #define BYTE_PROGRAM_AP 0x21 #define PAGE_SIZE 128 #define ERASE_FAIL 0x70 #define PROGRAM_FAIL 0x71 #define IAPFF_FAIL 0x72 #define IAP_PASS 0x00 //--------------------------------------------------------------- // Following define by customer // Please confirm the start addresss not over your code size //--------------------------------------------------------------- #define DATA_SIZE 4096 #define DATA_START_ADDR 0x3800 /******************************************************************************************** Following IAP command register is also define in SFR_Macro.h #define set_IAPEN BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;CHPCON |= SET_BIT0 ;EA=BIT_TMP #define clr_IAPEN BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;CHPCON &= ~SET_BIT0;EA=BIT_TMP #define set_APUEN BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;IAPUEN |= SET_BIT0 ;EA=BIT_TMP #define clr_APUEN BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;IAPUEN &= ~SET_BIT0;EA=BIT_TMP **********************************************************************************************/ void IAP_ERROR_LED(void) { while (1) { clr_P03; Timer0_Delay1ms(100); set_P03; Timer0_Delay1ms(100); } } //-----------------------------------------------------------------------------------------------------------/ void Trigger_IAP(void) { set_IAPGO; //trigger IAP if((CHPCON&SET_BIT6)==SET_BIT6) // if fail flag is set, toggle error LED and IAP stop { clr_IAPFF; IAP_ERROR_LED(); } } /* WARNING: No matter read or writer, when IAPFF is set 1, this step process is fail. DATA should be ignore. */ //-----------------------------------------------------------------------------------------------------------/ /***************************************************************************************************************** Erase APROM subroutine: ******************************************************************************************************************/ void Erase_APROM(void) { UINT16 u16Count; set_IAPEN; // Enable IAP function IAPFD = 0xFF; // IMPORTANT !! To erase function must setting IAPFD = 0xFF IAPCN = PAGE_ERASE_AP; set_APUEN; // APROM modify Enable for(u16Count=0x0000;u16Count<DATA_SIZE/PAGE_SIZE;u16Count++) // { IAPAL = LOBYTE(u16Count*PAGE_SIZE + DATA_START_ADDR); IAPAH = HIBYTE(u16Count*PAGE_SIZE + DATA_START_ADDR); Trigger_IAP(); } clr_APUEN; clr_IAPEN; } //----------------------------------------------------------------------------------------------------------- void Erase_APROM_Verify(void) { UINT16 u16Count; set_IAPEN; IAPAL = LOBYTE(DATA_START_ADDR); IAPAH = HIBYTE(DATA_START_ADDR); IAPCN = BYTE_READ_AP; for(u16Count=0;u16Count<DATA_SIZE;u16Count++) { IAPFD = 0x00; Trigger_IAP(); if(IAPFD != 0xFF) IAP_ERROR_LED(); IAPAL++; if(IAPAL == 0x00) IAPAH++; } clr_IAPEN; } //----------------------------------------------------------------------------------------------------------- void Program_APROM(void) { UINT16 u16Count; set_IAPEN; set_APUEN; IAPAL = LOBYTE(DATA_START_ADDR); IAPAH = HIBYTE(DATA_START_ADDR); IAPCN = BYTE_PROGRAM_AP; for(u16Count=0;u16Count<DATA_SIZE;u16Count++) { IAPFD++; Trigger_IAP(); IAPAL++; if(IAPAL == 0) { IAPAH++; } } clr_APUEN; clr_IAPEN; } //----------------------------------------------------------------------------------------------------------- void Program_APROM_Verify(void) { UINT16 u16Count; UINT8 u8Read_Data; set_IAPEN; IAPAL = LOBYTE(DATA_START_ADDR); IAPAH = HIBYTE(DATA_START_ADDR); IAPCN = BYTE_READ_AP; u8Read_Data = 0x00; for(u16Count=0;u16Count<DATA_SIZE;u16Count++) { Trigger_IAP(); if(IAPFD != u8Read_Data) IAP_ERROR_LED(); IAPAL++; if(IAPAL == 0) { IAPAH++; } u8Read_Data ++; } clr_IAPEN; } //----------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------- void main (void) { Set_All_GPIO_Quasi_Mode; //---------toggle GPIO1--------- clr_GPIO1; Timer0_Delay1ms(100); set_GPIO1; Timer0_Delay1ms(100); clr_GPIO1; Timer0_Delay1ms(100); set_GPIO1; Timer0_Delay1ms(100); //---------end toggle GPIO1--------- Erase_APROM(); Erase_APROM_Verify(); Program_APROM(); Program_APROM_Verify(); //---------toggle GPIO1--------- clr_GPIO1; Timer0_Delay1ms(100); set_GPIO1; Timer0_Delay1ms(100); clr_GPIO1; Timer0_Delay1ms(100); set_GPIO1; Timer0_Delay1ms(100); //---------end toggle GPIO1--------- while(1); } //-----------------------------------------------------------------------------------------------------------
/*---------------------------------------------------------------------------------------------------------*/ /* */ /* Copyright(c) 2016 Nuvoton Technology Corp. All rights reserved. */ /* */ /*---------------------------------------------------------------------------------------------------------*/ //*********************************************************************************************************** // Nuvoton Technoledge Corp. // Website: http://www.nuvoton.com // E-Mail : MicroC-8bit@nuvoton.com // Date : Apr/21/2016 //*********************************************************************************************************** //*********************************************************************************************************** // File Function: N76E003 APROM program DATAFLASH (APROM) demo code //*********************************************************************************************************** #include "N76E003.h" #include "Common.h" #include "Delay.h" #include "SFR_Macro.h" #include "Function_define.h" #define CID_READ 0x0B #define DID_READ 0x0C /* Since the DATAFLASH is in the APROM. Program command is same as program APROM */ #define PAGE_ERASE_LD 0x62 #define BYTE_READ_LD 0x40 #define BYTE_PROGRAM_LD 0x61 #define PAGE_SIZE 128 #define ERASE_FAIL 0x70 #define PROGRAM_FAIL 0x71 #define IAPFF_FAIL 0x72 #define IAP_PASS 0x00 //--------------------------------------------------------------- // Following define by customer // Please confirm the start addresss not over your code size //--------------------------------------------------------------- #define DATA_SIZE 1024 #define DATA_START_ADDR 0x0000 /******************************************************************************************** Following IAP command register is also define in SFR_Macro.h #define set_IAPEN BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;CHPCON |= SET_BIT0 ;EA=BIT_TMP #define clr_IAPEN BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;CHPCON &= ~SET_BIT0;EA=BIT_TMP #define set_APUEN BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;IAPUEN |= SET_BIT0 ;EA=BIT_TMP #define clr_APUEN BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;IAPUEN &= ~SET_BIT0;EA=BIT_TMP **********************************************************************************************/ void IAP_ERROR_LED(void) { while (1) { clr_P03; Timer0_Delay1ms(100); set_P03; Timer0_Delay1ms(100); } } //-----------------------------------------------------------------------------------------------------------/ void Trigger_IAP(void) { set_IAPGO; //trigger IAP if((CHPCON&SET_BIT6)==SET_BIT6) // if fail flag is set, toggle error LED and IAP stop { clr_IAPFF; IAP_ERROR_LED(); } } /* WARNING: No matter read or writer, when IAPFF is set 1, this step process is fail. DATA should be ignore. */ //-----------------------------------------------------------------------------------------------------------/ /***************************************************************************************************************** Erase APROM subroutine: ******************************************************************************************************************/ void Erase_LDROM(void) { UINT16 u16Count; set_IAPEN; // Enable IAP function IAPFD = 0xFF; // IMPORTANT !! To erase function must setting IAPFD = 0xFF IAPCN = PAGE_ERASE_LD; set_LDUEN; // APROM modify Enable for(u16Count=0x0000;u16Count<DATA_SIZE/PAGE_SIZE;u16Count++) // { IAPAL = LOBYTE(u16Count*PAGE_SIZE + DATA_START_ADDR); IAPAH = HIBYTE(u16Count*PAGE_SIZE + DATA_START_ADDR); Trigger_IAP(); } // clr_LDUEN; // clr_IAPEN; } //----------------------------------------------------------------------------------------------------------- void Erase_LDROM_Verify(void) { UINT16 u16Count; set_IAPEN; IAPAL = LOBYTE(DATA_START_ADDR); IAPAH = HIBYTE(DATA_START_ADDR); IAPCN = BYTE_READ_LD; for(u16Count=0;u16Count<DATA_SIZE;u16Count++) { IAPFD = 0x00; Trigger_IAP(); if(IAPFD != 0xFF) IAP_ERROR_LED(); IAPAL++; if(IAPAL == 0x00) IAPAH++; } clr_IAPEN; } //----------------------------------------------------------------------------------------------------------- void Program_LDROM(void) { UINT16 u16Count; set_IAPEN; set_LDUEN; IAPAL = LOBYTE(DATA_START_ADDR); IAPAH = HIBYTE(DATA_START_ADDR); IAPCN = BYTE_PROGRAM_LD; for(u16Count=0;u16Count<DATA_SIZE;u16Count++) { IAPFD++; Trigger_IAP(); IAPAL++; if(IAPAL == 0) { IAPAH++; } } clr_LDUEN; clr_IAPEN; } //----------------------------------------------------------------------------------------------------------- void Program_LDROM_Verify(void) { UINT16 u16Count; UINT8 u8Read_Data; set_IAPEN; IAPAL = LOBYTE(DATA_START_ADDR); IAPAH = HIBYTE(DATA_START_ADDR); IAPCN = BYTE_READ_LD; u8Read_Data = 0x00; for(u16Count=0;u16Count<DATA_SIZE;u16Count++) { Trigger_IAP(); if(IAPFD != u8Read_Data) IAP_ERROR_LED(); IAPAL++; if(IAPAL == 0) { IAPAH++; } u8Read_Data ++; } clr_IAPEN; } //----------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------- void main (void) { Set_All_GPIO_Quasi_Mode; //---------toggle GPIO1--------- clr_GPIO1; Timer0_Delay1ms(100); set_GPIO1; Timer0_Delay1ms(100); clr_GPIO1; Timer0_Delay1ms(100); set_GPIO1; Timer0_Delay1ms(100); //---------end toggle GPIO1--------- Erase_LDROM(); Erase_LDROM_Verify(); Program_LDROM(); Program_LDROM_Verify(); //---------toggle GPIO1--------- clr_GPIO1; //---------end toggle GPIO1--------- while(1); } //-----------------------------------------------------------------------------------------------------------
/*---------------------------------------------------------------------------------------------------------*/ /* */ /* Copyright(c) 2016 Nuvoton Technology Corp. All rights reserved. */ /* */ /*---------------------------------------------------------------------------------------------------------*/ //*********************************************************************************************************** // Nuvoton Technoledge Corp. // Website: http://www.nuvoton.com // E-Mail : MicroC-8bit@nuvoton.com // Date : Apr/21/2016 //*********************************************************************************************************** //*********************************************************************************************************** // 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 = 0x80; 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); } } //-----------------------------------------------------------------------------------------------------------
/*---------------------------------------------------------------------------------------------------------*/ /* */ /* Copyright(c) 2015 Nuvoton Technology Corp. All rights reserved. */ /* */ /*---------------------------------------------------------------------------------------------------------*/ //*********************************************************************************************************** // Nuvoton Technoledge Corp. // Website: http://www.nuvoton.com // E-Mail : MicroC-8bit@nuvoton.com // Date : Apr/21/2016 //*********************************************************************************************************** //*********************************************************************************************************** // File Function: N76E003 LDROM program APROM demo code //*********************************************************************************************************** //*********************************************************************************************************** // Before using this demo code, please remind below CONFOGs setting, thanks. // CONFIG0.7 --> CBS=0 // CONFIG1 = 0xFC, because this demo code size is 2495 Byte //*********************************************************************************************************** #include "N76E003.h" #include "Common.h" #include "Delay.h" #include "SFR_Macro.h" #include "Function_define.h" #define CID_READ 0x0B #define DID_READ 0x0C #define CFG_READ 0xC0 #define CFG_ERASE 0xE2 #define PAGE_ERASE_AP 0x22 #define BYTE_READ_AP 0x00 #define BYTE_PROGRAM_AP 0x21 #define BYTE_PROGRAM_CFG 0xE1 #define BYTE_READ_CFG 0xC0 #define PAGE_SIZE 128 #define APROM_SIZE 8192 #define APROM_START_ADDR 0x0000 #define ERASE_FAIL 0x70 #define PROGRAM_FAIL 0x71 #define IAPFF_FAIL 0x72 #define IAP_PASS 0x00 //----------------------------------------------------------------------------------------------------------- void Trigger_IAP(void) { set_IAPGO; //trigger IAP if((CHPCON&SET_BIT6)==SET_BIT6) //check IAPFF (CHPCON.6), if flag = 1, the ISP process is fail. { while(1) { clr_GPIO1; Timer0_Delay1ms(100); set_GPIO1; Timer0_Delay1ms(100); } } } //----------------------------------------------------------------------------------------------------------- void Erase_CONFIG(void) { set_IAPEN; IAPAL = 0x00; IAPAH = 0x00; IAPFD = 0xFF; IAPCN = CFG_ERASE; set_CFUEN; Trigger_IAP(); clr_CFUEN; clr_IAPEN; } //----------------------------------------------------------------------------------------------------------- void Erase_APROM(void) { UINT16 u16Count; set_IAPEN; set_APUEN; // To erase or program APROM must enable APUEN IAPFD = 0xFF; // MUST setting IAPFD = 0xFF when do erase process. IAPCN = PAGE_ERASE_AP; for(u16Count=0x0000;u16Count<APROM_SIZE/PAGE_SIZE;u16Count++) { IAPAL = LOBYTE(u16Count*PAGE_SIZE + APROM_START_ADDR); IAPAH = HIBYTE(u16Count*PAGE_SIZE + APROM_START_ADDR); Trigger_IAP(); } clr_APUEN; clr_IAPEN; } //----------------------------------------------------------------------------------------------------------- BIT Erase_APROM_Verify(void) { UINT16 u16Count; BIT Error_Flag = 0; set_IAPEN; IAPAL = LOBYTE(APROM_START_ADDR); IAPAH = HIBYTE(APROM_START_ADDR); IAPCN = BYTE_READ_AP; for(u16Count=0;u16Count<APROM_SIZE/PAGE_SIZE;u16Count++) { IAPFD = 0x00; Trigger_IAP(); if(IAPFD != 0xFF) { Error_Flag = 1; break; } IAPAL++; if(IAPAL == 0x00) { IAPAH++; } } clr_IAPEN; if(Error_Flag == 1) return FAIL; else return PASS; } //----------------------------------------------------------------------------------------------------------- void Program_APROM(void) { UINT16 u16Count; set_IAPEN; set_APUEN; IAPAL = LOBYTE(APROM_START_ADDR); IAPAH = HIBYTE(APROM_START_ADDR); IAPFD = 0xFF; IAPCN = BYTE_PROGRAM_AP; for(u16Count=0;u16Count<APROM_SIZE;u16Count++) { IAPFD++; Trigger_IAP(); IAPAL++; if(IAPAL == 0) { IAPAH++; } } clr_APUEN; clr_IAPEN; } //----------------------------------------------------------------------------------------------------------- BIT Program_APROM_Verify(void) { UINT16 u16Count; UINT8 u8Read_Data; BIT Error_Flag = 0; set_IAPEN; IAPAL = LOBYTE(APROM_START_ADDR); IAPAH = HIBYTE(APROM_START_ADDR); IAPCN = BYTE_READ_AP; u8Read_Data = 0x00; for(u16Count=0;u16Count<APROM_SIZE;u16Count++) { Trigger_IAP(); if(IAPFD != u8Read_Data) { Error_Flag = 1; break; } IAPAL++; if(IAPAL == 0) { IAPAH++; } u8Read_Data ++; } clr_IAPEN; if(Error_Flag == 1) return FAIL; else return PASS; } //----------------------------------------------------------------------------------------------------------- void Program_CONFIG(UINT8 u8Address,UINT8 u8Data) { set_IAPEN; IAPAL = u8Address; IAPAH = 0x00; IAPFD = u8Data; IAPCN = BYTE_PROGRAM_CFG; set_CFUEN; Trigger_IAP(); clr_CFUEN; clr_IAPEN; } //----------------------------------------------------------------------------------------------------------- void main (void) { Set_All_GPIO_Quasi_Mode; clr_GPIO1; Timer0_Delay1ms(300); set_GPIO1; Timer0_Delay1ms(300); clr_GPIO1; Timer0_Delay1ms(300); set_GPIO1; Erase_APROM(); // if(Erase_APROM_Verify() == FAIL) // { // DISPLAY_LED = ERASE_FAIL; // while(1); // } Program_APROM(); // if(Program_APROM_Verify() == FAIL) // { // DISPLAY_LED = PROGRAM_FAIL; // while(1); // } Program_CONFIG(0x04,0x0F); //Program CONFIG4 = 0x0F; Enable WDT reset function. //Please always very carefully about the CONFIG program function. espcially about the CBS bit / LDROM size... Timer0_Delay1ms(200); while(1); } //-----------------------------------------------------------------------------------------------------------
Eric@Wei 发表于 2017-9-19 08:59 同求链接
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
人才类勋章
2
17
0
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号