Alexandr27 0 21 июня Опубликовано 21 июня · Жалоба Всем привет! Появилось необходимость написать custom bootloader на китайце ch32v003. Столкнулся с проблемой что не получается сделать корректно jump в прошивку которая лежит по адресу 0x80001800. Может кто-нибудь может подсказать как это сделать корректно? Пробовал отключать все прерывания bootloader и делать вызов функции, падаю в ресет. NVIC_DisableIRQ(SysTicK_IRQn); void (*application_entry)(void) = (void (*)(void))(*(uint32_t *)(FLASH_APPLICATION_ADDRESS + 4)); application_entry(); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 63 21 июня Опубликовано 21 июня · Жалоба On 6/21/2024 at 12:08 PM, Alexandr27 said: Появилось необходимость написать custom bootloader на китайце ch32v003. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alexandr27 0 21 июня Опубликовано 21 июня · Жалоба 24 минуты назад, dimka76 сказал: Добрый день! Спасибо за ответ!Я попытался вытянуть ассемблерный код но он не заработал. К сожалению после jump всеравно ресетиться контроллер startup_ch32v00x.S Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kan35 7 21 июня Опубликовано 21 июня · Жалоба Такой код если? asm volatile( "la ra, 0x80001800\n\t" "jalr ra" ); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 21 июня Опубликовано 21 июня · Жалоба А где метка _vector_base ? Попробуйте так: la t0, _start ori t0, t0, 3 csrw mtvec, t0 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alexandr27 0 24 июня Опубликовано 24 июня · Жалоба В 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) { } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 24 июня Опубликовано 24 июня · Жалоба По адресу 0x0 лежит не указатель на reset_handler, а инструкция j reset_handler - понимаете разницу? По адресу 0х4 нет ничего полезного. Не советую использовать адреса 0x800.. для адресации flash - попробуйте 0x000... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alexandr27 0 24 июня Опубликовано 24 июня · Жалоба 1 час назад, adnega сказал: По адресу 0x0 лежит не указатель на reset_handler, а инструкция j reset_handler - понимаете разницу? По адресу 0х4 нет ничего полезного. Не советую использовать адреса 0x800.. для адресации flash - попробуйте 0x000... Понимаю, но от этого не легче) Я пробовал разные варианты с +4 без разные адреса и так далее - один черт хартфолт Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 24 июня Опубликовано 24 июня · Жалоба А внутри HF есть возможность получить значения регистров mepc, mcause, mtval ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alexandr27 0 24 июня Опубликовано 24 июня · Жалоба 1 час назад, adnega сказал: А внутри HF есть возможность получить значения регистров mepc, mcause, mtval ? Да, я проверял во время сета через асемблер их так же - все корректно. Сейчас возникли подозрения что WCH-LinKUtility стирает память полностью или не зашивает по корректному адресу прошивку приложения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 24 июня Опубликовано 24 июня · Жалоба WCH-Link не умеет стирать/дописывать частями. Всегда делает MassErase на любую просьбу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alexandr27 0 24 июня Опубликовано 24 июня · Жалоба 11 минут назад, adnega сказал: WCH-Link не умеет стирать/дописывать частями. Всегда делает MassErase на любую просьбу. А не в курсе можно ли сделать это через platformio указав ему офсет врайт и LD поменяв? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 24 июня Опубликовано 24 июня · Жалоба Насколько я помню, WCH-Link, даже получив команду частичного взаимодействия в памятью, все равно стирает всю. Т.е. по USB, по протоколу приходит описание региона (смещение и размер), но он эти данные игнорирует. По-моему, ответ: никак невозможно. Однако, что-то могло поменяться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alexandr27 0 24 июня Опубликовано 24 июня · Жалоба 12 минут назад, adnega сказал: Насколько я помню, WCH-Link, даже получив команду частичного взаимодействия в памятью, все равно стирает всю. Т.е. по USB, по протоколу приходит описание региона (смещение и размер), но он эти данные игнорирует. По-моему, ответ: никак невозможно. Однако, что-то могло поменяться. Понял спасибо за информацию! Возможно в этом и есть причина почему у меня не получается прыгнуть в аплекийшен Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 24 июня Опубликовано 24 июня · Жалоба Тогда подробности тут Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться