| Автор |
Съобщение |
|
juzisound
Ранг: Почетен член
Регистриран на: Съб Май 27, 2006 12:37 pm Мнения: 647 Местоположение: с. Згалево
|
 ARM CortexM3 STM32 софтуерно викане на вградения боотлоадер?
Става дума за процесор ARM ST32 High...
Чудя се дали е възможно да извикам вградения bootloader софтуерно. Той по принцип се активира според състоянието на определен пин по време на ресет, обаче на мене ми се иска да мога да го активирам направо от програмата която се изпълнява в момента. Обратното - скачане от боотлоадера към user програмата явно е възможно - и състоянието на пина явно се пренебрегва...
Някой има ли представа дали това е възможно?
От четенето из нета не успях да стигна до конкретен извод... 
|
| Съб Окт 31, 2009 9:45 pm |
|
 |
|
fan
Ранг: Почетен член
Регистриран на: Съб Окт 13, 2007 12:12 pm Мнения: 712
|
Здравей, нищо не ти пречи да си извикаш и по време на работа боотлоадера! Неговия начален адрес се знае(можеш и собствен bootloader вместо него да ползваш). Чети и тествай повечко! Успех!
|
| Нед Ное 01, 2009 1:43 pm |
|
 |
|
juzisound
Ранг: Почетен член
Регистриран на: Съб Май 27, 2006 12:37 pm Мнения: 647 Местоположение: с. Згалево
|
Сега - и аз имах съмнение че ще мога да го извикам - ама нещо ми убягва момента с указател към функцията за целта...
Тоест предполагам че ще трябва да си направя указател към функция /предполагам без параметри/, която да извикам от кода. Нещо обаче не ми стана ясен синтаксиса за целта. Ползвам IAR. Освен това нещо не ми стана ясно с тая таблица на прекъсванията - какво трябва да направя... А и никакъв пример из нета не намерих. Дайте едно рамо 
|
| Нед Ное 01, 2009 3:00 pm |
|
 |
|
fan
Ранг: Почетен член
Регистриран на: Съб Окт 13, 2007 12:12 pm Мнения: 712
|
Един оператор за безусловен преход към адреса на боотлоадера ще ти свърши работа(след като си затвориш приложенията и пр.). 
|
| Нед Ное 01, 2009 3:49 pm |
|
 |
|
juzisound
Ранг: Почетен член
Регистриран на: Съб Май 27, 2006 12:37 pm Мнения: 647 Местоположение: с. Згалево
|
Правя го така:
typedef void (*pFunction)(void);
#define BootloaderAddress ((u32)0x1FFFF000)
pFunction Jump_To_SysBootloader;
vu32 JumpAddress;
И после в кода:
JumpAddress = *(vu32*) (BootloaderAddress + 0);
Jump_To_SysBootloader = (pFunction) JumpAddress;
__MSR_MSP(*(vu32*) BootloaderAddress); // Initialize bootloader Stack Pointer
Jump_To_SysBootloader(); // Real Jump
За сега все още не става!
Явно скачам някъде - ама не е там дето трябва...
А и малко не разбрах какво имаш в предвид "да си затворя приложенията"?
Опитвах да забраня прекъсванията преди това - пак не става. Явно не е от това. Не разбрах, трябва ли и цялата периферия да върна в първоначално състояние за да сработи боотлоадера или ...
За сега няма дебъгер още - и карам малко на сляпо. 
|
| Нед Ное 01, 2009 5:07 pm |
|
 |
|
fan
Ранг: Почетен член
Регистриран на: Съб Окт 13, 2007 12:12 pm Мнения: 712
|
Добре де, как я караш и се учиш без дебъгер? В китчето, което си взел няма ли вграден такъв и с какво го програмираш? В Thumb2 инструкциите има няколко такива за преход виж кой е за този случай и с помоща на кои от регистрите в регистровия файл става прехода...(по изпоти се малко де  ) В IAR-a няма ли някакво GOTO, да те улесни? 
|
| Нед Ное 01, 2009 6:46 pm |
|
 |
