Перейти к содержанию
    

Всем привет! Появилось необходимость написать custom bootloader на китайце ch32v003. Столкнулся с проблемой что не получается сделать корректно jump в прошивку которая лежит по адресу 0x80001800. Может кто-нибудь может подсказать как это сделать корректно? Пробовал отключать все прерывания bootloader и делать вызов функции, падаю в ресет. 

NVIC_DisableIRQ(SysTicK_IRQn);

    void (*application_entry)(void) = (void (*)(void))(*(uint32_t *)(FLASH_APPLICATION_ADDRESS + 4));

    application_entry();

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 6/21/2024 at 12:08 PM, Alexandr27 said:

Появилось необходимость написать custom bootloader на китайце ch32v003. 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

24 минуты назад, dimka76 сказал:

 

Добрый день! Спасибо за ответ!Я попытался вытянуть ассемблерный код но он не заработал. К сожалению после jump всеравно ресетиться контроллер 

startup_ch32v00x.S

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А где метка _vector_base ?

Попробуйте так:

    la t0, _start
    ori t0, t0, 3
    csrw mtvec, t0

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 21.06.2024 в 20:50, kan35 сказал:

Такой код если?

    asm volatile( "la ra, 0x80001800\n\t"
                    "jalr ra"
                );

 

Добрый день! Спасибо за ответ! В результате падаю в HardFault_Handler. Пробывал и такой адресс и адресс + 4 и пробовал даже прыгнуть снова в загрузчик - все так же HardFault_Handler

	GPIO_SetBits(LED_PORT, LED_PIN);
    delay_ms(500);

    GPIO_ResetBits(LED_PORT, LED_PIN);
    delay_ms(500);

    time = get_timestamp();
  
    __disable_irq();
    asm("la ra, 0x80000004\n\t"
                    "jalr ra");

    while(1)
    {

    }

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По адресу 0x0 лежит не указатель на reset_handler, а инструкция j reset_handler - понимаете разницу?

По адресу 0х4 нет ничего полезного.

Не советую использовать адреса 0x800.. для адресации flash - попробуйте 0x000...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, adnega сказал:

По адресу 0x0 лежит не указатель на reset_handler, а инструкция j reset_handler - понимаете разницу?

По адресу 0х4 нет ничего полезного.

Не советую использовать адреса 0x800.. для адресации flash - попробуйте 0x000...

Понимаю, но от этого не легче) Я пробовал разные варианты с +4 без разные адреса и так далее - один черт хартфолт 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А внутри HF есть возможность получить значения регистров mepc, mcause, mtval ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, adnega сказал:

А внутри HF есть возможность получить значения регистров mepc, mcause, mtval ?

Да, я проверял во время сета через асемблер их так же - все корректно. Сейчас возникли подозрения что WCH-LinKUtility стирает память полностью или не зашивает по корректному адресу прошивку приложения. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

WCH-Link не умеет стирать/дописывать частями. Всегда делает MassErase на любую просьбу.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 минут назад, adnega сказал:

WCH-Link не умеет стирать/дописывать частями. Всегда делает MassErase на любую просьбу.

 

А не в курсе можно ли сделать это через platformio указав ему офсет врайт и LD поменяв?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Насколько я помню, WCH-Link, даже получив команду частичного взаимодействия в памятью, все равно стирает всю. Т.е. по USB, по протоколу приходит описание региона (смещение и размер), но он эти данные игнорирует. По-моему, ответ: никак невозможно. Однако, что-то могло поменяться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 минут назад, adnega сказал:

Насколько я помню, WCH-Link, даже получив команду частичного взаимодействия в памятью, все равно стирает всю. Т.е. по USB, по протоколу приходит описание региона (смещение и размер), но он эти данные игнорирует. По-моему, ответ: никак невозможно. Однако, что-то могло поменяться.

Понял спасибо за информацию! Возможно в этом и есть причина почему у меня не получается прыгнуть в аплекийшен 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...