/* +UULOC: 27/09/2012,18:26:13.363,21.0213870,105.8091050,0,127,0,0� nmea_scanf((char *)buff,128,"%d/%d/%d,%d:%d:%d.%d,%f,%f,%f,%f,%f,%f",&t1,&t2,&t3,&t4,&t5,&t6,&t7, cellLocateType.lat,cellLocateType.lon,cellLocateType.alt,cellLocateType.uncertainty, cellLocateType.speed,cellLocateType.dir; ); */ uint8_t GetCellLocate(uint8_t *buff) { COMPARE_TYPE cmp1; Timeout_Type tOut; uint8_t c,i; uint32_t t1,t2,t3,t4,t5,t6,t7; DelayMs(100); MODEM_FlushBuffer(); MODEM_Info("\r\nGSM->GET CELL LOCATE\r\n"); sprintf((char *)buff, "AT+ULOC=2,2,1,500,1\r"); COMM_Puts(buff); InitFindData(&cmp1,"+UULOC: "); InitTimeout(&tOut,TIME_SEC(3)); i = 0; while(CheckTimeout(&tOut)) { if(RINGBUF_Get(&commBuf,&c) == 0) { if(FindData(&cmp1,c) == 0) { i = 1; break; } } } if(i) { InitFindData(&cmp1,"\r\n"); InitTimeout(&tOut,TIME_SEC(3)); i = 0; while(CheckTimeout(&tOut)) { if(RINGBUF_Get(&commBuf,&c) == 0) { buff[i++] = c; if(FindData(&cmp1,c) == 0) { nmea_scanf((char *)buff,128,"%d/%d/%d,%d:%d:%d.%d,%f,%f,%f,%f,%f,%f",&t1,&t2,&t3,&t4,&t5,&t6,&t7, &cellLocate.lat,&cellLocate.lon,&cellLocate.alt,&cellLocate.uncertainty, &cellLocate.speed,&cellLocate.dir); cellLocate.ew = 'E'; cellLocate.ns = 'N'; if(cellLocate.lat < 0) cellLocate.ns = 'S'; if(cellLocate.lon < 0) cellLocate.ew = 'W'; cellLocate.lon = neamFormatLatLng(cellLocate.lon); cellLocate.lat = neamFormatLatLng(cellLocate.lat); cellLocate.time.mday = t1; cellLocate.time.month = t2; cellLocate.time.year = t3; cellLocate.time.hour = t4; cellLocate.time.min = t5; cellLocate.time.sec = t6; return 0; } } } } return 0xff; }
void RTC_Init(void) { RCC->APB1ENR |= RCC_APB1ENR_PWREN; // enable clock for Power interface PWR->CR |= PWR_CR_DBP; // enable access to RTC, BDC registers RCC->CSR |= RCC_CSR_LSION; // enable LSI while ((RCC->CSR & RCC_CSR_LSIRDY) == 0); // Wait for LSERDY = 1 (LSE is ready) RCC->BDCR |= (RCC_BDCR_RTCSEL_1 | RCC_BDCR_RTCEN); // set RTC clock source, enable RTC clock // RTC->CRL &= ~(1<<3); // reset Registers Synchronized Flag // while ((RTC->CRL & (1<<3)) == 0); // wait until registers are synchronized RTC->CRL |= RTC_CRL_CNF; // set configuration mode RTC->PRLH = 0; // set prescaler load register high RTC->PRLL = 32767;//32768-1; // set prescaler load register low RTC->CNTH = 0; // set counter high RTC->CNTL = 0; // set counter low RTC->ALRH = 0; // set alarm high RTC->ALRL = 0; // set alarm low RTC->CRH = RTC_CRH_ALRIE; // enable Alarm RTC interrupts NVIC->ISER[1] |= (1 << (RTCAlarm_IRQn & 0x1F)); // enable interrupt //NVIC->ISER[0] |= (1 << (RTC_IRQn & 0x1F)); // enable interrupt RTC->CRL &= ~RTC_CRL_CNF; // reset configuration mode while ((RTC->CRL & RTC_CRL_RTOFF) == 0); // wait until write is finished //PWR->CR &= ~PWR_CR_DBP; // disable access to RTC registers InitTimeout(&MCU_WakeupTimeout,TIME_SEC(60)); }
void RTCAlarm_IRQHandler(void) { uint32_t RTC_counter; RTC->CRL &= (uint16_t)RTC_FLAG_ALR; EXTI->PR = EXTI_Line17; RTC_counter = RTC_GetCounter(); if(RTC_counter >= (sysCfg.sleepTime + sleepTimeOld)) { sleepTimeOld = RTC_counter; sysEventFlag |= MCU_WAKEUP_FLAG; InitTimeout(&MCU_WakeupTimeout,TIME_SEC(60)); } if(GET_ACC_PIN == ACC_ON) { POWER_EN_SET_OUTPUT; POWER_EN_PIN_SET; timepowerOffDelay = RTC_counter; } else if(RTC_counter >= (sysCfg.powerOffDelayTime + timepowerOffDelay)) { POWER_EN_SET_INPUT; timepowerOffDelay = RTC_counter; } RTC_SetAlarm((RTC_counter + ALARM_TIME)); sysEventFlag |= RTC_ALARM_FLAG; }
*/ void Set_Date(REBVAL *val, REBOL_DAT *dat) /* ** Convert OS date struct to REBOL value struct. ** NOTE: Input zone is in minutes. ** ***********************************************************************/ { VAL_YEAR(val) = dat->year; VAL_MONTH(val) = dat->month; VAL_DAY(val) = dat->day; VAL_ZONE(val) = dat->zone / ZONE_MINS; VAL_TIME(val) = TIME_SEC(dat->time) + dat->nano; VAL_SET(val, REB_DATE); }
/* An experiment to show text describing the button being pressed * for as long as it is being pressed. On any other times, it will * show how long the phone has been running. */ void keytodisplay_top_main (void) { bottom_critical_region_end (); bottom_show_fixed_msg (APP_LEVEL_ZERO, FIXMSG_OFFLINE); while (true) { #if defined NEED_KBD_SCANNER_BETWEEN_KEYS || defined NEED_KBD_SCANNER_DURING_KEYPRESS bottom_keyboard_scan (); #endif if (buttonclass == BUTCLS_NONE) { bottom_show_close_level (APP_LEVEL_BACKGROUNDED); } else { timing_t now = bottom_time () / TIME_SEC (1); uint8_t h, m, s; s = now % 60; now = now / 60; m = now % 60; h = now / 60; bottom_show_period (APP_LEVEL_BACKGROUNDED, h, m, s); } } }
int workqueue_show_status(struct workqueue_ctx* ctx, FILE *fp) { int i; long long time_ms; struct TIME_STRUCT_TYPE now_time; GET_TIME(now_time); LOCK_MUTEX(&ctx->mutex); fprintf(fp, "Number of worker threads=%d \n", ctx->num_worker_threads); fprintf(fp, "Total jobs added=%d queue_size=%d waiting_jobs=%d \n", ctx->job_count, ctx->queue_size, ctx->waiting_jobs); fprintf(fp, "\n"); fprintf(fp, "%3s | %8s | %4s | %6s ms\n", "Qi", "JobID", "Pri", "Time" ); fprintf(fp, "---------------------------------\n"); for (i = 0; i < ctx->queue_size; i++) { if (!ctx->queue[i]) continue; /* unused location */ if (TIME_SEC(ctx->queue[i]->start_time) || TIME_MSEC(ctx->queue[i]->start_time)) { // has been scheduled for a time in the future. time_ms = time_diff_ms(&ctx->queue[i]->start_time, &now_time); } else { // will run ASAP time_ms = 0; } fprintf(fp,"%3d | %8d | %4d | %6lld ms\n", i, ctx->queue[i]->job_id, ctx->queue[i]->priority, time_ms); } UNLOCK_MUTEX(&ctx->mutex); fflush(fp); return 0; }
uint8_t MODEM_ConnectSocket(uint8_t socket,uint8_t *ip,uint16_t port,uint8_t useIp) { COMPARE_TYPE cmp1,cmp2; Timeout_Type tOut; uint8_t c,i; uint8_t buf[32]; DelayMs(100); MODEM_FlushBuffer(); socketMask[socket] = 0; for(i = 0; i < SOCKET_NUM;) { if(tcpSocketStatus[i] == SOCKET_OPEN) { if((socketMask[i] == socketMask[socket]) && (i != socket)) { socketMask[socket]++; i = 0; continue; } } i++; } MODEM_CloseSocket(socketMask[socket]); if(MODEM_CreateSocket(socket)) return 0xff; DelayMs(500); if(useIp == 0) { MODEM_Info("\r\nGSM->GET DOMAIN\r\n"); sprintf((char *)buf, "AT+UDNSRN=0,\"%s\"\r",ip); COMM_Puts(buf); if(MODEM_CheckResponse("OK", 5000)) { MODEM_Info("\r\nGSM->GET DOMAIN FAILS\r\n"); return 0xff; } ip = DNS_serverIp; } MODEM_Info("\r\nGSM->IP:%s\r\n",ip); MODEM_Info("\r\nGSM->CONNECT SOCKET:%d:%s:%d\r\n",socketMask[socket],ip,port); sprintf((char *)buf, "AT+USOCO=%d,\"%s\",%d\r",socketMask[socket],ip,port); COMM_Puts(buf); InitFindData(&cmp1,"OK"); InitFindData(&cmp2,"ERROR"); InitTimeout(&tOut,TIME_SEC(10)); while(CheckTimeout(&tOut)) { if(RINGBUF_Get(&commBuf,&c) == 0) { if(FindData(&cmp1,c) == 0) { MODEM_Info("\r\nGSM->CONNECT SOCKET OK\r\n"); return 0; } if(FindData(&cmp2,c) == 0) { break; } } } MODEM_Info("\r\nGSM->CONNECT SOCKET FAILS\r\n"); return 0xff; }
void DrawBrowser_TotalTime(UINT16 ubID, UINT32 x, UINT32 y, AHC_BOOL bLarge, UINT8 ubMag, AHC_BOOL bFlag, GUI_COLOR bkColor, INT32 Para1) { UINT8 nDigit = 2; UINT16 leftpos = x; UINT16 WordWidth = 7; UINT32 CurObjIdx; UINT8 FileType; AHC_VIDEO_ATTR VidInfo; AUDIO_ATTR AudInfo; INT32 hour, mins, sec; if (AHC_FALSE == AIHC_GetOSDInitStatus()) { AHC_PRINT_RET_ERROR(gbAhcDbgBrk,0); return; } #ifdef CFG_DRAW_BROWSER_IGNORE_VIDEO_TIME //may be defined in config_xxx.h /* For not to show video time */ return; #endif #if (BROWSER_STYLE!=BROWSER_2ND_STYLE) if (Para1) { /* not to show this info in delete/protect/unprotect, due to no space */ return; } #endif BEGIN_LAYER(ubID); if(bFlag == AHC_FALSE) { #ifdef ENABLE_GUI_SUPPORT_MULTITASK AHC_OSDSetColor(ubID, bkColor); #else AHC_OSDSetColor(bkColor); #endif AHC_OSDDrawFillRect(ubID, x, y, AHC_GET_ATTR_OSD_W(ubID), y+20); } else { AHC_UF_GetCurrentIndex(&CurObjIdx); AHC_UF_GetFileTypebyIndex(CurObjIdx, &FileType); if ( ( FileType == DCF_OBG_MOV ) || ( FileType == DCF_OBG_MP4 ) || ( FileType == DCF_OBG_AVI ) || ( FileType == DCF_OBG_3GP ) || ( FileType == DCF_OBG_WMV ) ) { AHC_GetVideoFileAttr(&VidInfo); hour = TIME_HOUR(VidInfo.TotalTime); mins = TIME_MIN(VidInfo.TotalTime); sec = TIME_SEC(VidInfo.TotalTime); } else if ( ( FileType == DCF_OBG_MP3 ) || ( FileType == DCF_OBG_WAV ) || ( FileType == DCF_OBG_OGG ) || ( FileType == DCF_OBG_WMA ) ) { AHC_GetAudioFileAttr(&AudInfo); hour = TIME_HOUR(AudInfo.total_time); mins = TIME_MIN(AudInfo.total_time); sec = TIME_SEC(AudInfo.total_time); } #ifdef ENABLE_GUI_SUPPORT_MULTITASK AHC_OSDSetColor(ubID, OSD_COLOR_WHITE); AHC_OSDSetBkColor(ubID, bkColor); #else AHC_OSDSetColor(OSD_COLOR_WHITE); AHC_OSDSetBkColor(bkColor); #endif #ifdef CFG_DRAW_DATE_FONT_SIZE_20 //may be defined in config_xxx.h WordWidth = 10; AHC_OSDSetFont(ubID, &GUI_Font20_ASCII); #else if(bLarge==LARGE_SIZE) { if(TVFunc_IsInTVMode()) { WordWidth = 14; #ifdef ENABLE_GUI_SUPPORT_MULTITASK AHC_OSDSetFont(ubID, &GUI_Font24B_ASCII); #else AHC_OSDSetFont(&GUI_Font24B_ASCII); #endif } else if(HDMIFunc_IsInHdmiMode()) { WordWidth = 16; #ifdef ENABLE_GUI_SUPPORT_MULTITASK AHC_OSDSetFont(ubID, &GUI_Font32B_ASCII); #else AHC_OSDSetFont(&GUI_Font32B_ASCII); #endif } } else { WordWidth = 7; #ifdef ENABLE_GUI_SUPPORT_MULTITASK AHC_OSDSetFont(ubID, &GUI_Font16B_ASCII); #else AHC_OSDSetFont(&GUI_Font16B_ASCII); #endif } #endif #ifdef ENABLE_GUI_SUPPORT_MULTITASK AHC_OSDSetPenSize(ubID, 3); #else AHC_OSDSetPenSize(3); #endif AHC_OSDDrawText(ubID,(UINT8*)"[", leftpos ,y-2, strlen("[")); leftpos += WordWidth*1; AHC_OSDDrawDec(ubID, hour, leftpos, y, nDigit); leftpos += nDigit*WordWidth; AHC_OSDDrawText(ubID,(UINT8*)":", leftpos ,y-2, strlen(":")); leftpos += WordWidth; AHC_OSDDrawDec(ubID, mins, leftpos, y, nDigit); leftpos += nDigit*WordWidth; AHC_OSDDrawText(ubID,(UINT8*)":", leftpos ,y-2, strlen(":")); leftpos += WordWidth; AHC_OSDDrawDec(ubID, sec, leftpos, y, nDigit); leftpos += nDigit*WordWidth; AHC_OSDDrawText(ubID,(UINT8*)"]", leftpos ,y-2, strlen("]")); } END_LAYER(ubID); }
// dequeue the next job that needes to run in this thread static struct workqueue_job* _workqueue_get_job(struct workqueue_thread *thread, struct TIME_STRUCT_TYPE *wait_time, long long *wait_ms) { int i; struct workqueue_job *job = NULL; struct workqueue_ctx *ctx = thread->ctx; struct TIME_STRUCT_TYPE now; if (!thread->keep_running) return NULL; /* init default wait time*/ GET_TIME(now); *wait_time = now; TIME_SECP(wait_time) += 9999; // if no work wait for 9999 sec *wait_ms = 5000; assert(ctx); DEBUG_MSG("thread %d locking ctx\n",thread->thread_num); LOCK_MUTEX(&ctx->mutex); DEBUG_MSG("thread %d got lock\n",thread->thread_num); assert(ctx->queue); /* for each queued job item while keep_running serach for a job and break out if we find one */ for(i = 0; thread->keep_running && i < ctx->queue_size; i++) { /* if queue pointer not null there is a job in this slot */ if (ctx->queue[i]) { DEBUG_MSG("job %d set wait=%u.%03lu start_time=%u.%03lu now=%u.%03lu\n", ctx->queue[i]->job_id, (unsigned int) TIME_SECP(wait_time), TIME_MSECP(wait_time), (unsigned int) TIME_SEC(ctx->queue[i]->start_time), TIME_MSEC(ctx->queue[i]->start_time), (unsigned int) TIME_SEC(now), TIME_MSEC(now)); /* check scheduled time */ if (_time_gt(&now, &ctx->queue[i]->start_time)) { /* job found that must start now */ job = ctx->queue[i]; ctx->queue[i] = NULL; DEBUG_MSG("found job %d\n", job->job_id); ctx->waiting_jobs--; break; /* found job ready to run */ } else if (_time_gt(wait_time, &ctx->queue[i]->start_time)) { /* next job in the queue is not scheduled to be run yet */ /* calculate time thread should sleep for */ *wait_time = ctx->queue[i]->start_time; *wait_ms = time_diff_ms(&ctx->queue[i]->start_time, &now); DEBUG_MSG("waiting %lld ms\n", *wait_ms); DEBUG_MSG("set wait to %u.%03lu for job %d\n", (unsigned int) TIME_SECP(wait_time), TIME_MSECP(wait_time), ctx->queue[i]->job_id); } else { DEBUG_MSG("no other job\n", NULL); } } } DEBUG_MSG("thread %d unlocking ctx job=%p wait=%u.%03lu\n", thread->thread_num, job, (unsigned int) TIME_SECP(wait_time), TIME_MSECP(wait_time)); UNLOCK_MUTEX(&ctx->mutex); return job; }
int main(void) { uint32_t *u32Pt = (uint32_t *)buff; uint8_t *u8pt,u8temp; int32_t i = 10000000,j = 0; uint32_t u32temp; uint16_t u16temp; uint32_t res; uint8_t c; uint32_t timeOut = 3000000; uint8_t tryNum,exit; SysInit(); // RS232_PIN_SET_OUTPUT; // RS232_PIN_CLR; USART3_PutString("\r\n************************AMPM*********************\r\n"); USART3_PutString("\r\nHello!\r\n"); USART3_PutString("\r\nI'm GSM_STM32_BOOTLOADER\r\n"); USART3_PutString("\r\nMy Ver:V1.0\r\n"); USART3_PutString("\r\nhttp://ampm.com.vn\r\n"); USART3_PutString("\r\n************************START MAIN***************\r\n"); DelayMs(1000); InitTimeout(&bootDisTimeout,TIME_SEC(3)); InitTimeout(&bootLoginTimeout,TIME_SEC(1)); InitTimeout(&bootExitTimeout,TIME_SEC(10)); UART_ProtoRecv.dataPt = &USB_rxBuff[4]; UART_parserPacket.state = CFG_CMD_WAITING_SATRT_CODE; UART_parserPacket.lenMax = UART_PACKET_SIZE; FLASH_Unlock(); while((CheckTimeout(&bootDisTimeout) != TIMEOUT || bootMode) && CheckTimeout(&bootExitTimeout) != TIMEOUT ) // while(0) { if(bootMode == 0 && CheckTimeout(&bootLoginTimeout) == TIMEOUT) { USB_txBuff[0] = 0xCA; USB_txBuff[1] = 4; //length USB_txBuff[3] = 0x88; //opcode USB_txBuff[4] = 0xA5; USB_txBuff[5] = 0xA5; USB_txBuff[6] = 0xA5; USB_txBuff[7] = 0xA5; USB_txBuff[USB_txBuff[1] + 4] = CfgCalcCheckSum((uint8_t *)&USB_txBuff[4],USB_txBuff[1]); for(i = 0;i < USB_txBuff[1] + 4 + 1; i++) { USART3_PutChar(USB_txBuff[i]); } USB_rxBuff[0] = 0; InitTimeout(&bootLoginTimeout,TIME_SEC(2)); } while(RINGBUF_Get(&USART3_RxRingBuff,&c) == 0) { if(CfgParserPacket(&UART_parserPacket,&UART_ProtoRecv,c) == 0) { USB_rxBuff[0] = 0xCA; USB_rxBuff[1] = ((uint8_t *)&UART_ProtoRecv.length)[0]; USB_rxBuff[2] = ((uint8_t *)&UART_ProtoRecv.length)[1]; USB_rxBuff[3] = UART_ProtoRecv.opcode; UART_ProtoRecv.dataPt = &USB_rxBuff[4]; UART_parserPacket.state = CFG_CMD_WAITING_SATRT_CODE; UART_parserPacket.lenMax = UART_PACKET_SIZE; break; } } if(USB_rxBuff[0] == 0xCA) { USB_txBuff[1] = 0; USB_txBuff[2] = 0; USB_txBuff[3] = 0; switch(USB_rxBuff[3]) { case 0x12: InitTimeout(&bootExitTimeout,TIME_SEC(60)); u32Pt = (uint32_t *)&USB_rxBuff[4]; packetNo = *u32Pt; if(packetNo == 0xA5A5A5A5) { firmwareFileOffSet = 0; u32Pt = (uint32_t *)&USB_rxBuff[8]; firmwareFileSize = *u32Pt; USB_txBuff[1] = 12; //length USB_txBuff[3] = 0x12; //opcode USB_txBuff[4] = USB_rxBuff[4]; USB_txBuff[5] = USB_rxBuff[5]; USB_txBuff[6] = USB_rxBuff[6]; USB_txBuff[7] = USB_rxBuff[7]; //Max file size USB_txBuff[8] = USB_rxBuff[8]; USB_txBuff[9] = USB_rxBuff[9]; USB_txBuff[10] = USB_rxBuff[10]; USB_txBuff[11] = USB_rxBuff[11]; //Max packet size u16temp = UART_PACKET_SIZE - 4; USB_txBuff[12] = ((uint8_t *)&u16temp)[0]; //max packet size USB_txBuff[13] = ((uint8_t *)&u16temp)[1]; //max packet size USB_txBuff[14] = 0; //max packet size USB_txBuff[15] = 0; //max packet size } else { InitTimeout(&bootExitTimeout,TIME_SEC(10)); if(packetNo == firmwareFileOffSet) { firmwareFileOffSet += (UART_ProtoRecv.length - 4); u32temp = firmwareFileOffSet % FLASH_BUF_SIZE; for(i = 0;i < (UART_ProtoRecv.length - 4);i++) { flashBuff[(packetNo % FLASH_BUF_SIZE) + i] = USB_rxBuff[i + 8]; } if(u32temp == 0) { u32temp = USER_FLASH_START + firmwareFileOffSet - FLASH_BUF_SIZE; phase = 5; u32Pt = (uint32_t *)flashBuff; __disable_irq(); myFMC_Erase(u32temp); FMC_ProgramPage(u32temp,u32Pt); __enable_irq(); phase = 6; for(i = 0;i < FLASH_BUF_SIZE; i++) flashBuff[i] = 0xff; } else if(firmwareFileOffSet >= firmwareFileSize) { i = (firmwareFileOffSet / FLASH_BUF_SIZE)*FLASH_BUF_SIZE; u32temp = USER_FLASH_START + i; u32Pt = (uint32_t *)flashBuff; __disable_irq(); myFMC_Erase(u32temp); FMC_ProgramPage(u32temp,u32Pt); __enable_irq(); } } packetNo = firmwareFileOffSet; if(firmwareFileOffSet >= firmwareFileSize) { firmwareFileOffSet = 0; packetNo = 0x5A5A5A5A; InitTimeout(&bootExitTimeout,TIME_SEC(1)); } u8pt = (uint8_t *)&packetNo; USB_txBuff[1] = 4; //length USB_txBuff[3] = 0x12; //opcode USB_txBuff[4] = u8pt[0]; USB_txBuff[5] = u8pt[1]; USB_txBuff[6] = u8pt[2]; USB_txBuff[7] = u8pt[3]; } break; case 0xA5: FLASH_Lock(); SysDeInit(); execute_user_code(); break; case 0x88: bootMode = 1; break; default: USB_txBuff[1] = 4; //length USB_txBuff[3] = 0x33; //opcode USB_txBuff[4] = 0xA5; USB_txBuff[5] = 0xA5; USB_txBuff[6] = 0xA5; USB_txBuff[7] = 0xA5; break; } if(USB_txBuff[3]) { USB_txBuff[0] = 0xCA; USB_txBuff[USB_txBuff[1] + 4] = CfgCalcCheckSum((uint8_t *)&USB_txBuff[4],USB_txBuff[1]); for(i = 0;i < USB_txBuff[1] + 4 + 1; i++) { USART3_PutChar(USB_txBuff[i]); } } USB_rxBuff[0] = 0; UART_ProtoRecv.opcode = 0; } } u32Pt = (uint32_t *)buff; SST25_Init(); SST25_Read(FIRMWARE_INFO_ADDR + FIRMWARE_STATUS_OFFSET*4,buff,4); if(*u32Pt != 0x5A5A5A5A) { execute_user_code(); } USART3_PutString("\r\nPROGRAM NEW FIRMWARE*\r\n"); tryNum = 10; exit = 0; while(!exit && tryNum--) { SST25_Read(FIRMWARE_INFO_ADDR + FIRMWARE_CRC_OFFSET*4,buff,4); fileCrc = *u32Pt; SST25_Read(FIRMWARE_INFO_ADDR + FIRMWARE_FILE_SIZE_OFFSET*4,buff,4); fileSize = *u32Pt; if(fileSize < FIRMWARE_MAX_SIZE) { flashCheckSum = 0; for(i = 0; i < fileSize;i += PAGE_SIZE) { USART3_PutChar('*'); SST25_Read(i + FIRMWARE_BASE_ADDR,buff, PAGE_SIZE); for(j = 0 ; j < PAGE_SIZE;j++) { if(i + j < fileSize) flashCheckSum += buff[j]; else break; } myFMC_Erase(USER_FLASH_START + i); FMC_ProgramPage(USER_FLASH_START + i,u32Pt); SST25_Read(i + FIRMWARE_BASE_ADDR,buff, PAGE_SIZE); memAddr = USER_FLASH_START + i; if(memcmp(buff, (void*)memAddr , PAGE_SIZE) != NULL) break; } if(flashCheckSum == fileCrc) { USART3_PutString("\r\nFINISHED!\r\n"); SST25_Read(BASE_FIRMWARE_INFO_ADDR + FIRMWARE_STATUS_OFFSET*4,buff,4); if(*u32Pt != 0x5A5A5A5A) { tryNum = 10; while(tryNum--) { flashCheckSum = 0; for(i = 0; i < fileSize;i += 256) { SST25_Read(i + FIRMWARE_BASE_ADDR,buff, 256); SST25_Write(i + BASE_FIRMWARE_BASE_ADDR,buff, 256); SST25_Read(i + BASE_FIRMWARE_BASE_ADDR,flashBuff, 256); if(memcmp(buff,flashBuff,256) != NULL) { break; } } if(i >= fileSize) for(i = 0; i < fileSize;i += 256) { SST25_Read(i + BASE_FIRMWARE_BASE_ADDR,buff, 256); for(j = 0 ; j < 256;j++) { if(i + j < fileSize) flashCheckSum += buff[j]; else break; } } if(flashCheckSum == fileCrc) { SST25_Read(FIRMWARE_INFO_ADDR,buff, 256); SST25_Write(BASE_FIRMWARE_INFO_ADDR,buff, 256); SST25_Read(BASE_FIRMWARE_INFO_ADDR,flashBuff, 256); if(memcmp(buff,flashBuff,256) == NULL) { break; } } } } exit = 1; } } } if(exit == 0 && tryNum == 0xff) { USART3_PutString("\r\nFAIL!\r\n"); USART3_PutString("\r\nDOWNLOAD BACKUP FIRMWARE*\r\n"); tryNum = 10; exit = 0; while(!exit && tryNum--) { SST25_Read(BASE_FIRMWARE_INFO_ADDR + FIRMWARE_CRC_OFFSET*4,buff,4); fileCrc = *u32Pt; SST25_Read(BASE_FIRMWARE_INFO_ADDR + FIRMWARE_FILE_SIZE_OFFSET*4,buff,4); fileSize = *u32Pt; if(fileSize < FIRMWARE_MAX_SIZE) { flashCheckSum = 0; for(i = 0; i < fileSize;i += PAGE_SIZE) { USART3_PutChar('*'); SST25_Read(i + BASE_FIRMWARE_BASE_ADDR,buff, PAGE_SIZE); for(j = 0 ; j < PAGE_SIZE;j++) { if(i + j < fileSize) flashCheckSum += buff[j]; else break; } myFMC_Erase(USER_FLASH_START + i); FMC_ProgramPage(USER_FLASH_START + i,u32Pt); SST25_Read(i + BASE_FIRMWARE_BASE_ADDR,buff, PAGE_SIZE); memAddr = USER_FLASH_START + i; if(memcmp(buff, (void*)memAddr , PAGE_SIZE) != NULL) break; } if(flashCheckSum == fileCrc) { exit = 1; USART3_PutString("\r\nDOWNLOAD BACKUP FINISHED!\r\n"); } } } } SST25_Erase(FIRMWARE_INFO_ADDR,block4k); execute_user_code(); while(1) { } }