Jump to content

    
Sign in to follow this  
ierofant

STM32 bootloader

Recommended Posts

Теперь подвис на том, как размер кода задать в самом коде. Как здесь писали, после векторов прерываний разместить, например. С помощью линкера (Кейл).

Вариант 2 - занести в код при расчете CRC и кодировании, внешней программой. Это можно. Нужно только зарезервировать в исходнике место для числа-размера. Может, прямо в стартап добавить?

 

upd. "Нашел" дыру в стартапе. Как, пойдет?

__Vectors       DCD     __initial_sp              ; Top of Stack
                DCD     Reset_Handler             ; Reset Handler
                DCD     NMI_Handler               ; NMI Handler
                DCD     HardFault_Handler         ; Hard Fault Handler
                DCD     MemManage_Handler         ; MPU Fault Handler
                DCD     BusFault_Handler          ; Bus Fault Handler
                DCD     UsageFault_Handler        ; Usage Fault Handler
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     SVC_Handler               ; SVCall Handler
                DCD     DebugMon_Handler          ; Debug Monitor Handler

Share this post


Link to post
Share on other sites
upd. "Нашел" дыру в стартапе. Как, пойдет?
Пойдет, но я бы не экономил. Потом когда-нибудь будете портировать на более продвинутый кортекс у которого это место в таблице занято и будете долго искать причину неработы. Это раз. Второе - будет довольно сложно заставить линкер класть размер в уже занятое векторами место. А сразу за векторами никто ему мешать не будет.

Share this post


Link to post
Share on other sites
Пойдет, но я бы не экономил. Потом когда-нибудь будете портировать на более продвинутый кортекс у которого это место в таблице занято и будете долго искать причину неработы. Это раз. Второе - будет довольно сложно заставить линкер класть размер в уже занятое векторами место. А сразу за векторами никто ему мешать не будет.

Полистал книжку по Cortex-M4, там тоже дыра. Можно и после векторов прерываний разместить, но и там сдвиг возможен в новых микроконтроллерах, даже с большей вероятностью.

Линкером класть не умею (вернее, вычислять размер не умею). Буду своей программой записывать, туда же CRC, туда же и серийный номер. STM32 ST-Link Utility умеет перезаписывать флэш (ей серийный номер и обновляю).

 

Э-э, CRC туда поместить нельзя. Иначе при расчете нужно проскакивать ее. Ее лучше в конец приписать, чтобы полный расчет дал 0.

Share this post


Link to post
Share on other sites

Пробую разместить строки в startup.s, чтобы знать точное место. Добавил после определения векторов:

         EXPORT  Serial
         ALIGN 4
Serial DCB  "0000", 0

Вижу в выходном коде свои строки, если к ним нет обращения. Но не видит программа этих переменных из c-файлов, и не компилируется из-за ошибки!

Поможите, чем можете!

Share this post


Link to post
Share on other sites
Напишите перед использованием объявление:

extern uint16_t Serial;

Так не пробовал. У меня же строка.

А extern char *Serial; компилируется, но не работает. Потому что не указатель. А extern char[] Serial не компилируется.

Как-то надо создать указатели на строки в ассемблерном файле. Неужели вручную?

Сообразил:

TxBuffer_write((char *)&Serial);

Share this post


Link to post
Share on other sites
А extern char *Serial; компилируется, но не работает. Потому что не указатель. А extern char[] Serial не компилируется.
" А кто из телепатов не догадался, что там у меня в исходнике и как ругается компилятор - я не виноват".

 

Сообразил:

TxBuffer_write((char *)&Serial);

Какое-то масло масляное. Как теперь объявлен Serial?

 

Share this post


Link to post
Share on other sites
" А кто из телепатов не догадался, что там у меня в исходнике и как ругается компилятор - я не виноват".

Какое-то масло масляное. Как теперь объявлен Serial?

Я, вроде, всё описал выше.

В startup.s:

                EXPORT  Serial
                ALIGN   4
Serial          DCB     "0002",0

В Main.h:

extern const char Serial;

Использую:

  TxBuffer_write((char *)&Serial);

Share this post


Link to post
Share on other sites
Я, вроде, всё описал выше.
Про main.h не было. И текста ругани компилятора не было. Вот так должно работать:

extern const char Serial[];

  TxBuffer_write(Serial);

 

 

extern const char Serial;

А, тогда понятно, почему потребовалось брать адрес и грубой силой приводить его к другому типу.

Share this post


Link to post
Share on other sites
Про main.h не было. И текста ругани компилятора не было. Вот так должно работать:

extern const char Serial[];

Это я попутал с C#, не туда скобки присобачил. :rolleyes: Дал маху. Пишу параллельно шифровщик прошивки на компьютере.

 

Новая загадка всплыла. Серийный номер нужно же сохранить при обновлении прошивки. И в расчете CRC он не должен участвовать. Эх, что-то криво все выходит...

Можно, конечно, в ту самую OTP его прописать.

upd. Но уже был прецедент - переписали номер на корпусе, чтобы солидней выглядело. Меня в известность не поставили. :laughing:

Share this post


Link to post
Share on other sites

Осенило - а что, если разместить серийный номер в конце сектора от загрузчика? Раз записал, номер обновил ST-Link Utility, защиту от записи установил ей же. Остальное - в основной программе.

Share this post


Link to post
Share on other sites

Так и сделал. Только не в конце, а так же, после векторов прерываний.

И еще один вопросик появился. Как в startup.s передать строковую переменную, конкретно, VERSION?

Допустим, в Main.h есть #define VERSION "3.50". Как эту строку забить в ассемблерную DCB команду?

Share this post


Link to post
Share on other sites

Попробую спросить еще раз. Где бы почитать, как задать переменные в asm "file.s" из внешнего "defines.h"? Что-то ничего не нахожу.

 

P.S. Скачал с ARM сайта документы, но... решил обойтись иначе. Ни к чему мне хранить строки в asm-файле. Для работы загрузчика нужно только хранить размер кода. И серийный номер буду записывать вручную по выбранному адресу, а читать чисто указателем на этот адрес.

Share this post


Link to post
Share on other sites
Попробую спросить еще раз. Где бы почитать, как задать переменные в asm "file.s" из внешнего "defines.h"? Что-то ничего не нахожу.

С такими запросами только на IAR переходить :) - он синтаксис С-препроцессора понимает.

Судя по http://infocenter.arm.com/help/index.jsp?t...sm_chebabgi.htm

можно разве что в asm-файле определить символ через GBLS, а потом передать его значение через командную строку (--predefine ... ).

 

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
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.

Sign in to follow this