|
Zdrav
Ранг: Форумен бог
Регистриран на: Сря Яну 26, 2005 2:01 pm Мнения: 1952 Местоположение: Варна
|
Непознавам STM32, но ми се струва, че наистина скачаш не там където трябва...
Разгледах парчето сорс код който си постнал от чисто любопитство и виждам нещо което не се вързва.
Първо подаваш като аргумент на __MSR_MSP съдържанието на адрес 0x1FFFF000. След това използваш съдържанието на същия този адрес като указател към функция и скачаш към него?!? Двете неща се взаимно изключват. Съдържанието на този адрес или е адрес с който се инициализира указателя на стека или е входния адрес на буутлоадъра. Но не ми се вярва да е и двете едновременно. Всичко това идва от този ред:
Дали офсета на който се намира JumpAddress е нула?
_________________ Най-опасният враг на истината и свободата е мнозинството.
|
| Пон Ное 02, 2009 12:54 am |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
typedef void (*pBoot_t)(void);
const pBoot_t Bootloader = (pBoot_t)0x1FFFF000;
после в кода си викаш бутлоудъра
Bootloader();
Така ми се вижда по добре,пробвай. Виж пак дали 0x1FFFF000 е верния адрес на бутлоудъра. Без дебъгер е умряла работа. Особенно такива неща. При АТ91SAM7 софтуерното извикване на бутлоудъра /SAM-BA/ ми беше цяла епопея доде го измисля как да стане. Хем си имах дебъгер.
|
| Пон Ное 02, 2009 1:27 am |
|
 |
|
fan
Ранг: Почетен член
Регистриран на: Съб Окт 13, 2007 12:12 pm Мнения: 712
|
Да, това е верния адрес на бутлоадера и това е верния код (на Киров) за директен преход към него! Само че така, както я караме без пот в учението...  Успех за напред!
|
| Пон Ное 02, 2009 2:41 am |
|
 |
|
juzisound
Ранг: Почетен член
Регистриран на: Съб Май 27, 2006 12:37 pm Мнения: 647 Местоположение: с. Згалево
|
То пот винаги има за какво друго да тече  .
Те нещата ще отидат в края на собствен боотлоадер - ясно е, че няма да се размине. Също така ясно е и че ще стане. До сега не е имало нещо да не стане.
Случая сега обаче е друг...
Поради недостатъчно леене на пот при дизайна на платките - а те са на 3 пласта - копчето за хардуерен ресет се е получило на такова място - че всеки път му споменавам роднините като ми се наложи да го барам. А на тоя етап все още се налага доста често... В следващите ревизии ще го оправя, ама за сега това ще е някакво улеснение в процеса за развой.
Довечера ще пробвам кода да видим - и ще пиша какво се е получило.
Иначе семплера свири та се носи
Кой да му се надява...
|
| Пон Ное 02, 2009 8:29 am |
|
 |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
Я сподели какво правиш, твоите проекти са ми били винаги интересни 
_________________ Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....
|
| Пон Ное 02, 2009 3:50 pm |
|
 |
