Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как программно загнать STM32 в бутлоадер?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Страницы: 1, 2, 3
Salamander
На AVR все делалось просто - загрузчик запускался первым и по таймауту отдавал управление основной программе. А в тексте основной программы некая функция слушала USART и по определенной команде перезагружала контроллер.
А как в STM - ну подам я на BOOT0 единичку - ее же нужно держать какое-то время после Reset.
Я хочу прошивать дистанционно - по bluetooth (hс-05)
smalcom
программно никак. используйте одновибратор на ножках BOOTx
Porty
Цитата(Salamander @ Mar 7 2015, 21:00) *
На AVR все делалось просто - загрузчик запускался первым и по таймауту отдавал управление основной программе. А в тексте основной программы некая функция слушала USART и по определенной команде перезагружала контроллер.
А как в STM - ну подам я на BOOT0 единичку - ее же нужно держать какое-то время после Reset.
Я хочу прошивать дистанционно - по bluetooth (hс-05)

может задержать BOOT0 на RC цепочке?
Salamander
Цитата(smalcom @ Mar 7 2015, 20:19) *
программно никак. используйте одновибратор на ножках BOOTx

А какова длительность импульса?
smalcom
Цитата(Salamander @ Mar 7 2015, 19:25) *
А какова длительность импульса?


Это вам решать, вы же программу пишите. По доке: смотрите сколько необходимо сохранять требуемый уровень на BOOTx после перевода nRESET в неактивное состояние.
scifi
Самодельный загрузчик кошернее.
Salamander
В доках нашел, что условий запуска загрузчика 6. Вот одно их условий
Цитата
nBoot0(bit) = 0, nBoot1(bit) = 1 and nBoot0_SW(bit) = 0

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



Я уже писал, что хочу использоват bluetooth модуль HC-05.
У него есть пины общего назначения, которые можно включать и выключать AT командой. Эти пины можно подключить и к Boot и к Reset. Но вот как тогда выходить из bootloader...
mantech
Цитата(Salamander @ Mar 7 2015, 20:00) *
На AVR все делалось просто - загрузчик запускался первым и по таймауту отдавал управление основной программе.


Что мешает то же самое сделать на СТМ?? В авр-же сами писали загрузчик. Не умеете писать загрузчики на стм? Возьмите готовый в аппнотах...

Salamander
Так в AVR не было специального пина, все делалось ручками - пинаешь контроллер по адресу и все. Я усомнился, что так вожно в STM, поскольку у него для этого есть железная ножка. А задав вопрос здесь, услышал "программно никак".
mantech
Цитата(Salamander @ Mar 7 2015, 21:53) *
Я усомнился, что так вожно в STM, поскольку у него для этого есть железная ножка. А задав вопрос здесь, услышал "программно никак".


Я просто вообще не понимаю, зачем дрыгать какими-то ножками, если все можно сделать программно?? Кто сказал, что "программно никак"?? Всегда делал программно - стартует буллоадер, опрашивает, есть-ли варианты загрузки, если нет, переопределяем контр. прерываний и на адрес основной проги. В основной проге сбрасываем собаку, а если надо рестартануть - не сбрасываем и все!!
Golikov A.
Железная ножка чтобы загрузить встроенный загрузчик, в который можно писать данные по ком порту.

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

Так все и делают, пишут свою программу, которая запускается первой проверяет надо ли - можно ли грузить нормальную программу, и если да передают управление ей, а если нет сидят и ждут когда придется прошивка.
Приходящую прошивку распихивают во флэш память и запускают...

ножка - это не ограничение а доп фишка, используя ее, данные загрузки надо будет слать в специальном формате, ваш блютус с этим справиться?
Salamander
Цитата(mantech @ Mar 7 2015, 21:59) *
Я просто вообще не понимаю, зачем дрыгать какими-то ножками, если все можно сделать программно?? Кто сказал, что "программно никак"?? Всегда делал программно - стартует буллоадер, опрашивает, есть-ли варианты загрузки, если нет, переопределяем контр. прерываний и на адрес основной проги. В основной проге сбрасываем собаку, а если надо рестартануть - не сбрасываем и все!!

