| 本帖最后由 lqdjdy 于 2025-3-23 21:35 编辑 
 能否提供一下bootloader启动原理。现在已经实现了USB HID Bootloader 下载程序到0x8000。参考UART Bootloader源码,实现如下ram加载函数, 但无法正常运行0x8000的程序。
 注:烧录uart bootloader程序,可以正常启动,说明USB HID下载到0x8000的用户程序没有问题。
 
 
 #define RESV_FOR_APP_RAM_CODE_SIZE                        0x2000#define MCU_RAM_START_ADDR                                0x840000
 void LoadRamAndReboot(u32 addr_load)
 {
 u32 ramcode_size = 0;
 flash_read_data(addr_load + 0x0c, 2, (u8 *)&ramcode_size);
 ramcode_size *= 16;
 
 if(ramcode_size > RESV_FOR_APP_RAM_CODE_SIZE){
 ramcode_size = RESV_FOR_APP_RAM_CODE_SIZE; // error, should not run here
 }
 println("load to ram...ramsize:%x", ramcode_size);
 flash_read_data(addr_load, ramcode_size, (u8 *)MCU_RAM_START_ADDR); // copy ram code
 WRITE_REG8(0x602, 0x88);
 }
 
 
 int main (void)
 {
 //DEBUG_TX_PIN_INIT();
 
 PLATFORM_INIT;
 CLOCK_INIT;
 
 gpio_set_func(LED1, AS_GPIO);
 gpio_set_output_en(LED1,1);
 
 
 gpio_set_func(KEY4 , AS_GPIO);
 gpio_write(KEY4, 1);
 gpio_set_output_en(KEY4 , 0);
 gpio_set_input_en(KEY4 , 1);
 gpio_setup_up_down_resistor(KEY4, PM_PIN_PULLUP_10K);
 
 sleep_ms(10);
 
 if(!gpio_read(KEY4))
 {
 println("Key down");
 gpio_write(LED1, 1);
 }else
 {
 gpio_write(LED1, 0);
 println("Key up, run to 0x8000");
 
 LoadRamAndReboot(0x8000);
 }
 sleep_ms(10);
 
 user_init();
 
 while (1) {
 main_loop ();
 }
 return 0;
 }
 
 
 |