|
juzisound
Ранг: Почетен член
Регистриран на: Съб Май 27, 2006 12:37 pm Мнения: 647 Местоположение: с. Згалево
|
Никола Киров е прав - отново
Това което е написал е част от верния код. Явно има още нещо, което ми убягва, ама и сега малко не мога да се съсредоточа върху точно тая задача, щото има и по-спешни неща за писане по устройството - а за в края на седмицата има и важна промоцийка и трябва да го сглася...
Иначе наистина скачам на някъде - ама без дебъгер - кой знае къде.
Сега - какво правя...
Ами нали направихме с колегата един електронен кавал. Хубаво - ама това е реално MIDI контролер - демек дава MIDI сигнал а не аудио. Това MIDI трябва да влезне в някакъв синтезатор или семплер - който вече да свири аудиото, за да може да се ползва директно на сцена. За музиканти, които имат вече някакъв подобен синтезатор - не е проблем да си го ползват, ама повечето гайдари и кавалджии за които е предназначен инструмента нямат такива. А и от друга страна ако контролера ни се включи в нещо калпаво като звук - разбирай по евтин модел синтезатор - малко се опорочава идеята, щото не може да звучи така готино като в големите модели. Те обаче са пък доста скъпи - обикновенно по 5-6 бона, че и нагоре.
Та от там дойде идеята и да си направим собствен звук за нашия си контролер. Хем да е хубав, хем да е евтин. И така, почнахме да правим музикален семплер.
Устройството е подобно на звуковите модули на разните купешки синтезатори /реално семплери/ като Roland, Korg, Yamaha и др. Реализацията е обаче малко по различна. При стандартните семплери има RAM памет. Семплите се зареждат обикновенно от хард диск първо в RAM паметта, а после се плейват от там, че е по-бързо. Обикновено тая RAM памет все не стига. В големите модели е около 128MB, което е горе долу достатъчно, обаче те както казах са пък по 5,6 бона, а и по 20 - 30 кила...
Нашето устройство работи на друг принцип. Семплите стоят на SD карта и се плейват директно от там. Скоростта ни на четене от картата е доста висока и с хитро буфериране можем да свирим до 8 гласа едновременно, което е напълно достатъчно за нашия инструмент. Вярно проектчето малко сложничко стана - ама на практика вече е на 99% готово. остава да дойдат само панелите. То кода ще се развива и след това естествено - но и сега вече е на етап да си върши това за което е предназначено устройството. Големи разправии имахме и с аналоговата част - ама то нали в общи линии аз почти само го правя и основно през свободното време - та затова бавно върви. То не бяха схеми, то не бяха платки, то кутии, то дизайн на панели, че и софтуер да правим че и на нов процесор - човек кое по на пред да прави. Цялото устройство е 12х12 см и тежи около кило - а вътре е и захранването за контролера. Както и да е - вече е почти готово - и скоро ще пуснем и малко видео с него... После ще му мислим и боотлоадер някакъв - по MIDI най вероятно, въпреки че имаме изведени и сериен и USB порт.
Поздрави на всички!

|
| Пон Ное 02, 2009 8:50 pm |
|
 |
|
fan
Ранг: Почетен член
Регистриран на: Съб Окт 13, 2007 12:12 pm Мнения: 712
|
Чудно, при мен скача където трябва - проверено с дебъгер!
|
| Пон Ное 02, 2009 9:03 pm |
|
 |
|
juzisound
Ранг: Почетен член
Регистриран на: Съб Май 27, 2006 12:37 pm Мнения: 647 Местоположение: с. Згалево
|
И при мене се вижда че отива някъде - ама не е ясно дали там. Изглежда като забил! Ако предположим че отива на боотлоадера, трябва ли да направя и нещо друго преди това, че да не забива. Примерно да забраня прекъсванията, някаква инициализация, пренасочване на векторите на прекъсванията и т.н? Аз пробвах само да забраня всички прекъсвания - но нищо не се промени.
|
| Пон Ное 02, 2009 9:18 pm |
|
 |
|
fan
Ранг: Почетен член
Регистриран на: Съб Окт 13, 2007 12:12 pm Мнения: 712
|
Бутлоадера си има процедури за работа, трябва да провериш в документацията за него в ST. A щом го виждам през дебъгера къде отива, то значи е там - къде другаде?
PM0042
Programming manual:"The read protection can be disabled using the boot loader (in this case only a System Reset
is necessary to reload the option bytes). For more details refer to AN2606."
|
| Пон Ное 02, 2009 9:23 pm |
|
|