From 486655f6d321942291b95ab4ddffb1fa2c296716 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=8D=E5=90=83=E6=B2=B9=E7=82=B8=E9=B8=A1?= <1425962791@qq.com> Date: Thu, 15 Jan 2026 11:24:17 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=8F=9C=E5=8D=95=E5=A4=84?= =?UTF-8?q?=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bootloader/Core/Src/main.c | 49 +++++++++++++++++++++++++++++--------- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/bootloader/Core/Src/main.c b/bootloader/Core/Src/main.c index 9614c87..f841cb9 100644 --- a/bootloader/Core/Src/main.c +++ b/bootloader/Core/Src/main.c @@ -29,6 +29,7 @@ #include #include #include "menu.h" +#include "common.h" #include "delay.h" #include "lcd.h" #include "lcd_init.h" @@ -68,7 +69,34 @@ void SystemClock_Config(void); /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ - +void Bootloader_Main(void) +{ + // Bootloader 循环等待上位机指令 + while (1) + { + // 1. 发送握手信号 + uint8_t status = 0xAA; + SerialPutChar(status); + Serial_PutString("##PICO_BOOT##\r\n"); + // 2. 在延时期间(比如500ms)不断检查有没有收到数据 + // 这样既实现了延时,又不会阻塞接收 + uint8_t key = 0; + for (int i = 0; i < 50; i++) + { + // SerialKeyPressed 应该是一个非阻塞检查函数 + // 如果收到数据返回 1,否则返回 0 + if (SerialKeyPressed(&key)) + { + if (key == '0') + { + // 收到 '0',进入菜单 + Main_Menu(); + } + } + HAL_Delay(10); // 每次只延时 10ms,检查 50 次 = 500ms + } + } +} /* USER CODE END 0 */ /** @@ -120,13 +148,13 @@ int main(void) LCD_Fill(0, 0, LCD_W, LCD_H, BLACK); delay_ms(10); LCD_Set_Light(50); - + // extern eeprom BL24C02 uint8_t update_flag = 0; if(!EEPROM_Init_Check()) { update_flag = EEPROM_UpdateCommand_Check(); if(EEPROM_UpdateCommand_Check()) { - printf("enter firmware update mode\r\n"); + Serial_PutString("enter firmware update mode\r\n"); EEPROM_UpdateCommand_Write(false); } } @@ -139,9 +167,8 @@ int main(void) if(HAL_GPIO_ReadPin(KEYB_PORT, KEYB_PIN) == 0 || update_flag) { LCD_ShowString(72, LCD_H/3, (uint8_t*)"Bootload", WHITE, BLACK, 24, 0);//12*6,16*8,24*12,32*16 - //menu FLASH_If_Init(); - Main_Menu(); + Bootloader_Main(); } } @@ -174,7 +201,7 @@ int main(void) if (strcmp(combined_str, "APP FLAG") == 0) { // 如果相同则跳转 - printf("APP FLAG OK, jump to app\r\n"); + Serial_PutString("APP FLAG OK, jump to app\r\n"); //user code here SysTick->CTRL = 0X00;//禁止SysTick SysTick->LOAD = 0; @@ -190,14 +217,14 @@ int main(void) Jump_To_Application(); } // no legal APP - else + else { LCD_ShowString(74, LCD_H/3, (uint8_t*)"No App!", WHITE, BLACK, 24, 0);//12*6,16*8,24*12,32*16 LCD_ShowString(24, LCD_H/3+48, (uint8_t*)"Plz Download APP", WHITE, BLACK, 24, 0); HAL_Delay(2000); LCD_ShowString(72, LCD_H/3, (uint8_t*)"Bootload", WHITE, BLACK, 24, 0);//12*6,16*8,24*12,32*16 FLASH_If_Init(); - Main_Menu(); + Bootloader_Main(); } } @@ -211,8 +238,8 @@ int main(void) /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ - printf("run in boot while(1)\r\n"); - printf("there is no legal APP\r\n"); + Serial_PutString("run in boot while(1)\r\n"); + Serial_PutString("there is no legal APP\r\n"); HAL_Delay(500); } /* USER CODE END 3 */ @@ -295,7 +322,7 @@ void assert_failed(uint8_t *file, uint32_t line) { /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, - ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + ex: Serial_PutString("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */ } #endif /* USE_FULL_ASSERT */