В далеком 2010 году товарищ rtxonair чирканул пару статей про ARM + IAR и в какую сторону вообще копать. Статьи получились толковыми, но их было раз-два и все, а информации по IAR как было негусто, так и осталось (даже сегодня, спустя добрых пять лет). А если такая информация и появляется, то чисто обрывочно, в форме «смотрите, я тут опять диодиком помигал». Впрочем, довольно нытья, мы здесь не за этим :)
▌Водная часть
Наглым образом пропустив вопрос «А-почему-IAR?» (ответ: потому-что-не-Keil), обращу сразу внимание, что в комплекте с платой Pinboard II идет отладочный Colink-адаптер на Кокосе:
Автор статьи (DySprozin) предполагает, что вы уже ознакомились хотя бы с первой частью вышеупомянутого курса, а также внимательно прочитали в мануале быстрого старта, как правильно подключать модуль STM32 (чтобы ничего не пожечь) и как правильно его прошить. В общем, если на данный момент вы умеете «помигать диодиком», а программа Flash Loader Demo работает исправно, то вам зеленый свет, движемся дальше!
▌Зачем вообще Colink?
Думаю, каждый из вас хотя бы раз запускал отладку программ — хотя бы под Avr Studio. Инструмент этот хоть и мощный, но все же оторван от реальности. Куда удобней параллельно наблюдать результат на самой железке. Нет, если, к примеру, не загорается светодиод, то можно обойтись простыми средствами: поставили бряк на нужную строчку, запустили дебаг в эмуляторе и проверили, выполняется ли нужное событие. А если так: диод горел, горел и перестал? Colink-адаптер позволяет остановить выполнение программы, но не виртуально (внутри вашего компьютера), а на реальном микроконтроллере. И там уже будет видно: со стеком ли проблема или еще где затык. В общем, диагноз — надо! Тем более, что вся линейка STM32F10x эту фичу поддерживает — зачем от нее отказываться?
▌Присядем на дорожку. Настройка IAR
Во избежание лишних глюков и багов — качаем свежую версию IAR с официального сайта. Основы описаны в статьях выше, но за полдесятка лет кое что поменялось, так что не грех освежить память. Итак, сначала стандартно.
Создаем папку для проекта, запускаем IAR (версия 7.40), там выбираем Project -> Create New Project. В качестве языка выбираем: C -> main -> жмем OK. Теперь находим нужную папку, жмем «Сохранить». Далее — настраиваем структуру папок в соответствии с этой статьей (кроме CMSIS — там нужен только файл system_stm32f10x.c!) — не ленитесь, к хорошему надо привыкать сразу ;) Почему кроме CMSIS? Потому что если делать все по инструкции пятилетней давности, то при попытке компиляции появится куча ошибок вида:
Error[Pe147]: declaration is incompatible with "__nounwind __interwork __softfp void __set_PSP(unsigned long)" (declared at core_cm3.h 1094 Error[Pe147]: declaration is incompatible with "__nounwind __interwork __softfp void __set_MSP(unsigned long)" (declared at core_cm3.h 1114 Error[Pe147]: declaration is incompatible with "__nounwind __interwork __softfp unsigned long __get_PSP(void)" (declared at core_cm3.h 1084
В последних версиях IAR обзавелся собственной CMSIS-библиотекой, потому настройка выглядит несколько по-другому. И да, теперь нет нужды высчитывать размер оперативки и флеша для линкера — IAR делает это автоматически в соответствии с выбранным камушком. Но мы отвлеклись. Предполагаю, что на данный момент у вас такая картина:
Теперь топаем в свойства проекта и выставляем поддержку CMSIS:
Теперь смело жмите F7, если выплюнет кучу ворнингов, но ни одного еррора, то это возможно глюк :) Попробуйте еще раз прогнать компиляцию (Ctrl+F7, F7). Если не поможет, курите ошибки, задавайте вопросы. Должно получиться вот так:
Получилось? Скомпилировалось? Идем дальше (да, долго, а вы как хотели — пять лет прошло, статьи хоть и хорошие, а все же успели порасти приличным слоем пыли).
Важное правило: сначала заливаем, потом отлаживаем. Это вам не виртуальный отладчик. Откомпилировать и сразу отлаживать на железе не получится (ваш КЭП).
Так что пишем простейшую программку-мигалку:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | #include "stm32f10x.h" //------------------------------------------------------------------------------ void InitAll( void); void Delay( unsigned int Val); //------------------------------------------------------------------------------ int main( void) { InitAll(); while( 1) { // Set PB.6 bit GPIOB->BSRR = GPIO_BSRR_BS6; Delay( 600000); // Reset PB.6 bit GPIOB->BSRR = GPIO_BSRR_BR6; Delay( 600000); } } //------------------------------------------------------------------------------ void InitAll( void) { // Enable PORTB Periph clock RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; // Clear PB.6 control register bits GPIOB->CRL &= ~(GPIO_CRL_MODE6 | GPIO_CRL_CNF6); // Configure PB.6 as Push Pull output at max 10Mhz GPIOB->CRL |= GPIO_CRL_MODE6_0; return; } //------------------------------------------------------------------------------ void Delay( unsigned int Val) { for( ; Val != 0; Val--) { __NOP(); } } //------------------------------------------------------------------------------ |
Компилируем, заливаем на мк (с этим проблем, думаю, не возникнет) и топаем настраивать дебаггер.
▌Настройка Colink (наконец-то!)
Для IAR существует Colink IAR Plugin. И это, можно сказать, порвало мне мозг. Нет, все логично: есть плагин, надо его поставить, но… Во-первых, официальный сайт дает сцыль на красочную 404 страницу. Скачать плагин можно на sourceforge — называется он CoIARPlugin (ведь это так очевидно, да?!). Скачиваем экзешник, устанавливаем. Что дальше? Вроде, раз плагин, то надо установить в папку plugins IAR, логично? Да черта с два! В общем, смотрите, сейчас начнется магия :)
Идем в конфиги проекта, там заходим во вкладку Debugger и выбираем RDI:
Теперь в левом столбце (под Debugger) также находим RDI, тыкаем по нему мышой. Потом переходим по «Browse to your RDI driver» и начинаем искать, куда ставили плагин (по умолчанию ставится в Program Files\CooCox\CoIARPlugin), там должен быть файл CoRDI.dll — вот по нему двойным щелчком. Не забудьте галку Allow hardware reset (зачем нужно — не курил, просто так в мануале). Получится что-то типа такого:
Если все сделали правильно, то после ОК не должно быть никаких ругательств/ошибок, а в верхней менюшке появится раздел RDI:
Заходим в RDI -> Configure. И тут еще один важный момент, который стоил мне десятков минут головняка. Ну что адаптер должен быть выбран «Colink» — это понятно. Порт JTAG (ага, типа там есть выбор). Остальное в принципе тоже можно не трогать. А вот в левом столбце надо выбрать Device. И так уже получилось, что первый пункт там ARM. Вроде логично: выбираем ARM, там выбираем Cortex-M3 и… ни черта не работает!
Ниже мы видим что? Правильно, ST. Но мы же умные, мы же знаем, что наш камень — это ARM Cortex-M3! Горе от ума, блин. В общем, выбираем ST -> наш микроконтроллер:
Жмем ОК, проверяем, что Colink-модуль установлен на плату Pinboard, нажимаем FT RST (кнопка сразу под usb-разъемом, слева от модуля). Ждем секунды 2-3, потом давим RST на модуле STM32. Теперь в IAR запускаем отладку: в меню Project -> Debug without downloading и… Ошибка «Adapter not found». Ну необязательно, хотя такое может быть :) Попробуйте еще раз нажать RST на STM32. Или чуть больше подождать после нажатия (секунд 3-5). Все равно ошибка? Тщательно проверьте все шаги выше или пишите, попробуем разобраться. Ну а если все сделали правильно, то можете наслаждаться отладкой в реальном времени:
Видно, что порт B04 чем-то занят. Интересно, чем? :) Ах да, точно, он зарезервирован под наш JTAG. Так что не пытайтесь использовать его в программе — в лоб не получится. Впрочем, это уже другая история. Спасибо за внимание, все вопросы — в комменты.
(с) DySprozin, 2015 год.
Если как следует пошариться на старом сайте CooCox — можно найти и нативный плагин под IAR, который распознается как «Third-party Driver». Правда, он старый, и в новых IAR’ах, возможно, уже не распознается.
Но у меня отладка как-то странно работает. Через несколько шагов МК улетает по хрен знает какому адресу, хотя без отладчика все работает (да и нечему там не работать — я его на blinky обкатывал).
> в новых IAR’ах, возможно, уже не распознается.
Ага, тут год назад писали: http://www1.coocox.org/forum/topic.php?id=3900
«The old IAR Plugin is stopped to maintanace now. »
> Через несколько шагов МК улетает
> по хрен знает какому адресу
Для любой программы так? Если откомпилировать/залить код выше, тоже вылетает?
Я экспериментировал только на одной. Проверить код выше в данный момент не могу.
Ну и оно еще и странно работает — например, вместо шага может выполнить хрен знает сколько шагов. В чем причина — еще не разобрался.
В Keil’е работало лучше, но вроде тоже не слишком гладко, что навело на размышления о том, не кривоват ли сам CoLink (собрать там неправильно вроде практически нечего, да и я сверял с оригинальной схемой) — с ST-LINK’ом отладка шла без нареканий (правда, давно и с куда более старым IAR’ом).
В планах собрать полноценный ST-LINK/V2 и продолжить эксперименты.
Не, у меня все гладко было, подглючивало только если тупо зажимал пошаговую трассировку на циклах (тогда, шагов после 100 выкидывало в какую-то жопу) — но для этого существует F5 и бряки :)
> не кривоват ли сам CoLink
> собрать там неправильно вроде практически нечего,
> да и я сверял с оригинальной схемой
Со схемой DI или на офф.сайте есть?
Впрочем, к теме кокосовой отладки я наверн вернусь еще не скоро — подсел пока на серию STM32F0x, дешево и сердито, особенно после AVR. Буду их копать, можт еще статейку-другую рожу.
Ну вот такого быть не должно, если только эта жопа не обработчик прерывания)
С оригинальной, разумеется. Оба колинка с открытой схемой же (но прошивка у Ех закрыта).
И что? Разве у них нет отладки?
ЧСХ, если пустить отладчик в свободное плавание (по кнопке F5), то он может сколько угодно циклов мотать (пока на бряк не нарвется), диодик радостно мигает и минуту, и две, и пять. То ли плагин корявый, то ли платка подглючивает. Я склоняюсь к первому варианту (если бы подглючивала плата, то наверн вылетало бы и по F5)
Вроде нашел, оно?
http://www1.coocox.org/CoLinkGuide/how-to-do-CoLink.htm
КокосовойJTAG нет) Есть только SWD, а для него, как понимаю, нужен ST-Link, который надо еще спаять/купить/найти.Ну это логично — раз дебаггер не вмешивается, то оно и не глючит)
Оно самое. Там же, кстати, темплейт для прошивки FT2232 — у меня без оной прошивки не видело адаптер.
SWD — тот же JTAG, только с другим физическим уровнем. Поддерживается многими адаптерами, в том числе CoLinkEx. А вот CoLink вроде действительно не поддерживает.
В смысле только бинарник дают?
Кстати, просто оставлю здесь (прошивка и схема для CoLinkEx), а то на старом сайте 404 ошибку выдает:
http://www.coocox.org/wiki/coocox/CoLinkEx/CoLinkEx-Support#Software
Именно. Кстати, сырки плагинов/дров тоже жопят.
а если у меня дискавери и ST-Link не работает? проект из куба отлично работает и пошагово исполняется, а спиленный по статье — нет. дадите толковую статью почитать?