From ec8d487264ac58ebaa00cf99675528e85c6113d0 Mon Sep 17 00:00:00 2001 From: WXK <287788329@qq.com> Date: 星期三, 13 八月 2025 09:56:46 +0800 Subject: [PATCH] boot开发完成 --- dualboots_Gai_youhua/src/customboot/customboot.c | 307 +++++++++++++++++++++++++++++++++++--------------- 1 files changed, 215 insertions(+), 92 deletions(-) diff --git a/dualboots_Gai_youhua/src/customboot/customboot.c b/dualboots_Gai_youhua/src/customboot/customboot.c index 11e3fe6..e8309c3 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,17 +112,23 @@ 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,程序复位"); @@ -130,56 +140,119 @@ .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(); - board_pins_config(); + 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检测喂狗 +// 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.1启动\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.2启动\r\n"); while(1) { - wdt_ping(WDT_ID0);//喂狗 +// 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修改 @@ -189,79 +262,129 @@ { } updata_byte = tmp;//读取指定地址的值 - if(updata_byte == 0xAAAA)//判断此地址的值是否为0xAAAA,如果是则升级 + if(updata_byte == 0xAAAA)//判断此地址的值是否为0xAAAA,如果是则 升级 { - SerialPutString("串口升级启动\r\n"); - - Main_Menu(); +// SerialPutString("串口升级启动\r\n"); +// +// Main_Menu(); } 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 - 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 修改 + SerialPutString("OTA完成,解密文件启动\r\n"); + SerialPutString("OTA固件解压\r\n"); + +// aesDecInit(); +// +// 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"); - IAP_JumpTo(SRAM_BASE); + + 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 //不是则跳转到APP,注意F0和其他系列的跳转有些不一样,跳转部分可参考原子哥代码 + else if(updata_byte == 0xDDDD)//跳转LORA升级 + { + +// 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 // { - //Delay_ms(1000); +// 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); + + + __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