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 | 273 +++++++++++++++++++++++++++++++++++++----------------- 1 files changed, 188 insertions(+), 85 deletions(-) diff --git a/dualboots_Gai_youhua/src/customboot/customboot.c b/dualboots_Gai_youhua/src/customboot/customboot.c index a80d654..e8309c3 100644 --- a/dualboots_Gai_youhua/src/customboot/customboot.c +++ b/dualboots_Gai_youhua/src/customboot/customboot.c @@ -15,6 +15,7 @@ #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; @@ -23,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}; @@ -109,15 +112,15 @@ 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}; @@ -137,58 +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); +// 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修改 @@ -200,9 +264,9 @@ updata_byte = tmp;//读取指定地址的值 if(updata_byte == 0xAAAA)//判断此地址的值是否为0xAAAA,如果是则 升级 { - SerialPutString("串口升级启动\r\n"); - - Main_Menu(); +// SerialPutString("串口升级启动\r\n"); +// +// Main_Menu(); } else if(updata_byte == 0xBBBB)//判断此地址的值是否为0xBBBB,如果是则网络升级 { @@ -215,73 +279,112 @@ 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; - 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);//喂狗 - } - delay_ms(10); - SerialPutString("OTA解密成功,准备重启\r\n"); - delay_ms(500); - NVIC_SystemReset(); - } +// 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"); +// 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 if(updata_byte == 0xDDDD)//跳转LORA升级 + { + +// SerialPutString("进入OTA,升级启动\r\n"); +// delay_ms(100); uart_close(UART_ID1); - delay_ms(1000); + 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 // { +// SerialPutString("准备跳转app\r\n"); +// delay_ms(100); uart_close(UART_ID1); - delay_ms(200); + 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); +// delay_ms(200); /* USER CODE BEGIN 3 */ } -- Gitblit v1.9.3