#include "menu.h" #include "ymodem.h" #include "mk_flash.h" #include "mk_uart.h" //#include "Usart.h" //#include "SPIFlash.h" #include "AppConfig.h" #include "HIDO_TypeDef.h" #include "mk_trace.h" //#include "stm32f4xx_hal.h" #include "mk_wdt.h" pFunction Jump_To_Application; uint32_t JumpAddress; uint32_t FlashProtection = 0; uint8_t tab_1024[1024] = { 0 }; void Int2Str(uint8_t* str, int32_t intnum) { uint32_t i, Div = 1000000000, j = 0, Status = 0; for (i = 0; i < 10; i++) { str[j++] = (intnum / Div) + 48; intnum = intnum % Div; Div /= 10; if ((str[j-1] == '0') & (Status == 0)) { j = 0; } else { Status++; } } } uint32_t IAP_JumpTo(uint32_t ApplicationAddress) { // if (((*(uint32_t*)ApplicationAddress) & 0x20000000 ) == 0x20000000) // { memcpy((void *)SRAM_BASE, (void *)APP_CONFIG_APPLICATION_ADDRESS, APP_CONFIG_APPLICATION_SIZE);//sizeÌ«´óµ¼Ö¸²¸Çû·¨Ìø×ª __set_MSP(*(uint32_t *)SRAM_BASE); typedef void (*p_entry_t)(void); ((p_entry_t) (*(uint32_t *)(SRAM_BASE + 4) + SRAM_BASE))(); // __set_MSP(*(uint32_t*) ApplicationAddress); //Set MSP MK8000ÐÞ¸Ä // // (*((void(*)(void))JumpAddress))(); // return 1; // } return 0; } extern volatile unsigned long time_100ms; extern volatile unsigned long start_timer; uint8_t FileName[FILE_NAME_LENGTH]; uint8_t gongkaflag,shouhuanflag; extern int32_t Receive_Byte (uint8_t *c, uint32_t timeout); /** * @brief Download a file via serial port * @param None * @retval None */ unsigned char SerialDownload(void) { uint8_t Number[10] = {0}; int32_t Size = 0; uint8_t c; // wdt_ping(WDT_ID0);//ι¹· // uart1_xuanze(0); Send_Byte(0x33); // start_timer=time_100ms; // while(time_100ms 0) //·µ»Ø³É¹¦ { SerialPutString("\n\n\r Programming Completed Successfully!\n\r--------------------------------\r\n Name: "); SerialPutString(FileName); Int2Str(Number, Size); SerialPutString("\n\r Size: "); SerialPutString(Number); SerialPutString(" Bytes\r\n"); SerialPutString("-------------------\n"); return 0; } else if (Size == -1) { //SerialPutString("\n\n\rThe image size is higher than the allowed space memory!\n\r"); return 1; } else if (Size == -2) { //SerialPutString("\n\n\rVerification failed!\n\r"); return 2; } else if (Size == -3) { //SerialPutString("\r\n\nAborted by user.\n\r"); return 3; } else { // SerialPutString("\n\rFailed to receive the file!\n\r"); return 4; } } /** * @brief Upload a file via serial port. * @param None * @retval None */ uint8_t GetKey(void) { uint8_t key = 0; /* Waiting for user input */ while (1) { if (SerialKeyPressed((uint8_t*)&key)) break; } return key; } void SerialUpload(void) { uint8_t status = 0 ; SerialPutString("\n\n\rSelect Receive File\n\r"); if (GetKey() == CRC16) { /* Transmit the flash image through ymodem protocol */ status = Ymodem_Transmit((uint8_t*)APP_CONFIG_APPLICATION_ADDRESS, (const uint8_t*)"UploadedFlashImage.bin", APP_CONFIG_APPLICATION_SIZE); if (status != 0) { SerialPutString("\n\rError Occurred while Transmitting File\n\r"); } else { SerialPutString("\n\rFile uploaded successfully \n\r"); } } } /** * @brief Display the Main Menu on HyperTerminal * @param None * @retval None */ void delay_ms(uint32_t nTimer) { uint32_t i=1000*nTimer; delay_us(i); } void Main_Menu(void) { uint8_t key = 0; while (1) { //Serial0PutString("Çë´«ÊäÉý¼¶Îļþ\r\n\n"); /* Download user application in the Flash */ if(SerialDownload()==0)//Èç¹û´«ÊäÍê³ÉÌø»ØAPP { //±êÖ¾Çå³ý uint16_t tmp = 0xFFFF; flash_erase(FLASH_ID0, APP_CONFIG_IAPFLAG_SECTOR_ADDR, FLASH_SECTOR_SIZE);//²Á³ýAPPFLAG flash_write_nbytes(FLASH_ID0,APP_CONFIG_IAPFLAG_MAP,(uint8_t*)&tmp,2); // SPIFlash_Erase(SPI_FLASH_ID_0, APP_CONFIG_IAPFLAG_MAP,2, SPI_FLASH_SECTOR_ERASE_MODE_4K); MK8000ÐÞ¸Ä // SPIFlash_Write(SPI_FLASH_ID_0, APP_CONFIG_IAPFLAG_MAP, (HIDO_UINT8*)&tmp, sizeof(tmp)); delay_ms(100); //LOG_INFO(TRACE_MODULE_APP,"Éý¼¶Ê§°ÜÖØÆô\r\n\n"); NVIC_SystemReset(); // if (((*(__IO uint32_t*)APP_CONFIG_APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)ÏÈ×¢Ê͵ô¼´Ò»³É¹¦¾ÍÌø×ª // { /* Jump to user application */ //Serial0PutString("Ìø×ªAPP\r\n"); // memcpy((void *)SRAM_BASE, (void *)APP_CONFIG_APPLICATION_ADDRESS, APP_CONFIG_APPLICATION_SIZE); // // setup new msp // __set_MSP(*(uint32_t *)SRAM_BASE); // //Serial0PutString("Ìø×ªAPPºó\r\n"); // typedef void (*p_entry_t)(void); // ((p_entry_t) (*(uint32_t *)(SRAM_BASE + 4) + SRAM_BASE))(); //JumpAddress = *(__IO uint32_t*) (SRAM_BASE + 4); // Jump_To_Application = (pFunction) JumpAddress; // // /* Initialize user application's Stack Pointer */ // __set_MSP(*(__IO uint32_t*) SRAM_BASE); // // /* Jump to application */ // Jump_To_Application(); }else{ // uint16_t tmp = 0xFFFF; // flash_erase(FLASH_ID0, APP_CONFIG_IAPFLAG_MAP, 2);//²Á³ýAPPFLAG ´Ë´¦Ê§°Ü¾ÍÖØÆôÖØÐ½øÈëbootÀïÃæ´«ÊäÇÒ²»¸Ä±äÒªÉý¼¶µÄ±ê־λ // flash_write(FLASH_ID0, APP_CONFIG_IAPFLAG_MAP, (uint8_t*)&tmp, sizeof(tmp)); //SPIFlash_Erase(SPI_FLASH_ID_0, APP_CONFIG_IAPFLAG_MAP,2, SPI_FLASH_SECTOR_ERASE_MODE_4K); ¸ÄдΪMK8000API //SPIFlash_Write(SPI_FLASH_ID_0, APP_CONFIG_IAPFLAG_MAP, (HIDO_UINT8*)&tmp, sizeof(tmp)); delay_ms(10); //LOG_INFO(TRACE_MODULE_APP,"Éý¼¶Ê§°ÜÖØÆô\r\n\n"); NVIC_SystemReset(); //SCB->AIRCR = 0X05FA0000|(unsigned int)0x04; //Èí¸´Î»»Øµ½bootloader MK8000ÐÞ¸Ä } return; } // else // { // NVIC_SystemReset(); // return; // } //} }