|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 1:18 am
|
Страница 1 от 1
|
[ 9 мнения ] |
|
Тъп проблем с Cortex-M3 на ST
| Автор |
Съобщение |
|
thegza
Ранг: Минаващ
Регистриран на: Нед Авг 17, 2008 10:16 am Мнения: 58 Местоположение: София
|
 Тъп проблем с Cortex-M3 на ST
Първо да предупредя, че съм бивш пикоборец, така че може да се очаква всичко
Хванах един проект с STM32F103VD , не бях се занимавал с АРМ досега, само с пикове и 8051ци.Взех си MCBSTM32E
board с STM32F103ZE на него, разцъках го, няма проблеми.Днес обаче реших да оживявам реалния хардуер, на който именно е лепнат STM32F103VD.Двата контролера нямат разлика, освен в размера на паметта.Всичко много добре, сменям интерфейса на SWD, понеже пълен JTAG на платката не е направен, програмата се товари, обаче при дебъг не може да стигне и до main() , само подскача по някакви асемблерски инструкции в прозореца с disassembled code.Ако на uVision-a му цъкна при дебъг да качва наново програмата ми дава грешка, че не може да намери памет 0х8000000.Не мога и не мога да оживя платката.......Някой някакви идеи?[/img]
_________________ RadtoDecart (HowRot/2,HowOpen/7.5, &TheZone.Dots[TheZone.CurrentDot].X, &TheZone.Dots[TheZone.CurrentDot++].Y);
|
| Съб Дек 26, 2009 1:35 am |
|
 |
|
thegza
Ранг: Минаващ
Регистриран на: Нед Авг 17, 2008 10:16 am Мнения: 58 Местоположение: София
|
http://www.keil.com/forum/docs/thread14110.asp Проблемът ми е абсолютно същия, с тази разлика, че като махна отметките при мен не се оправя
_________________ RadtoDecart (HowRot/2,HowOpen/7.5, &TheZone.Dots[TheZone.CurrentDot].X, &TheZone.Dots[TheZone.CurrentDot++].Y);
|
| Съб Дек 26, 2009 2:56 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
Аз мога само да гадая... поне да беше казал какъв емулатор използваш
Възможни са и хардуерни и софтуерни проблеми или комбинация от двете. Това че си спестил от сигналите ме навежда на мисълта, че вероятно и ресета не ти е вързан и трябва да осигуриш читаво начално състояние по друг начин. А пък ако си спестил от масите в JTAG/SWD конектора може и сигналите да се омазват. То затова не е добра идея да правиш икономии от дебъг интерфейса, щото драйверите са бързи и са правени за 50-100МХц и дори да го клатиш на ниска скорост фронтовете са стръмни и може да имаш осцилации. Това е често срещан проблем при саморъчно правените емулаторчета и кабелчета...
В такива случаи е добре да имаш и втори емулатор с който да изключиш проблеми по връзката и проблеми с нестабилен таргет. За предпочитане е или купешки емулатор или поне нещо от сорта на OpenOCD. Силата на второто е самостоятелната работа, демек закачаш се и през конзолата тестваш четене/писане от паметта, изпълнение на инструкция по инструкция и така се убеждаваш че таргета е ОК, както и че имаш стабилна връзка с него.
Едва след това може да се мъчиш с дебъгер. Тук трябва да си настриш зареждането на твоя софтуер, както и подготовката за дебъгване. Проблемът е че за флашването има различни варианти, като най-често в таргета се качва агент, който пуска клоци е всичко необходимо. В зависимост от емулатора и настройките може да се вдига JTAG/SWD клока и/или таргет клока. И след като приключи флашването процесора остава в "някакво" състояние... Според настройките може да се ползва външен ресет за да върне ядрото в начално (ресет) състояние преди да се продължи с дебъгването. Ама ти ако не си вързал ресета няма как да стане. Другия вариант е софтуерно да се ресетне всичко. За целта се пишат т.н. "ресет скриптове", които може да са на емулатора или пък на средата която ползваш.
На мен uVision нищо не ми говори, така че не мога да помогна... Само ти казвам, че ако не са ти оправени тия неща има много варианти да се омаже. Примерно ако агента е дигнал клоковете при флашването и ти после в твоя софтуер като част от инициализацията си може да минеш през някакъв по-нисък клок на ядрото, което ще скапе JTAG комуникацията и после трябва включ-изключ...
|
| Съб Дек 26, 2009 8:11 pm |
|
 |
