void main() { u16 i; u8 dir=0,height=0,cmd=0; u8 color=0,light=0; u8 temp; u8 d,h; Timer0Init(); Timer1Init(); usart_init(9600); //SendString("mcu is working!\n"); while(1) { /*获取地址*/ block=P2&0x0f; pole=(P3&0xf0)>>4; /*串口接收处理*/ if(USART_RX_STA==STA_OK) { for(i=0;i<USART_REC_LEN;i++)//返回数据 { SendData(USART_RX_BUF[i]); } if(USART_RX_BUF[0]==0)//群发数据 { cmd = USART_RX_BUF[1]; switch(cmd) { case 1:Display_ALL();break;//同步 case 2:OFF_ALL();break;//复位 case 3:break;//呼吸灯 case 4:color = USART_RX_BUF[2]; light = USART_RX_BUF[3]; LED_ALL_ON(color,light);break;//跑马灯 case 5:check_led();break;//检测 case 6:WriteData(IAP_ADDRESS,480,EEPROM_TEMP);break;//将缓存区数据存入EEPORM case 7:ReadRGB_EEPORM_ByID(IAP_ADDRESS,1);break; case 8:for(i=0;i<ONE_SECTOR;i++) { temp = IAP_ReafByte(IAP_ADDRESS+i); SendData(temp); }break;//读取EEPROM数据 case 9:ET0=0; SendData(block);//返回目标地址 SendData(pole);break; case 10:ET0=1;break; } SendData(cmd);//返回命令字 } else if(USART_RX_BUF[0]>0)//单个目标数据 { if(USART_RX_BUF[0]==block&&USART_RX_BUF[1]==pole)//是否为目标地址 { RGB_DATA.dir = USART_RX_BUF[2];//获取方向值 RGB_DATA.height = USART_RX_BUF[3];//获取高度值 RGB_DATA.rgb[0] = USART_RX_BUF[4];//获取数据值 RGB_DATA.rgb[1] = USART_RX_BUF[5]; RGB_DATA.rgb[2] = USART_RX_BUF[6]; RGB_DATA.id = USART_RX_BUF[7];//获得帧ID // rgb =&USART_RX_BUF[4];//获取数据值 // // SetRGB(dir,height,rgb);//设置数据值 WriteRGB_EEPROMTemp(EEPROM_TEMP,RGB_DATA); // SendData(block);//返回目标地址 // SendData(pole); } } USART_RX_STA=STA0; USART_REC_LEN=0; } for(d=1;d<=4;d++) for(h=1;h<=4;h++) BreathingLight(d,h,1,60); } }
////////////////////////////////////////////////////////////////////// // This function mainly loads ALL the images available in the TIM // (except TIM, DUALTIM, and OBM) and validates them. // It essentially returns the next image that we will transfer the // control to. // // Inputs: Current TIM pointer, BootMode(SINGLE or DUAL) // Outputs: Returns the next image that we will transfer the control to. ////////////////////////////////////////////////////////////////////// pIMAGE_INFO_3_4_0 LoadAllImages( pTIM pTIM_h) { UINT_T Retval = NoError; UINT_T ImageID = 0; // Initialize it as an invalid image UINT_T ImageIndex, ImageSize, decompressLength, start, end, start_read, end_read; pIMAGE_INFO_3_4_0 pImageInfo = NULL; pIMAGE_INFO_3_4_0 pNextImageToTransferTo = NULL; // Used for storing the next image we want to transfer control to // after loading all the available images. flash_test(); #if ZIMI_PB05 extern PowerUPType_t powerup; extern int isInNormalSys; isInNormalSys = 1; //set Normal sys flag if(powerup != PowerUP_USB) { #if ZIMI_LAST_LED_MODE if(powerup == PowerUP_ONKEY) { zimi_blink_led(); } else if(powerup == PowerUP_Reset) { LED_ALL_ON(); } #else LED_WIFI_G_ON(); LED_BAT_G_ON(); LED_LTE_G_ON(); #endif } else //xyl USB mode, we light BAT led only according to VBAT { #if 0 UINT16_T vbat_mv; GetBatInstantVolt(&vbat_mv,USB_NotConnect); UINT8_T m_temp = IIC_read(0x07) & 0xff; if(3500<vbat_mv && vbat_mv<4050) { m_temp |= 0x20; IIC_write(0x07,m_temp); Delay_us(300*1000); //GetBatInstantVolt(&vbat_mv,USB_NotConnect); ReadBatVolt(&vbat_mv); m_temp &= ~0x20; IIC_write(0x07,m_temp); } else { //GetBatInstantVolt(&vbat_mv,USB_NotConnect); ReadBatVolt(&vbat_mv); } serial_outstr("zimi# last vbat\n"); serial_outnum(vbat_mv); serial_outstr("\n"); *(VUINT_T *)ZIMI_BATVOL_INIT_FLAG_ADDR = vbat_mv; if(vbat_mv<3600) { serial_outstr("zimi# bat led low\n"); LED_BAT_R_ON(); } else if(vbat_mv<3750) { serial_outstr("zimi# bat led middle\n"); LED_BAT_R_ON(); LED_BAT_G_ON(); } else { serial_outstr("zimi# bat led high\n"); LED_BAT_G_ON(); } #endif } #endif #if LWG_LTG_SUPPORT VUINT_T LWGLTGFlag = PlatformCheckLTGLWGFlag(); pWTP_RESERVED_AREA_HEADER pWRAH = NULL; pLTG_LWG_Select pLL = NULL; UINT_T choice = 0; #endif #if DECOMPRESS_SUPPORT OBM_MPUCache_Init(); MPUFlag = 1; #endif // Depending on the version of the TIM, determine the size of each image in bytes. // We will use this size to iterate through the TIM binary from image to image. if (pTIM_h->pConsTIM->VersionBind.Version >= TIM_3_4_00) ImageSize = sizeof(IMAGE_INFO_3_4_0); else ImageSize = sizeof(IMAGE_INFO_3_2_0); // This is the very initial TIM image! Assumes that the TIM image is located at the top of the // TIM file. Otherwise, we would skip images. pImageInfo = pTIM_h->pImg; #if LWG_LTG_SUPPORT serial_outstr("LWG/LTG switch flag\n"); serial_outnum(LWGLTGFlag); serial_outstr("\n"); if ((LWGLTGFlag != PLATFORM_5MODE_LTG_VER) && (LWGLTGFlag != PLATFORM_5MODE_LWG_VER) && (LWGLTGFlag != PLATFORM_3MODE_LTG_VER) && (LWGLTGFlag != PLATFORM_3MODE_LWG_VER)) { pWRAH = FindPackageInReserved(&Retval, pTIM_h, LTGLWGSELECTID); if ((pWRAH == NULL) || (Retval != NoError)) { PlatformSetLTGLWGFlag(PLATFORM_3MODE_LTG_VER); LWGLTGFlag = PLATFORM_3MODE_LTG_VER; serial_outstr("LTG/LWG select package not found, default to 3Mode LTG\n"); } else { pLL = (pLTG_LWG_Select) pWRAH; choice = pLL->Choice; switch (choice) { case 0: // 5Mdoe LTG PlatformSetLTGLWGFlag(PLATFORM_5MODE_LTG_VER); LWGLTGFlag = PLATFORM_5MODE_LTG_VER; serial_outstr("Select to 5Mode LTG\n"); break; case 1: // 5Mode LWG PlatformSetLTGLWGFlag(PLATFORM_5MODE_LWG_VER); LWGLTGFlag = PLATFORM_5MODE_LWG_VER; serial_outstr("Select to 5Mode LWG\n"); break; case 2: // 3Mode LTG PlatformSetLTGLWGFlag(PLATFORM_3MODE_LTG_VER); LWGLTGFlag = PLATFORM_3MODE_LTG_VER; serial_outstr("Select to 3Mode LTG\n"); break; case 3: // 3Mode LWG PlatformSetLTGLWGFlag(PLATFORM_3MODE_LWG_VER); LWGLTGFlag = PLATFORM_3MODE_LWG_VER; serial_outstr("Select to 3Mode LWG\n"); break; default: PlatformSetLTGLWGFlag(PLATFORM_3MODE_LTG_VER); LWGLTGFlag = PLATFORM_3MODE_LTG_VER; serial_outstr("Wrong package setting found, default to 3Mode LTG\n"); break; } } } #endif // Read in the number of images from the TIM and iterate through each of these images. // We load them and we validate them. for( ImageIndex = 0; ImageIndex < pTIM_h->pConsTIM->NumImages; ImageIndex++ ) { // We skip the TIM, DUALTIM, and OBM images. We load/validate all the others. if( (pImageInfo->ImageID != TIMIDENTIFIER) && (pImageInfo->ImageID != OBMIDENTIFIER) && (pImageInfo->ImageID != OBM2IDENTIFIER) && (pImageInfo->LoadAddr != 0xFFFFFFFF) ) { #if I2C //battery_process_step3(); #endif #if BACKUP_IMAGE if (pImageInfo->ImageID == SBOOT_ID) { serial_outstr("skip to load backup CP\n"); pImageInfo = (IMAGE_INFO_3_4_0*)((unsigned char*)pImageInfo + ImageSize); continue; } #endif #if SBOOT if ((sboot_flag == 0x55) && (pImageInfo->ImageID == SBOOT_ID)) { serial_outstr("skip to load sboot\n"); pImageInfo = (IMAGE_INFO_3_4_0*)((unsigned char*)pImageInfo + ImageSize); continue; } #else if (pImageInfo->ImageID == SBOOT_ID) { serial_outstr("skip to load sboot\n"); pImageInfo = (IMAGE_INFO_3_4_0*)((unsigned char*)pImageInfo + ImageSize); continue; } #endif #if LWG_LTG_SUPPORT if ((LWGLTGFlag == PLATFORM_5MODE_LWG_VER) || (LWGLTGFlag == PLATFORM_3MODE_LWG_VER)) { if ( (pImageInfo->ImageID == LTGOSLOADERID) || (pImageInfo->ImageID == LTGRELIABLEID) || (pImageInfo->ImageID == LTGDSPID) || (pImageInfo->ImageID == LTGSKYLARKID) || (pImageInfo->ImageID == LTGRESERVED1ID) || (pImageInfo->ImageID == LTGRESERVED2ID) || (pImageInfo->ImageID == LTGRESERVED3ID) ) { serial_outstr("Skip to load LTG image flash address\n"); serial_outnum(pImageInfo->FlashEntryAddr); serial_outstr("\n"); pImageInfo = (IMAGE_INFO_3_4_0*)((unsigned char*)pImageInfo + ImageSize); continue; } } else if ((LWGLTGFlag == PLATFORM_5MODE_LTG_VER) || (LWGLTGFlag == PLATFORM_3MODE_LTG_VER)) { if ( (pImageInfo->ImageID == OSLOADERID) || (pImageInfo->ImageID == RELIABLEID) || (pImageInfo->ImageID == LWGDSPID) || (pImageInfo->ImageID == LWGSKYLARKID) || (pImageInfo->ImageID == LWGRESERVED1ID) || (pImageInfo->ImageID == LWGRESERVED2ID) || (pImageInfo->ImageID == LWGRESERVED3ID) ) { serial_outstr("Skip to load LWG image flash address\n"); serial_outnum(pImageInfo->FlashEntryAddr); serial_outstr("\n"); pImageInfo = (IMAGE_INFO_3_4_0*)((unsigned char*)pImageInfo + ImageSize); continue; } } #endif // Store a pointer to the OSLO image because we will transfer control to it! // If this image is not found in the TIM, then we return NULL and // we will fail in BootLoaderMain. #if LWG_LTG_SUPPORT if (((LWGLTGFlag == PLATFORM_5MODE_LTG_VER) || (LWGLTGFlag == PLATFORM_3MODE_LTG_VER)) && (pImageInfo->ImageID == LTGOSLOADERID)) { #if USE_SERIAL_DEBUG serial_outstr("LTG uboot\n"); #endif pNextImageToTransferTo = pImageInfo; } if (((LWGLTGFlag == PLATFORM_5MODE_LWG_VER) || (LWGLTGFlag == PLATFORM_3MODE_LWG_VER)) && (pImageInfo->ImageID == OSLOADERID)) { #if USE_SERIAL_DEBUG serial_outstr("LWG uboot\n"); #endif pNextImageToTransferTo = pImageInfo; } #elif SBOOT if ((pImageInfo->ImageID == OSLOADERID) && (sboot_flag == 0x55)) { #if USE_SERIAL_DEBUG serial_outstr("uboot\n"); #endif pNextImageToTransferTo = pImageInfo; } if ((sboot_flag == 0xaa) && (pImageInfo->ImageID == SBOOT_ID)) { #if USE_SERIAL_DEBUG serial_outstr("Sboot\n"); #endif pNextImageToTransferTo = pImageInfo; } #else if (pImageInfo->ImageID == OSLOADERID) { #if USE_SERIAL_DEBUG serial_outstr("uboot\n"); #endif pNextImageToTransferTo = pImageInfo; } #endif // We read images from the flash and load them into the LOAD ADDRESS specified in the TIM for each image. // For now, we do NOT care if there is a conflict when an image needs to load where we are currently running from. // We assume that this will not happen. #if MMC_CODE if((pTIM_h->pConsTIM->VersionBind.Version) >= TIM_3_2_00) { SetPartition(pImageInfo->PartitionNumber, BOOT_FLASH); } #endif #if DECOMPRESS_SUPPORT if ((pImageInfo->ImageID != RELIABLEID) && (pImageInfo->ImageID != LTGRELIABLEID) && (pImageInfo->ImageID != LWGRESERVED1ID) && (pImageInfo->ImageID != LTGRESERVED1ID)) { #if SBOOT if (pImageInfo->ImageID != SBOOT_ID) #endif { CacheInvalidateMemory(DECOMPRESS_TEMP_ADDR, DECOMPRESS_LENGTH); start_read= GetOSCR0(); start_read = GetOSCR0(); Retval = ReadFlash(pImageInfo->FlashEntryAddr, DECOMPRESS_TEMP_ADDR, pImageInfo->ImageSize, BOOT_FLASH); end_read= GetOSCR0(); serial_outstr("read time\n"); if (end_read > start_read) serial_outnum(OSCR0IntervalInMilli(start_read, end_read)); else serial_outnum(OSCR0IntervalInMilli(end_read, start_read)); serial_outstr("\n"); // If ReadFlash function fails, then we fail and return NULL. if (Retval != NoError) { zimi_force_minisys(Retval); FatalError(Retval); } decompressLength = DECOMPRESS_LENGTH; #if ZIMI_PB05 #if ZIMI_LED_MODE UINT8_T onkey_long_flag =0; onkey_long_flag = UsticaBaseRead(USTICA_STATUS); onkey_long_flag = UsticaBaseRead(USTICA_STATUS);//xyl:re-read for bug,f**k marvell if ((onkey_long_flag & USTICA_ONKEY_STATUS) == USTICA_ONKEY_STATUS) //when onkey pressed > 3s, we need to tell CP { serial_outstr("onkey long press detected\n"); *(VUINT_T *)ZIMI_ONKEY_LONG_PRESS_FLAG_ADDR= 0x4C4F4E47;//LONG LED_WIFI_G_ON(); } #endif #endif start = GetOSCR0(); start = GetOSCR0(); #if QPRESS Retval = quickLZ_decompress(DECOMPRESS_TEMP_ADDR, (UINT8_T *)pImageInfo->LoadAddr); #else Retval = LZMA_Decompress((UINT_T *)pImageInfo->LoadAddr, &decompressLength, (UINT_T *)DECOMPRESS_TEMP_ADDR, pImageInfo->ImageSize); #endif end = GetOSCR0(); if (pImageInfo->ImageID == OSLOADERID) nextImageSize = decompressLength; serial_outstr("Retval\n"); serial_outnum(Retval); serial_outstr("\n"); serial_outstr("time\n"); if (end > start) serial_outnum(OSCR0IntervalInMilli(start, end)); else serial_outnum(OSCR0IntervalInMilli(end, start)); serial_outstr("\n"); //CacheInvalidateMemory(DECOMPRESS_TEMP_ADDR, DECOMPRESS_LENGTH); if (Retval != NoError) { zimi_force_minisys(Retval); FatalError(Retval); } } #if SBOOT else { Retval = ReadFlash(pImageInfo->FlashEntryAddr, pImageInfo->LoadAddr, pImageInfo->ImageSize, BOOT_FLASH); if (Retval != NoError) { zimi_force_minisys(Retval); FatalError(Retval); } } #endif } else { #if MRD_CHECK PlatformSetMRDAddr(pImageInfo->FlashEntryAddr, pImageInfo->ImageID); Retval = ReadFlash(pImageInfo->FlashEntryAddr, pImageInfo->LoadAddr, pImageInfo->ImageSize, BOOT_FLASH); if (Retval != NoError) { zimi_force_minisys(Retval); FatalError(Retval); } CheckMRD(pImageInfo); #else Retval = ReadFlash(pImageInfo->FlashEntryAddr, pImageInfo->LoadAddr, pImageInfo->ImageSize, BOOT_FLASH); if (Retval != NoError) { zimi_force_minisys(Retval); FatalError(Retval); } #endif } #else #if MRD_CHECK if ((pImageInfo->ImageID != RELIABLEID) && (pImageInfo->ImageID != LTGRELIABLEID) && (pImageInfo->ImageID != LWGRESERVED1ID) && (pImageInfo->ImageID != LTGRESERVED1ID)) { //start = GetOSCR0(); Retval = ReadFlash(pImageInfo->FlashEntryAddr, pImageInfo->LoadAddr, pImageInfo->ImageSize, BOOT_FLASH); //end = GetOSCR0(); //serial_outstr("read singal image\n"); //if (end > start) // serial_outnum(OSCR0IntervalInMilli(start, end)); //else // serial_outnum(OSCR0IntervalInMilli(end, start)); //serial_outstr("\n"); if (Retval != NoError) { zimi_force_minisys(Retval); FatalError(Retval); } } else { PlatformSetMRDAddr(pImageInfo->FlashEntryAddr, pImageInfo->ImageID); Retval = ReadFlash(pImageInfo->FlashEntryAddr, pImageInfo->LoadAddr, pImageInfo->ImageSize, BOOT_FLASH); if (Retval != NoError) { zimi_force_minisys(Retval); FatalError(Retval); } CheckMRD(pImageInfo); } #else Retval = ReadFlash(pImageInfo->FlashEntryAddr, pImageInfo->LoadAddr, pImageInfo->ImageSize, BOOT_FLASH); if (Retval != NoError) { zimi_force_minisys(Retval); FatalError(Retval); } #endif #endif } // Get a pointer to the next image we will load. // For the last iteration (e.g. after the last image), we won't find an image. // However, this is OK because pImageInfo is not used again. pImageInfo = (IMAGE_INFO_3_4_0*)((unsigned char*)pImageInfo + ImageSize); } #if MRD_CHECK #if SBOOT if ((pMRD_valid == NULL) && (sboot_flag != 0xaa)) { zimi_force_minisys(NOVALIDMRD); FatalError(NOVALIDMRD); } #else if (pMRD_valid == NULL) { zimi_force_minisys(NOVALIDMRD); FatalError(NOVALIDMRD); } #endif FinalizeMRD(); #endif #if DECOMPRESS_SUPPORT OBM_Flush(); OBM_MPUCache_Disable(); #endif #if SPI_CODE Giga_Disable4BytesMode(); #endif return pNextImageToTransferTo; }
int main(void) { //***************************************************************************************// //*****************ARRANCAMOS LA CONFIGURACION DEL PIC **********************************// //***************************************************************************************// Init_Hw(); Delay1msT1(0); //Configuramos el puertos y quitamos analogicos Init_Pll(); Delay1msT1(0); //configuramos el pll que abiasmos arracamos sin él Init_PWM(); Delay1msT1(0); //configuramos el PWM init_interr_extern(); Delay1msT1(0); //configuramos las interrupciones externas Init_Bluetooh(); Delay1msT1(0); //Configuramos el serial-Bluetooth cargar_datos_ajuste(); Init_I2C(); Delay1msT1(0); //incializamos el I2c set_inicial(); Delay1msT1(0); //Configuramos la incialicacion de sensor getAngle_init(); Delay1msT1(0); //Incializamos el filtro kalman set_inicial(); Delay1msT1(0); //Incializamos el acelerometro LED_ALL_ON(); for (i = 0; i < 2500; i++) Delay_Nop(2000); LED_ALL_OFF(); //***************************************************************************************// //***************************************************************************************// //*****************CALIBRAMOS EL ACELEROMETRO Y GIROSCOPO *******************************// // get_calibrado_acelerometro(5, 50); //cojemos los valres por defecto del giroscopo y aceletometro LED_ALL_OFF(); //***************************************************************************************// //*****************INICIALIZAMOS EL PID Y LAS VARIABLES ********************************// // pid_dsp_configuracion(); //***************************************************************************************// LED_ALL_OFF(); //*****************ARRANCAMOS INTERRUPCION DEL BUCLE PRINCIPAL *************************// SetupT3ForXmsPID(Tsample); //configuramos la interrupcion principal SetupT4For20msPID(); //configuramos la interrupcion principal StartInterrup4(); //incializamos la interrupcion StartInterrup3(); //incializamos la interrupcion enviar_mensaje("------------------------------------------------------"); //***************************************************************************************// while (1) { } }