ARM. Учебный курс. IAR EWARM. Создание проекта — часть 3. Подключение Colink: танцы с бубном и без.

В далеком 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 год.

10 thoughts on “ARM. Учебный курс. IAR EWARM. Создание проекта — часть 3. Подключение Colink: танцы с бубном и без.”

  1. Если как следует пошариться на старом сайте CooCox — можно найти и нативный плагин под IAR, который распознается как «Third-party Driver». Правда, он старый, и в новых IAR’ах, возможно, уже не распознается.

    Но у меня отладка как-то странно работает. Через несколько шагов МК улетает по хрен знает какому адресу, хотя без отладчика все работает (да и нечему там не работать — я его на blinky обкатывал).

    1. > в новых IAR’ах, возможно, уже не распознается.
      Ага, тут год назад писали: http://www1.coocox.org/forum/topic.php?id=3900

      «The old IAR Plugin is stopped to maintanace now. »

      > Через несколько шагов МК улетает
      > по хрен знает какому адресу
      Для любой программы так? Если откомпилировать/залить код выше, тоже вылетает?

      1. Я экспериментировал только на одной. Проверить код выше в данный момент не могу.
        Ну и оно еще и странно работает — например, вместо шага может выполнить хрен знает сколько шагов. В чем причина — еще не разобрался.
        В Keil’е работало лучше, но вроде тоже не слишком гладко, что навело на размышления о том, не кривоват ли сам CoLink (собрать там неправильно вроде практически нечего, да и я сверял с оригинальной схемой) — с ST-LINK’ом отладка шла без нареканий (правда, давно и с куда более старым IAR’ом).
        В планах собрать полноценный ST-LINK/V2 и продолжить эксперименты.

  2. Не, у меня все гладко было, подглючивало только если тупо зажимал пошаговую трассировку на циклах (тогда, шагов после 100 выкидывало в какую-то жопу) — но для этого существует F5 и бряки :)

    > не кривоват ли сам CoLink
    > собрать там неправильно вроде практически нечего,
    > да и я сверял с оригинальной схемой
    Со схемой DI или на офф.сайте есть?

    Впрочем, к теме кокосовой отладки я наверн вернусь еще не скоро — подсел пока на серию STM32F0x, дешево и сердито, особенно после AVR. Буду их копать, можт еще статейку-другую рожу.

    1. тогда, шагов после 100 выкидывало в какую-то жопу

      Ну вот такого быть не должно, если только эта жопа не обработчик прерывания)

      Со схемой DI или на офф.сайте есть?

      С оригинальной, разумеется. Оба колинка с открытой схемой же (но прошивка у Ех закрыта).

      подсел пока на серию STM32F0x

      И что? Разве у них нет отладки?

      1. Ну вот такого быть не должно, если только эта жопа не обработчик прерывания)

        ЧСХ, если пустить отладчик в свободное плавание (по кнопке F5), то он может сколько угодно циклов мотать (пока на бряк не нарвется), диодик радостно мигает и минуту, и две, и пять. То ли плагин корявый, то ли платка подглючивает. Я склоняюсь к первому варианту (если бы подглючивала плата, то наверн вылетало бы и по F5)

        Оба колинка с открытой схемой же

        Вроде нашел, оно?
        http://www1.coocox.org/CoLinkGuide/how-to-do-CoLink.htm

        И что? Разве у них нет отладки?

        Кокосовой JTAG нет) Есть только SWD, а для него, как понимаю, нужен ST-Link, который надо еще спаять/купить/найти.

  3. ЧСХ, если пустить отладчик в свободное плавание (по кнопке F5), то он может сколько угодно циклов мотать

    Ну это логично — раз дебаггер не вмешивается, то оно и не глючит)

    Вроде нашел, оно?

    Оно самое. Там же, кстати, темплейт для прошивки FT2232 — у меня без оной прошивки не видело адаптер.

    Есть только SWD, а для него, как понимаю, нужен ST-Link

    SWD — тот же JTAG, только с другим физическим уровнем. Поддерживается многими адаптерами, в том числе CoLinkEx. А вот CoLink вроде действительно не поддерживает.

  4. а если у меня дискавери и ST-Link не работает? проект из куба отлично работает и пошагово исполняется, а спиленный по статье — нет. дадите толковую статью почитать?

Добавить комментарий

Ваш e-mail не будет опубликован.

Перед отправкой формы:
Human test by Not Captcha