|
fan
Ранг: Почетен член
Регистриран на: Съб Окт 13, 2007 12:12 pm Мнения: 712
|
Миро, много се отплесна от темата човеко!
За да работи всичко както трябва(в кеил-а  ), е нужно да заредиш програмата в контролера. След което, да добавиш точка на прекъсване в първия ред от main функцията. След което да пуснеш дебъг режима. Натискаш бутона "Run" и се преместваш на листа със C кода защото той те прехвърля в началото на асемблерския листинг. От там вече си добавяш или премахваш по твой избор точки на прекъсване, освен това вече спокойно можеш да ползваш и по стъпково дебъгване. Ако правилно си конфигурирал кейла и проекта преди да започнеш работа не би трябвало да имаш проблеми с поместването на кода в адресното пространство както споменаваш( и в двата режима JTAG/SWD).
|
| Съб Дек 26, 2009 11:15 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
Мда... ако всичко работи, натискаш "бутона run" и е така, както казваш
Само, че кво праим ако не работи? А то с АРМ често не работи, щото за да "конфигурираш правилно" нещата обикновено се иска да знаеш поне малко как работят..
|
| Нед Дек 27, 2009 2:14 am |
|
 |
|
fan
Ранг: Почетен член
Регистриран на: Съб Окт 13, 2007 12:12 pm Мнения: 712
|
Просто при кейла си има особености, нищо повече. А за конфигурирането той се грижи за това - ако избереш този вариант.
|
| Нед Дек 27, 2009 2:17 am |
|
 |
|
thegza
Ранг: Минаващ
Регистриран на: Нед Авг 17, 2008 10:16 am Мнения: 58 Местоположение: София
|
http://www.keil.com/ulinkme/ Това ми е дебъгера, това дойде с евалуейшън борда.Ресет-а е вързан, платката е правена не от мен, а от професионалисти, както трябва е.Мога да постна схема ако е нужно.
_________________ RadtoDecart (HowRot/2,HowOpen/7.5, &TheZone.Dots[TheZone.CurrentDot].X, &TheZone.Dots[TheZone.CurrentDot++].Y);
|
| Пон Дек 28, 2009 3:21 am |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
Не знам... не познавам нито ULINK нито кейл
Но щом се стига до някакво зареждане на програма и някакво дебъгване значи "нещо" работи. Това е по-добре, отколкото да нямаше никаква връзка с таргета
Въпросът е да се ориентираш сега какво точно работи и какво не работи. Дали самият контролер се омазва, дали SWD връзката или нещо софтуерно или конфигурация не е наред..
Тук ако има колеги дето познават въпросните инструменти могат да дадат по-точни указания. Иначе след като пуснеш дебъга аз бих търсил първо начин за четене и писане от паметта. Не знам дали има конзола с команди за memory read/write или пък имаш някакъв джам memory view, но все трябва да имаш нещо...
Първо гледаш дали RAM се чете и дали се чете правилно, щото ако при всяко чете или refresh на view-то се менят стойностите значи нещо не е наред...
Гледаш дали можеш да променяш RAM-а. То в някои емулатори си има мем тест команди дето тестват паметта.
Ако паметта се дъни значи имаш проблем с процесора или SWD-то, т.е. нещо на съвсем ниско (хардуерно) ниво.
После гледаш флаша - дали там наистина е записана твоята програма или не. Ако не е твоята програма някои дебъгери се държат наистина странно и се получава тоя ефект на "скачане". Това се получава когато дебъгера не чете реално флаша. Само взема РС-то (адреса) на който е спрял процесора и ти показва твоя код на тоя адрес. Ти виждаш някаква инструкция от твоя код, но като степнеш се изпълнява нещо съвсем различно (това което реално се намира като код във флаша). При GDB е така, при IAR доколкото си спомням четяха флаша и го няма това скачане... Не знам при кейл как е...
Както и да е - идеята е да видиш какво е записано и освен това да пробваш постъпково изпълнение на асемблерски инструлции. Ще е хубаво поне малко да имаш поглед върху асемблера, колкото да се ориентираш дали кода който се изпълнява е тоя който виждаш... Но все се надявам, че толкова ще се ориентираш - кои инструкции са за преход, кои местят регистри и т.н.
Ако процесорът изпълнява правилно инструкциите вече остава да видиш защо не стига до твоя main()... Демек просто да го дебъгнеш  Първо се убеждаваш че дебъга започва от ресет вектора, там се зарежда правилно PC и SP и после се изпълнява твоя код за инициализация, доколкото имаш такъв - не знам 
|
| Пон Дек 28, 2009 11:55 am |
|
 |
|
thegza
Ранг: Минаващ
Регистриран на: Нед Авг 17, 2008 10:16 am Мнения: 58 Местоположение: София
|
Проблема наистина се оказа тъп  Имало boot pins процесора си търсеше кода на друго място 
_________________ RadtoDecart (HowRot/2,HowOpen/7.5, &TheZone.Dots[TheZone.CurrentDot].X, &TheZone.Dots[TheZone.CurrentDot++].Y);
|
| Чет Фев 11, 2010 2:59 pm |
|
|
|
Страница 1 от 1
|
[ 9 мнения ] |
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 3 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|