Перейти к содержанию
    

Как программно загнать STM32 в бутлоадер?

Может быть можно расположить переменную по фиксированному адресу? Как это сделать?

 

Ау?

Изменено пользователем Salamander

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добавить к переменной атрибут __attribute((at(0x08020000)))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А можно просто документацию почитать - там гораздо более интресные есть аттрибуты. И возможности о которых даже не подозреваешь.

Изменено пользователем x893

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

у меня для stm32f407 обновление через стандартный лоадер так:

 

static void BootLoader()

{

void (*SysBootLoaderJmp)(void)=(void (*)(void))(*((uint32_t *)0x1fff0004));

__set_PRIMASK(1);

RCC_DeInit();

SysTick->CTRL=0;

SysTick->LOAD=0;

SysTick->VAL=0;

__set_PRIMASK(1);

__set_MSP(*((uint32_t *)0x1fff0000));

SysBootLoaderJmp();

while(1);

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добавить к переменной атрибут __attribute((at(0x08020000)))
.

Спасибо, а я хотел бы еще так для себя поинтересоваться, а если в процессе компиляции компилятор присвоит какой-либо переменной некий адрес, а потом я в конце захочу указанным атрибутом этот же адрес присвоить другой переменной? Что будет? Или компилятор в первую очередь распределяет явно указанные адреса?

 

 

 

 

Погодите... но если я в бутлодере напишу __attribute((at(0x08020000))) то эта переменная очистится...

Как решить задачу?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а я хотел бы еще так для себя поинтересоваться, а если в процессе компиляции компилятор присвоит какой-либо переменной некий адрес, а потом я в конце захочу указанным атрибутом этот же адрес присвоить другой переменной? Что будет? Или компилятор в первую очередь распределяет явно указанные адреса?

Если конкретный адрес задан, то компилятор туда ничего от себя не поместит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как мне в основной программе записать флажок, чтобы этот флажок был виден в бутлодыре?

Флажка тут мало: он может и случайно оказаться равен 1. Используйте 32 битное слово с каким-нибудь нетривиальным значением.

Передать есть несколько способов (в порядке нарастания сложности):

1. Записать в какой-нибудь периферийный scratchpad-регистр (скажем, регистры ключа AES у вашего процессора).

2. "Спрятать" кусочек RAM от линкера, и писать-читать по указателю.

3. Определить честную секцию с фиксированным адресом для хранения флага. Со стороны загрузчика она должна иметь какой-нибудь атрибут типа "no init", иначе при старте будет затерта нулями.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тему почти можно закрывать. С ножками от HC-05 все получилось.

В C++ Builder проект добавил VCL, обеспечивающий передачу по протоколу YModem. Вроде бы коннект состоялся, но я ему подсунул какую-то лабуду и конечный результат не оценивал.

Остается дождаться, когда китайские братья пришлют еще один HC-05 и попробовать осуществить полноценную прошивку по воздуху

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Остается дождаться, когда китайские братья пришлют еще один HC-05 и попробовать осуществить полноценную прошивку по воздуху

 

Добавлю, если хотите качественой прошивки, незабывайте про то, что передавать нужно пакетами с контр. суммой, и иметь механизм перезапросов. Не пробовал для этой цели Ymodem, делал свои протоколы.

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тему может и можно закрывать, напишу просто как должно быть, чтобы наверняка, если кому пригодится...

 

1. бутлоадер должен грузиться первым, это если боевой прошивки нет позволит ее залить, также проверить ее целостность и секретность

2. флажок надо передавать через флэш, а переключение программа - бутлоадер делать через перезагрузку

3. отлаживаете программу как обычно через жетаг с 0 адреса, а потом просто компилите и собираете для работы с адреса Н для бутлоадера. Для этого в кейле можно сделать несколько режимов компиляции и сборки

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2. флажок надо передавать через флэш, а переключение программа - бутлоадер делать через перезагрузку

Зачем через флеш?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...

3. отлаживаете программу как обычно через жетаг с 0 адреса, а потом просто компилите и собираете для работы с адреса Н для бутлоадера. Для этого в кейле можно сделать несколько режимов компиляции и сборки

Они и есть Target-ы. Недавно спрашивали, зачем они. А вот зачем. :rolleyes:

Лично мне из основной программы в загрузчик выходить не надо. У меня есть выключатель питания, так и попаду в сброс. Ах... флажок... Да, это можно использовать. Установил флажок, сбросился, дождался прошивки, прошился, сбросил флажок. А если не дождался, по таймауту время отсчитал, сбросил флажок, ушел в основную программу.

Размещу флажок в Backup RAM, она у меня от батарейки питается. Тогда и сброс можно делать, как хочешь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Зачем через флеш?

Просто он так сделал, у него заработало, и менять не стал.

Конечно, нужно проверять регистр причины сброса, и если сброс программный, то проверять флаг в ОЗУ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ух... только сейчас отладил всю цепочку переключений и обратно. У блютус модуля определенная задержка была при включении PIO, а я не мог понять приичны неустойчивости работы.

Буду теперь YModem из наколенного состояния перепиливать в удобоваримое.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...