Где почитать, а то мне в основном какая-то вода попадается.
Как сделать, чтобы бутлодер стартовал без ножки Boot0 ?


Цитата
А что вам мешает написать программу, которая будет принимать данные по блютусу, и записывать их во флэш?

Погодите.... У меня подуль HC-05. Ни компьютер, ни STM32 понятия не имеют, что работают с блютус. Они думают, что работают с USART.
Сегодня когда я озадачился бутлоадером, я не подключая блютус модуль скачал FlashLoader Demonstrator, а к STM32 подключил USB-COM конвертер. ПРошивать не пробовал, но контакт контроллера и компа состоялся. ЗАчем мне писать загрузчик, если он уже есть внутри STM32? ПРоцесс заливки прошивки по блютус я могу организовать хоть сейчас (был бы у меня второй HC-05), но мне не нравится только одно - я не хочу жать на кнопку Boot0.


Цитата
первой проверяет надо ли - можно ли грузить нормальную программу,

А как это понять?
Смотрите, как я хочу сделать - работает STM, принимает команды по USART (через блютус). Выполняет их. Как только получает заранее оговореную последовательнось байт - делает что-то, чтобы запустить bootloader. Перепрошивается и вновь запускает основную программу.

То есть мне нужно проверять условие не при старте, а во время работы и из работающей программы посылать контроллер на перепрошивку. На АВР я 3 года назад как-то так делал...
Golikov A.
Ну тогда вам стоит написать бутлоадер хотя бы для того чтобы "не жать на кнопку Boot0."


scifi
Цитата(Salamander @ Mar 7 2015, 22:11) *
ЗАчем мне писать загрузчик, если он уже есть внутри STM32

Для расширения кругозора?
Ну или для того, чтобы он снял все ограничения, присущие заводскому загрузчику, и добавил кучу полезных плюшек.
Golikov A.
как вы хотите все уже поняли, и вам сообщили что не зажав ногу бут при ресете никак...


правильно делается так.

Первой стартует программа загрузчик.
Она проверяет
1. наличие флага обновления прошивки
2. целостность прошивки
3. секретный код (если не хотите чтобы левые люди запускали свои прошивки)
если все хорошо, дальше запускается нормальная прошивка... нет ждет обновления прошивки....


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


все работает по одному сценарию, предсказуемо и надежно. Доп бонусом идет что загрузчик следит сам за тем чтобы ничего в его область не записали, это делает не убиваемый загрузчик.... Можно добавить 4 условие таймаут в загрузчике, если придут данные остается в загрузчике, на случай если будет корректная по всем условиям прошивка не могущая выставить 1 флаг. Ну или кнопку, я кнопку предпочитаю...


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

Salamander
Цитата(Golikov A. @ Mar 7 2015, 22:12) *
Ну тогда вам стоит написать бутлоадер хотя бы для того чтобы "не жать на кнопку Boot0."

А... я начинаю понимать. "свой" бутлодер - это не свой вариант кода, которым мы затираем заводской бутлодер, а дополнительная программа, которая располагается в начальном адресе памяти? Заводской бутлодер никуда не девается, и по прежнему может вызываться кнопкоу boot, но мы им просто не пользуемся. Я правильно понял?
Golikov A.
да, аминьsm.gif

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



ну есть еще вариант, можно между блютусом и процом вставить ЦПЛД или маленький контроллер, который получив правильную последовательность сформирует перегрузку боевого проца с ножкой бут), процы нынче не дороги, а программа на этом маленьком проце не измена... но это ИМХО как-то через одно место)
Salamander
Цитата(Golikov A. @ Mar 7 2015, 22:21) *
да, аминьsm.gif

алилуйа...
Ну зачем же менято было пугать вторым постом?

Побегал по настройкам Keil... Скажите, а можно ли как-то все это настроить, чтобы все так же шить через KEIL? Ну как будто у меня контроллер через Jtag шьется (я понимаю, что отладка невозможна). То есть нажал в KEIL кнопку прошивки, он через USART и залил?
Golikov A.
Ну наверное как-то можно...
Но я прикинул что на выяснения как у меня уйдет больше времени чем на написание внешнего терминальчика.

Тем более у нас в некоторых продуктах прошивка скрыта от пользователя. То есть он просто запускает программу управления на компьютере, а она сама проверяет если железо старое, меняет ему прошивку, пользователь даже не знает что там было...
Так что в производстве можно даже прогу не лить, просто грузишь загрузчик, он как раз заливается кейлом по жетагу. И все, дальше при первом включении плата приобритет необходимую прошивку.
Salamander
Цитата(Golikov A. @ Mar 7 2015, 22:26) *
Ну наверное как-то можно...
Но я прикинул что на выяснения как у меня уйдет больше времени чем на написание внешнего терминальчика.

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


У меня мотивация другая - устройство будет вращаться))) Не хочется останавливать, подключать разъем, потом снова запускать. Ленивый я.

Поиски бутлодера под KEIL привели только к примеру под STM8...
Кто-нибудь ткнет носом, где скачать?
AVNN
В заводской загрузчик на STM32F205 вхожу так:
Код
#define BOOTLOADER_ADDR 0x1FFF0000

typedef  void (*pFunction)(void);
pFunction Jump_To_Bootloader;
uint32_t JumpAddress;

JumpAddress = *(__IO uint32_t*) (BOOTLOADER_ADDR + 4);
Jump_To_Bootloader= (pFunction) JumpAddress;
/* Initialize Stack Pointer */
__set_MSP(*(__IO uint32_t*) BOOTLOADER_ADDR );
Jump_To_Bootloader();


На других STM-ках возможно что-то подобное можно сделать.
Salamander
Цитата(AVNN @ Mar 7 2015, 22:51) *
В заводской загрузчик на STM32F205 вхожу так:
Код
#define BOOTLOADER_ADDR 0x1FFF0000

typedef  void (*pFunction)(void);
pFunction Jump_To_Bootloader;
uint32_t JumpAddress;

JumpAddress = *(__IO uint32_t*) (BOOTLOADER_ADDR + 4);
Jump_To_Bootloader= (pFunction) JumpAddress;
/* Initialize Stack Pointer */
__set_MSP(*(__IO uint32_t*) BOOTLOADER_ADDR );
Jump_To_Bootloader();


На других STM-ках возможно что-то подобное можно сделать.

Я попробовал - контроллер куда то улетает на строчке JumpAddress. То есть, если ставить брейкпоинт на эту строку, отладчик его ловит, если на следюущую - не ловит.
AVNN
Цитата(Salamander @ Mar 7 2015, 22:58) *
Я попробовал - контроллер куда то улетает на строчке JumpAddress. То есть, если ставить брейкпоинт на эту строку, отладчик его ловит, если на следюущую - не ловит.

У меня компилятор IAR. Вот что он в asm выдает

Код
    163                JumpAddress = *(__IO uint32_t*) (BOOTLOADER_ADDR + 4);
   \   00000030   0x....             LDR.N    R0,??DataTable1_4 ;; 0x1fff0000
   \   00000032   0x6841             LDR      R1,[R0, #+4]
   \   00000034   0x60A1             STR      R1,[R4, #+8]
    164                Jump_To_Bootloader = (pFunction) JumpAddress;
   \   00000036   0x6061             STR      R1,[R4, #+4]
    165                /* Initialize Stack Pointer */
    166                __set_MSP(*(__IO uint32_t*) BOOTLOADER_ADDR);
   \   00000038   0xE003             B.N      ??main_2
    167                Jump_To_Bootloader();
  \                     ??main_2: (+1)
   \   00000042   0x6800             LDR      R0,[R0, #+0]
   \   00000044   0xF380 0x8808      MSR      MSP,R0
    175                Jump_To_Application();
   \   00000048   0x4608             MOV      R0,R1
   \   0000004A   0x4780             BLX      R0
Salamander
мне это ни о чем не говорит.
scifi
Вот так кошернее:
Код
static const uint16_t jump2fw[] =
{
        0xF850, 0xDB04, /* LDR.W SP, [R0], #4   */
        0x6800,         /* LDR.W R0, [R0]       */
        0x4700,         /* BX R0                */
};

((void (*)(int))(1 + (int)jump2fw))(0x1FFF0000);
Salamander
Ну да... контроллер куда-то прыгает..
Но видимо не в заводской бутлодер, поскольку программа FlashLoader не видит доступного устройства...

Останавилваю отладчик - дизассемблер вот что показывает
0x080001D6 E7FE B HardFault_Handler (0x080001D6)WEAK]

У 103 серии адрес другой - 0x1FFFF000
Теперь не вылетает в HardFault. Лазит где-то...
Но Flashloader контакт не устанавилвает. Вообще он глючный какой-то - он и при нажатии boot0 через раз коннектится..
KnightIgor
Цитата(Salamander @ Mar 7 2015, 19:00) *
Я хочу прошивать дистанционно - по bluetooth (hс-05)

Я бы присоединился к ответу smalcom и предложил аппаратный переход во встроенный UART загрузчик STM32F, коммуникационный протокол которого описан в документации. Прилагаю схему сброса процессора: при удержании кнопки сброса дольше чем, примерно, 1.5 секунд, и последующем (естественно) ее отпускании процессор улетает в BOOT. Подбором конденсатора С11 можно время изменить, если надо. Не знаком пока с HC-05, но если он поддерживает UART, может он поддерживает и линии квитирования UART. Взяв сигнал RTS, можно завести его на NRST.
Salamander
Секунду... вот дока http://www.icbase.com/Promotion/download/AN2606.pdf

Раздел 3.3 - таблица два. Исходя из нее в контроллерах не Value-серии встроенный загрузчик к адресу не привязан... Так может быть действительно в него нельзя программно прыгнуть?


Цитата
Не знаком пока с HC-05, но если он поддерживает UART, может он поддерживает и линии квитирования UART. Взяв сигнал RTS, можно завести его на NRST.

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

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

Что-то безрезультатно....
Aner
Прошивать дистанционно без написания собственного загрузчика нереально, программно запустить встроенный загрузчик низя.
Еслиб было можно то что тогда ...? В том то и дело.
А все железные приблуды с удержанием, загонят случайно в загрузчик и что тогда? Только ресет, а где его взять дистанционно, аппататный? Нигде, придется ехать за сотню км и перегружать железку, неправильно это.
Salamander
ОК, хочу пример загрузчика под KEIL
ViKo
Одни утверждают, что нельзя программно запрыгнуть в системный загрузчик, другие приводят программу, которая скачэ... Чудеса. Попробую сам. Не вижу принципиальных трудностей. Узнать адрес, и гоу ту... Ножки бута нужны, чтобы сразу перенестись в загрузчик при старте, только и всего.
Salamander, вы не поняли. В таблице два указан адрес идентификатора загрузчика. Это не обязательно. Мы и так знаем, какой загрузчик в мк. И адрес загрузчика всегда конкретный, описан в разделах микроконтроллеров.
mantech
Цитата(ViKo @ Mar 8 2015, 08:45) *
Одни утверждают, что нельзя программно запрыгнуть в системный загрузчик, другие приводят программу, которая скачэ... Чудеса. Попробую сам. Не вижу принципиальных трудностей. Узнать адрес, и гоу ту... Ножки бута нужны, чтобы сразу перенестись в загрузчик при старте, только и всего.


Дак в этом и есть прелесть самописого бутлодыря - то, что он сперва сам запускается, даже если прога вообще еще не загружена, причем никаких ногодрыгов и т.п.
Как вы будете "запрыгивать" в стшный загрузчик, если прога еще не загружена??
Golikov A.
Цитата
Не вижу принципиальных трудностей. Узнать адрес, и гоу ту... Ножки бута нужны, чтобы сразу перенестись в загрузчик при старте, только и всего.

думаю зависит от реализации...

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

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


Integro
Цитата(Aner @ Mar 8 2015, 01:29) *
Прошивать дистанционно без написания собственного загрузчика нереально, программно запустить встроенный загрузчик низя.
Еслиб было можно то что тогда ...? В том то и дело.
А все железные приблуды с удержанием, загонят случайно в загрузчик и что тогда? Только ресет, а где его взять дистанционно, аппататный? Нигде, придется ехать за сотню км и перегружать железку, неправильно это.


Ну вы парни даете... Можно!!!
Выше приведенный пример джампа рабочий. Использую подобную методику на stm32f1 и stm32f4 единственный нюанс это деинитить клоки и периферию перед переходом, что бы сам bootloader это мог сделать корректно.

Протокол работы с STшным бутлоадером подробно описан в AN3155

Но! Если нет уверенности в надежности канала(канала передачи ПО), я бы порекомендовал использовать буфер(внешняя flash или половина flash контроллера если размер ПО позволяет) тоесть заливать прошивку после полного получения, а затем ее прошивать, но понятно, в этом случае понадобится уже свой bootloader с методикой работы описанной вышей.

P.S. Если есть сомнения в работе встроенного bootloader , достаточно в startup.s сделать джамп до инита железа.
Salamander
Цитата(Aner @ Mar 8 2015, 01:29) *
Прошивать дистанционно без написания собственного загрузчика нереально, программно запустить встроенный загрузчик низя.

Да как же? А вот http://www.youtube.com/watch?v=cvKC-4tCRgw
Правда это для F4 серии, но ссылаются на тот же документ, в котором я адреса бутлодера смотрел.


Цитата(mantech @ Mar 8 2015, 09:19) *
Дак в этом и есть прелесть самописого бутлодыря - то, что он сперва сам запускается, даже если прога вообще еще не загружена, причем никаких ногодрыгов и т.п.
Как вы будете "запрыгивать" в стшный загрузчик, если прога еще не загружена??

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

Цитата
достаточно в startup.s сделать джамп до инита железа.


Да! Вот теперь получилось. Но все очень сложно... Только определенная последовательность действий. Нужно сначала загрузить FlashLoader, потом сделать Reset на контроллере и только тогда появляется связь. Если сначала запустить устройство, а потом FlashLoaer и не сделать Reset - пишет unrecognized device.



Все-таки свой бутлодер буду писать. И свой софт.

Да елки - нигде не могу найти исходник бутлодера. Они существуют в природе?
mantech
Цитата(Salamander @ Mar 8 2015, 11:45) *
Все-таки свой бутлодер буду писать. И свой софт.

Да елки - нигде не могу найти исходник бутлодера. Они существуют в природе?


Ну вот хоть правильное решение!

Golikov A.
Цитата
А зачем мне в него прыгать до загрузки? На отладочной плате есть кнопка, ее надо жать до ресета и отпускать потом, понятное дело, что в загрузчик мы попадаем до основной программы.
Но у меня приложение беспроводное, чтобы оно поняло что нужно прошиваться ему нужно команду по воздуху получить, а для этого как раз основная программа должна работать.

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

Цитата
Все-таки свой бутлодер буду писать. И свой софт.

это правильно


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

http://www.st.com/st-web-ui/static/active/...rchtype=keyword

то есть вам надо на самом деле найти 2 документа запись данных во флэш
и запуск прошивки с произвольного адреса.
scifi
Цитата(Salamander @ Mar 8 2015, 11:45) *
Да елки - нигде не могу найти исходник бутлодера. Они существуют в природе?

Прикладываю реальный загрузчик для STM32. Грузит прошивку через TFTP с буфером во внешней SPI flash памяти.
Salamander
Цитата(scifi @ Mar 8 2015, 12:41) *
Прикладываю реальный загрузчик для STM32. Грузит прошивку через TFTP с буфером во внешней SPI flash памяти.

Ох и наворочено....
mantech
Цитата(scifi @ Mar 8 2015, 12:41) *
Прикладываю реальный загрузчик для STM32. Грузит прошивку через TFTP с буфером во внешней SPI flash памяти.


Зачем такие навороты, когда есть первоисточник, там все куда проще: STSW-STM32068

http://www.st.com/web/en/catalog/tools/FM1...chtype=keyword#
scifi
Цитата(Salamander @ Mar 8 2015, 12:52) *
Ох и наворочено....

Любой загрузчик, делающий чуть больше, чем "два байта переслать", будет "навороченным". Никуда от этого не деться...
Salamander
Цитата(scifi @ Mar 8 2015, 12:57) *
Любой загрузчик, делающий чуть больше, чем "два байта переслать", будет "навороченным". Никуда от этого не деться...

Да не скажите.
Вот нашел первоисточник от ST - более или менее понятно.
http://www.st.com/web/en/catalog/tools/FM1...chtype=keyword#
Salamander
Вопрос: вот работает у меня программа, анализирует поток поступающих по USART данных. Получает команду на перепрошивку. Прыгает на бутлоадер. Бутлоадер должен проанализаровать некий флаг и понять, что нужна перепрошивка...
А можно сделать так - записать бутлодер в конец адресного пространства, а основную программу как обычно. И основная программа в случае необходимости прыгает по адресу бутлодера. А по окончанию загрузки просто ресетит контроллер.
ЧТо скажете по поводу такой схемы?
ViKo
Цитата(Salamander @ Mar 8 2015, 15:53) *
ЧТо скажете по поводу такой схемы?

Плохо тем, что, например, для STM32F2xx старшие адреса разбиты на сектора по 128 kB, а младшие - всего по 16 kB. Стирать нужно целый сектор. Нормально, когда загрузчик размещен в отдельном секторе, чтобы не стирать его при перепрошивке. Поэтому загрузчик в секторе 0 предпочтительнее.
Salamander

Вроде бы получилось - в начальных адресах расположил бутлодырь http://www.st.com/web/en/catalog/tools/FM1...chtype=keyword#
По адресу 0x8003000 основную программу. В виду сложности отладки и расстановки брейкпоинтов в таком режиме я зажигаю диодики. Диодики показали, что бутлодырь грузится, а дальше управление передается основной программе.

В основной программе контролирую unsigned char NEED_TO_LOAD и если она равна единичке (сам пишу единичку в окне watch) программу кидает на адрес загрузчика.
А в загрузчике (бутлоадере) таже переменная unsigned char NEED_TO_LOAD контроллируется, и если она равна единичке, то запускается прошивка, если нет передается управление основной программе.

Я понимаю всю наивность моей попытки дать одинаковое имя переменной в разных программах и расчитывать, что она будет видна в обоих. Но попробовать надо было. Не получилось.
Как мне в основной программе записать флажок, чтобы этот флажок был виден в бутлодыре?
Salamander
Может быть можно расположить переменную по фиксированному адресу? Как это сделать?

Ау?
ViKo
Добавить к переменной атрибут __attribute((at(0x08020000)))
x893
А можно просто документацию почитать - там гораздо более интресные есть аттрибуты. И возможности о которых даже не подозреваешь.
hlebn
у меня для 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);
}
Salamander
Цитата(ViKo @ Mar 8 2015, 21:08) *
Добавить к переменной атрибут __attribute((at(0x08020000)))
.
Спасибо, а я хотел бы еще так для себя поинтересоваться, а если в процессе компиляции компилятор присвоит какой-либо переменной некий адрес, а потом я в конце захочу указанным атрибутом этот же адрес присвоить другой переменной? Что будет? Или компилятор в первую очередь распределяет явно указанные адреса?




Погодите... но если я в бутлодере напишу __attribute((at(0x08020000))) то эта переменная очистится...
Как решить задачу?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.