Компиляция приложения для запуска не с начала флэш-памяти stm32L4R9I

#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 или просто пытаюсь программировать напрямую — оба способа приводят к мертвой программе