#linker #usb #stm32 #flash-memory #dfu
#компоновщик #usb #stm32 #флэш-память #dfu
Вопрос:
У меня есть плата steval-stwinkt1, на которой я пытаюсь включить поддержку режима DFU.
Я прошил прошивку загрузчика костюма на начало флэш-памяти (0x8000000), что позволяет загружать другую прошивку, которая была загружена в режиме DFU, или оставаться в текущей программе, чтобы прошить новую прошивку с помощью USB.
я использовал это руководство по st- https://www.youtube.com/watch?v=n_LDXOQHerU
Я попробовал пакет .dfu, который поставляется с STM32Cube, и я увидел, что программа запущена успешно, поэтому я предполагаю, что загрузчик работает.
но когда я пытаюсь создать свой собственный пакет DFU из своего программного обеспечения, программное обеспечение никогда не загружается, и я получаю жесткий сбой. я перенес программное обеспечение в соответствии со стандартом и некоторыми исследованиями, которые я провел, на 0x800C000, изменив следующие строки:
в файле FLASH.ld:
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 2048K
Для:
FLASH (rx) : ORIGIN = 0x800C000, LENGTH = 2048K
и в stm32l4r9xx.h изменил FLASH_BASE на:
#define FLASH_BASE (0x0800C000UL)
с другой попытки я попробовал вместо изменения FLASH_BASE
изменить VECT_TAB_OFFSET
, но это все еще не сработало.
для создания пакета dfu я использую dfu-tool (я использую Linux) и использую эту команду:
dfu-tool convert dfuse software.bin software.dfu
также пытался преобразовать шестнадцатеричный пакет int dfu с помощью официального инструмента, который используется в руководстве, которое я использовал, и все равно не сработало
что мне нужно изменить, чтобы мое программное обеспечение работало при загрузке пакета dfu?
Спасибо
это
Комментарии:
1. все еще нужна помощь, если кто-то сталкивался с этим
2. пожалуйста, нужна помощь
Ответ №1:
Мне кажется, вы упустили из виду тот факт, что размер флэш-памяти, выделенной для вашего приложения, больше не будет составлять 2048 КБ, поскольку ваш пользовательский загрузчик теперь размещается в начале флэш-памяти. Следовательно, вам необходимо вычесть источник flash приложения из общего размера flash:
FLASH (rx) : ORIGIN = 0x800C000, LENGTH = 2048K - (ORIGIN(FLASH) - 0x8000000)
В таких случаях было бы предложено попытаться отладить жесткую ошибку, используя HardFault_Handler()
и немного кодирования. Затем вы сможете извлечь и проанализировать регистр ссылок, счетчик программ, регистр состояния программы и т.д. в тот момент, когда произошел жесткий сбой.
Комментарии:
1. на основе выходных данных программиста openocd, когда я получаю жесткую ошибку, регистры: xPSR: 0x00000003 pc: 00000000 msp: 0x464c4560 изменение liker на то, что вы написали, не восстановило
2. @Finci — Думаю, я также неправильно рассчитал длину флэш-памяти. Я только что отредактировал ответ. Попробуйте посмотреть, работает ли это у вас. Имейте в виду, что вам все еще необходимо, чтобы
VECT_TAB_OFFSET
был определен как текущий адрес таблицы векторов прерываний.3. у меня для VECT_TAB_OFFSET установлено значение 0xC000, а для строки FLASH установлена точная строка в комментарии, и теперь я не получаю от программиста HardFault, но программа по-прежнему не загружается
4. после еще нескольких тестов (без каких-либо изменений) я по-прежнему каждый раз получаю 5 серьезных сбоев, похоже, что плата все еще пытается запуститься с 0 вместо правильного местоположения, не имеет значения, пытаюсь ли я запустить с помощью загрузчика DFU или просто пытаюсь программировать напрямую — оба способа приводят к мертвой программе