From 8415b6bc61925a1a234fe393d8375d3828756931 Mon Sep 17 00:00:00 2001
From: WXK <287788329@qq.com>
Date: 星期五, 23 五月 2025 11:28:14 +0800
Subject: [PATCH] 修改搬运大小

---
 dualboots_Gai_youhua/src/customboot/customboot.c |  299 +++++++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 207 insertions(+), 92 deletions(-)

diff --git a/dualboots_Gai_youhua/src/customboot/customboot.c b/dualboots_Gai_youhua/src/customboot/customboot.c
index cd99563..c2625bc 100644
--- a/dualboots_Gai_youhua/src/customboot/customboot.c
+++ b/dualboots_Gai_youhua/src/customboot/customboot.c
@@ -14,6 +14,8 @@
 #include "AppConfig.h"
 #include "menu.h"
 #include "aes.h"
+#include "AppConfig.h"
+#include "mk_sleep_timer.h"
 static const uint32_t fw_addr = 0x04004000;
 static const uint32_t fw_bytes = 14712;
 
@@ -22,9 +24,11 @@
 #define TEST_UART_INTERUPT_MODE 1
 #define TEST_UART_DMA_MODE 2
 #define TEST_UART_MODE TEST_UART_DMA_MODE
-
+volatile unsigned long  time_100ms;
+volatile unsigned long  shengji_time_100ms;
 volatile unsigned long time32_incr;
 volatile unsigned long time32_reset = 0;
+volatile unsigned long start_timer;
 static unsigned char buff[100];
 uint8_t key[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
 
@@ -108,67 +112,147 @@
             if(data==0xFF)
             {
                 uint16_t tmp = 0xAAAA,result;               
-//                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)); 
+                flash_erase(FLASH_ID0, APP_CONFIG_IAPFLAG_SECTOR_ADDR, FLASH_SECTOR_SIZE);//擦除APP
+                flash_write_nbytes(FLASH_ID0,APP_CONFIG_IAPFLAG_MAP,(uint8_t*)&tmp,2);
                 state = 0;
-                
             }
             break;
     }
 
 }
+uint8_t state111;
+unsigned short int APP_byte = 0;
 unsigned short int updata_byte = 0;
 uint8_t trx_buf[10] = {0};
+int test1;
+int aaa;
+uint16_t finalbag;
+static unsigned char zhongjian_shuju[128];
+uint8_t jiexi_shuju[128];
+static void app_wdt_callback(void *dev, uint32_t status)
+{
+    ASSERT(status, "WDT TIMEOUT,程序复位");
+		//LOG_INFO(TRACE_MODULE_APP, "程序卡死,看门狗复位");
+}
+ struct WDT_CFG_T app_wdt_cfg = {
+        .timeout = 32768 * 30,
+        .rst_en = true,
+        .int_en = true,
+        .callback = app_wdt_callback,
+    };
+static void sleep_timer_callback(void *dev, uint32_t time)
+{
+time_100ms++;
+    shengji_time_100ms++;
+    if(shengji_time_100ms>300)
+    {
+    NVIC_SystemReset();
+    }
+}
+uint8_t flagmode;/*0是工卡,1是手环*/
+//uint8_t flagshouhuan;
 int main(void)
 {		uint8_t c;
 		
 	  //sys_tick_callback_set(systic_time_callback);
 		board_clock_run();
+     calib_chip();
+    gpio_open();
     board_pins_config();
 		//board_debug_console_open(TRACE_PORT_UART0);
 		// Chip calibration
-    calib_chip();
+//    calib_chip();
+    sleep_timer_open(true, SLEEP_TIMER_MODE_RELOAD, sleep_timer_callback);
+    sleep_timer_start(__MS_TO_32K_CNT(100));//测试
 		// Disable watchdog timer
     wdt_close(WDT_ID0);
-		
+		wdt_open(WDT_ID0,&app_wdt_cfg);//30s检测喂狗
 		//LOG_INFO(TRACE_MODULE_APP, "进入Bootloader串口升级\r\n");
-		gpio_open();
+//		gpio_open();
     board_configure();
 	
-	 struct UART_CFG_T test_uart_cfg =
-    {
-        .parity = UART_PARITY_NONE,
-        .stop = UART_STOP_BITS_1,
-        .data = UART_DATA_BITS_8,
-        .flow = UART_FLOW_CONTROL_NONE,
-        .rx_level = UART_RXFIFO_CHAR_1,
-        .tx_level = UART_TXFIFO_EMPTY,
-        .baud = BAUD_115200,
-#if (TEST_UART_MODE == TEST_UART_POLL_MODE)
-        .dma_en = false,
-        .int_rx = false,
-        .int_tx = false,
-#elif (TEST_UART_MODE == TEST_UART_INTERUPT_MODE)
-        .dma_en = false,
-        .int_rx = true,
-        .int_tx = true,
-#elif (TEST_UART_MODE == TEST_UART_DMA_MODE)
-        .dma_en = true,
-        .int_rx = false,
-        .int_tx = false,
-#endif
-		};
+//         struct UART_CFG_T test_uart_cfg =
+//        {
+//        .parity = UART_PARITY_NONE,
+//        .stop = UART_STOP_BITS_1,
+//        .data = UART_DATA_BITS_8,
+//        .flow = UART_FLOW_CONTROL_NONE,
+//        .rx_level = UART_RXFIFO_CHAR_1,
+//        .tx_level = UART_TXFIFO_EMPTY,
+//        .baud = BAUD_115200,
+
+//        .dma_en = true,
+//        .int_rx = false,
+//        .int_tx = false,
+//		};
 		 flash_open(FLASH_ID0, NULL);
-		 uart_open(UART_ID1, &test_uart_cfg);
+//		 uart_open(UART_ID1, &test_uart_cfg);
 			//uart_open(UART_ID0, &test_uart_cfg);
 		 //uart_receive(UART_ID1, trx_buf, 1, uart_receive_callback);
-		 SerialPutString("MK8000-BootLoader-V1.0启动\r\n");
+//		 SerialPutString("MK8000-BootLoader-V1.1启动\r\n");
 		 //Serial0PutString("MK8000-BootLoader-V1.0启动\r\n");
+        delay_ms(200);
+    start_timer=time_100ms;
+    while(time_100ms<start_timer+5)
+    {
+         if (Receive_Byte(&c, 0x100000) == 0)//返回0成功收取数据,-1为没收到数据
+          { 
+              usartdata_process(c);
+          }
+    }
+//    uart_close(UART_ID1);
+//    uart1_change_shouhuan();
+//    uart_open(UART_ID1, &test_uart_cfg);
+//    start_timer=time_100ms;
+//    while(time_100ms<start_timer+5)
+//    {
+//         if (Receive_Byte(&c, 0x100000) == 0)//返回0成功收取数据,-1为没收到数据
+//          { 
+//            switch(state111)
+//            {
+//                case 0:
+//                    if(c==0x55)
+//                    {
+//                        state111 = 1;
+//                    }
+//                    break;
+//                case 1:
+//                    if(c==0x55)
+//                    {
+//                        state111 = 2;
+//                    }else{
+//                        state111 = 0;
+//                    }
+//                    break;
+//                case 2:
+//                    if(c==0x55)
+//                    {
+//                      flagmode=1;
+//                    }else{
+//                        state111 = 0;
+//                    }
+//                    break;
+//            }
+//              usartdata_process(c);
+//          }
+//    }
+//    if(flagmode)
+//    {
+//    
+//    }
+//    else
+//    {
+//    uart_close(UART_ID1);
+//    uart1_change_gongka();    
+//    uart_open(UART_ID1, &test_uart_cfg);    
+//    }
+    
+    SerialPutString("MK8000-BootLoader-V1.1启动\r\n");
 		while(1)
 		{
-		
+			wdt_ping(WDT_ID0);//喂狗
 			uint16_t tmp = 0;
-			tmp=0xAAAA;//测试用
+//			tmp=0xAAAA;//测试用
 			//flash_erase(FLASH_ID0, APP_CONFIG_IAPFLAG_SECTOR_ADDR, FLASH_SECTOR_SIZE);
 			//flash_write_nbytes(FLASH_ID0,APP_CONFIG_IAPFLAG_MAP,(uint8_t*)&tmp,2);//测试用
 //    SPIFlash_Read(SPI_FLASH_ID_0, (HIDO_UINT8*)&tmp, APP_CONFIG_IAPFLAG_MAP, sizeof(tmp)); MK8000修改
@@ -178,7 +262,7 @@
         {
         }
     updata_byte = tmp;//读取指定地址的值
-    if(updata_byte == 0xAAAA)//判断此地址的值是否为0xAAAA,如果是则升级 
+    if(updata_byte == 0xAAAA)//判断此地址的值是否为0xAAAA,如果是则 升级 
     {
         SerialPutString("串口升级启动\r\n");
 			
@@ -186,71 +270,102 @@
     }
     else if(updata_byte == 0xBBBB)//判断此地址的值是否为0xBBBB,如果是则网络升级
     {       
-        unsigned int i = 0;
-        unsigned int spiflash_addr = APP_CONFIG_APP_DOWN_LOAD_SPIFLASH_ADDRESS;
-        unsigned int flashdestination = APP_CONFIG_APPLICATION_ADDRESS;
-        uint32_t JumpAddress;
-        pFunction Jump_To_Application;
+        unsigned int ii = 0;
+//        unsigned int spiflash_addr = APP_CONFIG_APP_DOWN_LOAD_SPIFLASH_ADDRESS;
+//        unsigned int flashdestination = APP_CONFIG_APPLICATION_ADDRESS;
+//        uint32_t JumpAddress;
+//        pFunction Jump_To_Application;
         
-        SerialPutString("网络升级启动启动\r\n");
-//        Flash_Init();
-//        Flash_Erase(APP_CONFIG_APPLICATION_ADDRESS, APP_CONFIG_APPLICATION_SIZE);//MK8000修改
-				flash_erase(FLASH_ID0, APP_CONFIG_APPLICATION_ADDRESS, APP_CONFIG_APPLICATION_SIZE);//擦除APP
+        SerialPutString("OTA完成,解密文件启动\r\n");
+        SerialPutString("OTA固件解压\r\n");
+
         aesDecInit();
-		 /* 200KB */
-        while(spiflash_addr < (APP_CONFIG_APP_DOWN_LOAD_SPIFLASH_ADDRESS + APP_CONFIG_APP_DOWN_LOAD_SPIFLASH_SIZE))
-        {
-            /* 读取一包数据 */
-            //SPIFlash_Read(SPI_FLASH_ID_0, buff, spiflash_addr, sizeof(buff));MK8000修改
-						flash_read(FLASH_ID0, spiflash_addr, buff, sizeof(buff));
-						while (flash_check_busy(FLASH_ID0))
-						{
-						}
-            spiflash_addr += sizeof(buff);
-            
-            for(i = 0; i < sizeof(buff); i += 16)
-            {
-                aesDecrypt(&buff[i],key);
-            }
-            
-						flash_write(FLASH_ID0, flashdestination, buff, sizeof(buff));
-						while (flash_check_busy(FLASH_ID0))
-						{
-						}
-						flashdestination += sizeof(buff);
-//            Flash_Write(flashdestination, buff, sizeof(buff));
-//            flashdestination += sizeof(buff); //MK8000修改
-        }
-        
-        /* 清标志 */
-        tmp = 0xFFFF;
-				flash_erase(FLASH_ID0, APP_CONFIG_IAPFLAG_MAP, 2);//擦除APPFLAG
-				flash_write(FLASH_ID0, APP_CONFIG_IAPFLAG_MAP, (uint8_t*)&tmp, sizeof(tmp));
-				delay_ms(500);
-				NVIC_SystemReset();
-//        SPIFlash_Erase(SPI_FLASH_ID_0, APP_CONFIG_IAPFLAG_MAP,2, SPI_FLASH_SECTOR_ERASE_MODE_4K);  
-//        SPIFlash_Write(SPI_FLASH_ID_0, APP_CONFIG_IAPFLAG_MAP, (HIDO_UINT8*)&tmp, sizeof(tmp)); //MK8000修改
-    
-        //HAL_Delay(500);
-        //SCB->AIRCR = 0X05FA0000|(unsigned int)0x04; MK8000 修改
-				
-				 }
-    else if(updata_byte == 0xCCCC)//OTA
-    {
-        SerialPutString("OTA升级启动\r\n");
-        IAP_JumpTo(SRAM_BASE);
-    }
-    else  //不是则跳转到APP,注意F0和其他系列的跳转有些不一样,跳转部分可参考原子哥代码
-    {	
-        //Delay_ms(1000);
-        /* Test if user code is programmed starting from address "APP_CONFIG_APPLICATION_ADDRESS" */
-		 //Serial0PutString("跳转APPhehe\r\n");
+         
+                flash_erase(FLASH_ID0, APP_CONFIG_IAPFLAG_SECTOR_ADDR, FLASH_SECTOR_SIZE);//擦除APP
+                flash_read(FLASH_ID0, APP_CONFIG_IAPFLAG_MAP, (uint8_t*)&tmp, 2);
+                APP_byte = tmp;
+                if(APP_byte==0XBBBB)
+                {
+                uart_close(UART_ID1);
+                delay_ms(200);
 				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))();
+                } 
+                SerialPutString("擦除标注位成功\r\n");
+                test1=flash_erase(FLASH_ID0,APP1_ADRESS,APP_CONFIG_APPLICATION_SIZE);
+                if(test1==0)
+                {
+                finalbag=(APP_CONFIG_APPLICATION_SIZE/128)+1;
+//                    wdt_close(WDT_ID0);
+                for(aaa=0;aaa<finalbag;aaa++)
+                {
+//                        time32_reset=0;
+                    memcpy(&zhongjian_shuju,(void *)(APP2_ADRESS+(aaa*128)),128);
+                        
+                    for(ii = 0; ii < sizeof(zhongjian_shuju); ii += 16)
+                    {aesDecrypt(&zhongjian_shuju[ii],key);}
+                    
+                    test1=flash_write_nbytes(FLASH_ID0, (APP1_ADRESS+(aaa*128)), zhongjian_shuju, sizeof(zhongjian_shuju));
+//                    if(test1==0)
+//                    {SerialPutString("解密成功\r\n");}
+//                    else
+//                    {SerialPutString("解密失败\r\n");}
+                    wdt_ping(WDT_ID0);//喂狗
+                    shengji_time_100ms=0;
+                } 
+                delay_ms(10);
+                SerialPutString("OTA解密成功,准备重启\r\n");
+                delay_ms(500);
+                NVIC_SystemReset();
+                }
+				
+	}
+    else if(updata_byte == 0xCCCC)//OTA
+    {
+
+        SerialPutString("进入OTA,升级启动\r\n");        
+        delay_ms(100);
+        uart_close(UART_ID1);
+        gpio_close();
+        sleep_timer_close();
+        __disable_irq();
+        delay_ms(500);
+        memcpy((void *)SRAM_BASE, (void *)OTA_ADRESS, 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))();
+        delay_ms(100);
+        flash_close(FLASH_ID0);
+        __enable_irq();
+//                Serial0PutString("进入OTA\r\n");
+    }
+    else  //
+    {	
+        SerialPutString("准备跳转app\r\n");
+        delay_ms(100);
+        uart_close(UART_ID1);
+        gpio_close();
+        sleep_timer_close();
+        __disable_irq();
+        delay_ms(500);
+        //Delay_ms(1000); 
+        /* Test if user code is programmed starting from address "APP_CONFIG_APPLICATION_ADDRESS" */
+		 //Serial0PutString("跳转APPhehe\r\n");
+				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))();
+        
+        delay_ms(100);
+//        flash_close(FLASH_ID0);
+//        __enable_irq();
         //IAP_JumpTo(SRAM_BASE);
     }
+//    delay_ms(200);
   /* USER CODE BEGIN 3 */
 
   }

--
Gitblit v1.9.3