Jump to content
    

Application Jump ch32v003

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

NVIC_DisableIRQ(SysTicK_IRQn);

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

    application_entry();

 

Share this post


Link to post
Share on other sites

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

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

 

Share this post


Link to post
Share on other sites

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

 

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

startup_ch32v00x.S

Share this post


Link to post
Share on other sites

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

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

 

Share this post


Link to post
Share on other sites

А где метка _vector_base ?

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

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

 

Share this post


Link to post
Share on other sites

В 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)
    {

    }

 

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

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

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

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...