keil/include/drivers/menu.c
@@ -15,51 +15,51 @@
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;
  uint32_t i, Div = 1000000000, j = 0, Status = 0;
    for (i = 0; i < 10; i++)
  for (i = 0; i < 10; i++)
  {
    str[j++] = (intnum / Div) + 48;
    intnum = intnum % Div;
    Div /= 10;
    if ((str[j-1] == '0') & (Status == 0))
    {
        str[j++] = (intnum / Div) + 48;
        intnum = intnum % Div;
        Div /= 10;
        if ((str[j-1] == '0') & (Status == 0))
        {
            j = 0;
        }
        else
        {
            Status++;
        }
      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))();
//   {
       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;
   return 0;
}
uint8_t FileName[FILE_NAME_LENGTH];
/**
  * @brief  Download a file via serial port
  * @param  None
@@ -67,41 +67,41 @@
  */
unsigned char SerialDownload(void)
{
    uint8_t Number[10] = {0};
    int32_t Size = 0;
    Send_Byte(0x33);
    Size = Ymodem_Receive(&tab_1024[0]);//开始接收文件,成功会返回文件的大小
    if (Size > 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;
    }
  uint8_t Number[10] = {0};
  int32_t Size = 0;
   Send_Byte(0x33);
  Size = Ymodem_Receive(&tab_1024[0]);//开始接收文件,成功会返回文件的大小
  if (Size > 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;
   }
}
/**
@@ -112,36 +112,36 @@
uint8_t GetKey(void)
{
    uint8_t key = 0;
  uint8_t key = 0;
    /* Waiting for user input */
    while (1)
    {
        if (SerialKeyPressed((uint8_t*)&key)) break;
    }
    return key;
  /* Waiting for user input */
  while (1)
  {
    if (SerialKeyPressed((uint8_t*)&key)) break;
  }
  return key;
}
void SerialUpload(void)
{
    uint8_t status = 0 ;
  uint8_t status = 0 ;
    SerialPutString("\n\n\rSelect Receive File\n\r");
  SerialPutString("\n\n\rSelect Receive File\n\r");
    if (GetKey() == CRC16)
  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)
    {
        /* 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");
        }
      SerialPutString("\n\rError Occurred while Transmitting File\n\r");
    }
    else
    {
      SerialPutString("\n\rFile uploaded successfully \n\r");
    }
  }
}
/**
@@ -150,69 +150,69 @@
  * @retval None
  */
void delay_ms(uint32_t nTimer)
{
    uint32_t i=1000*nTimer;
    delay_us(i);
}
void delay_ms(uint32_t nTimer)
{
    uint32_t i=1000*nTimer;
    delay_us(i);
}
void Main_Menu(void)
{
    uint8_t key = 0;
  uint8_t key = 0;
  while (1)
  {
    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);
    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));
//            SPIFlash_Write(SPI_FLASH_ID_0, APP_CONFIG_IAPFLAG_MAP, (HIDO_UINT8*)&tmp, sizeof(tmp));
//           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 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 {
            }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;
    }
                    //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;
//         }
//}
}