int32_t DrvFMC_WriteConfig(uint32_t u32data0, uint32_t u32data1) { //Only in LDROM uint32_t u32data[256]; DrvFMC_ReadBuffer(0, u32data, 1024); DrvFMC_Erase(0); if ( DrvFMC_Erase(CONFIG0) ) //2011.4.7 return E_DRVFMC_ERR_ISP_FAIL; DrvFMC_WriteBuffer(0, u32data, 1024); if ( DrvFMC_Write(CONFIG0, u32data0) ) //2011.4.7 return E_DRVFMC_ERR_ISP_FAIL; return DrvFMC_Write(CONFIG1, u32data1); }
int32_t DrvFMC_WriteConfig(uint32_t u32data0, uint32_t u32data1) { if ( DrvFMC_Erase(CONFIG0) != E_SUCCESS ) // return E_DRVFMC_ERR_ISP_FAIL; return 0; if ( DrvFMC_Write(CONFIG0, u32data0) != E_SUCCESS ) // return E_DRVFMC_ERR_ISP_FAIL; return 0; return DrvFMC_Write(CONFIG1, u32data1); }
/** * @brief Config Erase * * @param None * * @return None * * @details Erase Config0 and Config1 */ void CONFIG_Erase(void) { int32_t ret; FMC_ENABLE_CFG_UPDATE(); ret = DrvFMC_Erase(CONFIG_START_ADDRESS); if(ret < 0) { printf("Config Erase Error\n"); while(1); } }
/** * @brief APROM Erase * * @param None * * @return None * * @details APROM Erase */ void APROM_Erase(void) { uint32_t ulCount; uint16_t uiPageCount; int32_t ret; uiPageCount = (uint16_t)((APROM_SIZE-APROM_START_ADDRESS)/PAGE_SIZE); //中:1024*16/512=32 pages//en:1024*16/512=32 pages for(ulCount=0;ulCount<(uint32_t)uiPageCount;ulCount++) { ret = DrvFMC_Erase(APROM_START_ADDRESS + ulCount*PAGE_SIZE); //中:写地址//en:Write address if(ret < 0) { printf("APROM Erase error\n"); while(1); } } }
/** * @brief Erase LDROM * * @param None * * @return None * * @details Erase LDROM */ void LDROM_Erase(void) { uint32_t ulCount; uint8_t ucPageCount; int32_t ret; FMC_ENABLE_LD_UPDATE(); //中:使能更新LDROM功能//en:Enable update LDROM ucPageCount = (uint8_t)(LDROM_SIZE/PAGE_SIZE); //中: 页数 //en: page number for(ulCount=0;ulCount<(uint32_t)ucPageCount;ulCount++) { ret = DrvFMC_Erase(LDROM_START_ADDRESS + ulCount*PAGE_SIZE); //中:擦除//en:erase if(ret < 0) { printf("LDROM Erase error\n"); while(1); } } }
//============================================================================ // DATA FLASH OPERATION // u32addr : 0-1024 (For 4KBytes Data Flash) // u32data : 0-0xFFFFFFFF (4Bytes) //============================================================================ void DATA_FLASH_Write(uint32_t u32addr,uint32_t u32data) { uint32_t i=0; #ifdef M451 SYS_UnlockReg(); FMC_Open(); for(i=0; i<PAGE_SIZE; i++) data_buff[i] = FMC_Read(DATA_Flash_Start_ADD+i*4+ u32addr/PAGE_SIZE*2048); FMC_Erase(DATA_Flash_Start_ADD+u32addr/PAGE_SIZE*2048); data_buff[u32addr%PAGE_SIZE]=u32data; for(i=0; i<PAGE_SIZE; i++) FMC_Write(DATA_Flash_Start_ADD+i*4+ u32addr/PAGE_SIZE*2048, data_buff[i]); FMC_Close(); SYS_LockReg(); #else uint32_t data_buff[PAGE_SIZE]; __set_PRIMASK(1);//Avoid interrupt UNLOCKREG(); DrvFMC_EnableISP(); for(i=0; i<PAGE_SIZE; i++) DrvFMC_Read(DATA_Flash_Start_ADD+i*4+ u32addr/128*512, &data_buff[i]); DrvFMC_Erase(DATA_Flash_Start_ADD+u32addr/128*512); data_buff[u32addr%128]=u32data; for(i=0; i<PAGE_SIZE; i++) DrvFMC_Write(DATA_Flash_Start_ADD+i*4+ u32addr/128*512, data_buff[i]); DrvFMC_DisableISP(); LOCKREG(); __set_PRIMASK(0); #endif }
/******************************************************************************//** *@brief A simple FMC example. It Erase the LDROM and Verify ,then Program LDROM * and read out data to compare. *@param None *@return None **********************************************************************************/ void FMC_LDROM(void) { uint32_t u32Data, i; int32_t i32Err; // STR_UART_T sParam; /* Unlock the protected registers */ UNLOCKREG(); /* Enable the 12MHz oscillator oscillation */ SYSCLK->PWRCON.XTL12M_EN = 1; /* Waiting for 12M Xtal stable */ while (DrvSYS_GetChipClockSourceStatus(E_SYS_XTL12M) != 1); /* Set UART Pin */ DrvGPIO_InitFunction(E_FUNC_UART0); /* UART Setting */ /* sParam.u32BaudRate = 115200; sParam.u8cDataBits = DRVUART_DATABITS_8; sParam.u8cStopBits = DRVUART_STOPBITS_1; sParam.u8cParity = DRVUART_PARITY_NONE; sParam.u8cRxTriggerLevel= DRVUART_FIFO_1BYTES; */ /* Select UART Clock Source From 12MHz */ DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC, 0); /* Set UART Configuration */ // DrvUART_Open(UART_PORT0, &sParam); /* Enable ISP function */ DrvFMC_EnableISP(); /* Enable LDROM update */ DrvFMC_EnableLDUpdate(); /* Page Erase LDROM */ printf("Erase LDROM test..............................."); for(i=0; i<4096; i+=PAGE_SIZE) DrvFMC_Erase(LDROM_BASE + i); /* Erase Verify */ i32Err = 0; for(i = LDROM_BASE; i < (LDROM_BASE+4096); i += 4) { DrvFMC_Read(i, &u32Data); if(u32Data != 0xFFFFFFFF) { i32Err = 1; } } if (i32Err) printf("[FAIL]\n\r"); else printf("[OK]\n\r"); /* Program LD ROM and read out data to compare */ printf("Program LDROM test............................."); for(i = LDROM_BASE; i < (LDROM_BASE+4096); i += 4) { DrvFMC_Write(i, i); } i32Err = 0; for(i = LDROM_BASE; i < (LDROM_BASE+4096); i += 4) { DrvFMC_Read(i, &u32Data); if(u32Data != i) { i32Err = 1; } } if (i32Err) printf("[FAIL]\n\r"); else printf("[OK]\n\r"); /* Disable ISP function */ DrvFMC_DisableISP(); /* Lock protected registers */ LOCKREG(); printf("FMC Sample Code Completed!\n\r"); }