From cc432b761c884a0bd8e9d83db0a4e26109fc08b1 Mon Sep 17 00:00:00 2001
From: chen <15335560115@163.com>
Date: 星期五, 08 十一月 2024 15:35:38 +0800
Subject: [PATCH] 安邦手环GPS删除部分无用数据和修改4G波特率9600出厂测试固件

---
 keil/include/drivers/menu.c |  218 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 218 insertions(+), 0 deletions(-)

diff --git a/keil/include/drivers/menu.c b/keil/include/drivers/menu.c
new file mode 100644
index 0000000..4fb7137
--- /dev/null
+++ b/keil/include/drivers/menu.c
@@ -0,0 +1,218 @@
+#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"
+
+
+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;
+}
+
+uint8_t FileName[FILE_NAME_LENGTH];
+
+/**
+  * @brief  Download a file via serial port
+  * @param  None
+  * @retval None
+  */
+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;
+    }
+}
+
+/**
+  * @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));
+
+//			  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;
+//			}
+
+//}
+}

--
Gitblit v1.9.3