本帖最后由 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;
}
|