From a52817ac33ed40cbbfdcbfacd1a49fa40e928341 Mon Sep 17 00:00:00 2001 From: WXK <287788329@qq.com> Date: 星期四, 17 四月 2025 16:19:13 +0800 Subject: [PATCH] 兼容4g手环跟4g工卡两种硬件升级 --- dualboots_Gai_youhua/src/customboot/customboot.c | 160 ++++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 122 insertions(+), 38 deletions(-) diff --git a/dualboots_Gai_youhua/src/customboot/customboot.c b/dualboots_Gai_youhua/src/customboot/customboot.c index a80d654..72bc21c 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(); + 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.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.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修改 @@ -234,6 +298,7 @@ if(test1==0) { finalbag=(APP_CONFIG_APPLICATION_SIZE/128)+1; +// wdt_close(WDT_ID0); for(aaa=0;aaa<finalbag;aaa++) { // time32_reset=0; @@ -248,6 +313,7 @@ // else // {SerialPutString("解密失败\r\n");} wdt_ping(WDT_ID0);//喂狗 + shengji_time_100ms=0; } delay_ms(10); SerialPutString("OTA解密成功,准备重启\r\n"); @@ -260,28 +326,46 @@ { 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