ARM. Учебный Курс. Подключение контроллера и демоплата

Выбор контроллера
Контроллеров на ядре ARM Cortex множество. И мне пришлось поломать голову чтобы выбрать и взять за основу. В народ уверенно идут две линейки это LPC1xxx от NXP и STM32 от ST. Остальные дорогие и/или труднодоставаемые, либо в неадекватных для домашнего применения корпусах. Решил если брать, то из этой серии. Но какую именно? В результате поковырял и те и другие.
 

И вот мои соображения:
 

NXP
Берут низкой ценой. Реально многие из них продаются рублей по 50-80р за микруху. И это в розницу! Может это, конечно, маркетинговая акция и скоро все изменится. Но ситуация такая есть. С другой стороны, у NXP три линейки процов. LPC1000, LPC1300, LPC1700 (про LPC2xxx речь не идет, там ARM7 TDMI ядро).
 

  • LPC1000 закастрированные донельзя (но дешевые). Там от всех вкусняшек ARM ядра только таймер да 32 разряда. Корпуса от 33 до 48 выводов. Есть даже PLCC, но обычно LQFP.
  • LPC1300 уже интересней, но тоже нет ряда полезных фич вроде DMA или быстрого доступа к портам. Корпус от также от 33 до 48 выводов. Самый адекватный LQFP.
  • LPC1700 уже как в лучших домах — есть полный фарш, но камни там с 80ю и более ногами. И куда их такие здоровые?

 

Причем все три линейки весьма сильно отличаются друг от друга. Т.е. код с LPC1300 копипастой хрен перетащишь на LPC1700. Будут отличаться и имена регистров, и способы доступа к периферии. По разному будет выполняться конфигурация портов. В общем, хочешь перелезть на линейку послабже — изучай даташит с нуля. Конечно библиотека CMSIS сильно все сглаживает, но тем не менее от лишнего чтения доков не избавляет. Ну и документация у NXP тот еще аббадон. Давно я такой каши не видел. Бррр…
 

STM
Стоят дороже. Пока самый дешевый STM32F103C8T6 видел за 150р штука. Где найдете дешевле свистните. Но зато у них одна линейка F10x и один даташит на всех. Более того, ходят слухи, что периферия очень похожа и на STM8, так что при случае параллельно раскурим и эти камни :)
 

Процессоры в линейке отличаются только количеством ног и наличием на борту тяжелой периферии вроде USB/Ethernet/CAN. Причем в том же STM32F103C8T6 есть уже и DMA и полноценный BitBanding и все это в корпусе LQFP48 т.е. вполне компактный и паяемый в домашних условиях. Сами камни внутри выглядят более продумаными чтоль. Нет зоопарка периферии на разных линейках. Хорошо расписанные библиотеки CMSIS (о том что это такое расскажу попозже). Т.е. изучил его один раз и можешь уже смело программировать хоть 36 ногих козявок, хоть 100 выводных монстров. Плюс очень многие выводы у STM32F103 имеют 5V Tollerance т.е. их можно смело заводить на пятивольтовую периферию.
 

В общем, мне STM32 понравился больше. Хотя от применения LPC я не отказываюсь, но подробно на них останавливаться не буду, в лучшем случае вскользь упоминать.
 


Отладочные средства
Ковырять ARM процессоры гораздо сложней чем всем уже привычные AVR. Там где у AVR два три параметра конфигурации у ARM обычно полтора два десятка разных крутилок и подстроек, да еще разбросанные по разным регистрам и битам. Это очень круто, можно очень тонко оттюнинговать контроллер точно под свою задачу, но мозг опухает мгновенно. Особенно если до этого с контроллерами дела не имел и нет интуитивного понимания где что искать в даташите. Если многие новички в четырех FUSE битах путаются, то что говорить про тактовый генератор STM32? Кто видел Reference Manual раздел Clock Source поймет о чем я :) .
 

Я тут недавно наступил на грабли в STM32. Пытаюсь диодиком помигать, а оно не мигает. Уже все проверил, порт настроил. Проштудировал раздел портов вдоль и поперек. Все в отладчике вроде бы работает, в симуляции Keil uVision мигает, а в железе ни в какую. Глюк жтага? Но так без него тоже не мигает. Только после вдумчивого раскуривания примеров и чуть ли не побуквенного чтения даташитов увидел маленькую отсылку в совершенно другой раздел — в раздел настройки тактового генератора, где было сказано, что периферия от тактового генератора по дефолту отключена и надо бы ее включить. Включил — заработало. Вот шайтан!

 

В общем, тыкаться там вслепую дохлый номер. Потратишь кучу времени и нервов. Куда проще отлаживать видя, что программа у тебя выполняется, команды проходят, биты ставятся. Чем гадать где у тебя косяк — в железе, софте, настройках, программаторе или везде одновременно. Благо все Cortex контроллеры на борту имеют встроенный отладочный интерфейс. Нужен только адаптер. И тут у нас раздолье.
 

Во первых полно предложений от производителей. Вроде LPC Expreso всяких. Стоят копейки. Та же LPC Expresso продается в районе 800рублей. Есть что то похожее и для STM. Но вот незадача, хитрые производители делают так, что их отладчики можно юзать только с их контроллерами.

Т.е. тот же LPCLink можно подключить только к контроллерам LPC1xxx и работать только из среды CodeRed которая хоть и удобная (т.к. на базе Eclipse), но по функционалу сильно проигрывает Keil uVision.
 

В общем, побаловался я с Экспресской и забросил в дальний ящик. Погуглил и нашел один интересный открытый проект — CoLinkEx. Поддерживает SWD и JTAG режимы. Отлично интегрируется с Keil, а также имеет свою бесплатную среду CoIDE с кучей примеров под разные камни.
 


тык крупнее
 

У CooCox есть и еще ряд интересных примочек. Например подобие операционной системы, а также всякие надстройки и примочки. В общем, есть что поковырять.
 

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

По России почта первого класса носится вполне быстро. От Челябинска до Нижнего Тагила — 3 дня. До Москвы — 6-10 дней.
 
Можно найти и в инете, у китайцев. На том же сайте CooCox.com этот отладчик продается за 30 чтоль баксов. Только ехать будет заметно дольше.
 

Еще есть упрощенный вариант отладчика CoLink работающий только по протоколу JTAG и использующего возможности bitbang микросхемы FTDI. Для его реализации нужна лишь FT2232 и простейшая обвязка из логики и пары транзисторов. Я из этой самой обвязки я и соорудил вот такой вот модуль:
 

 

Просто добавь FTDI! Его можно поставить либо на демоплату Pinboard II:
 

 

Либо на отдельный модуль FTDI который является не чем иным, как выдранным из Pinboard II узлом с FT2232 и парой дополнительных деталек:

 
Получившийся в результате JTAG отладчик прекрасно работает со средой Keil, IAR или CoIDE. Очень надежный и крайне стабильно себя ведет. С хорошим откликом. Один минус — не поддерживает SWD режим, так что какую нибудь LPC1343 им не поотлаживаешь. Тут нужен уже CoLinkEX или что то из той же оперы.
 

Маркировка линейки STM32
Возьмем, к примеру STM32F103C8T6

  • STM32 — эт понятно :)
  • F103 — серия контроллеров на Cortex M3 (есть еще 101,102,105,107)
  • C — число ног (T=36,С=48, R=64, V=100)
  • 8 — размер флеша (8 = 64Kb, B=128Kb)
  • T — тип корпуса (H=BGA, T=LQFP, U=VFQFPN)
  • 6 — температурный диапазон (6 =-40…80, 7=-40…105)

Необходимая документация:

  • STM32F103x8 — Даташит. Там нифига интересного нет. Только распиновка конкретного чипа, да энергопотребление.
  • RM0008 Reference manual — полное описание периферии всей линейки F10x. Без него никуда, вся инфа лежит тут.
  • AN2586 STM32F10xxx hardware development — описание подключения.
  • AN2867 Oscillator design guide — описание подключения кварцевых резонаторов и всякие точные рассчеты соглассующих элементов для идеальной работы в любых условиях.

 

Подключение STM32F103C8T6
Игры с любым микроконтроллером обычно начинаются с подключения. Демоплата удобна для работы и изучения периферии, но нам же в реальные устройства их вкорячивать! Поэтому поглядим на включение.
 

Я под это дело развел небольшую макетную плату. Не могу сказать, что это верх совершенства, но вполне функционально. Потом сделаю что нибудь получше. Это так, на первое время:


Зазырить в полный рост

  • Загоняется питание на все выводы.
  • Все земли сажаем не землю.
  • Сброс подтягиваем к питанию. Сбрасываем прижимом на землю.
  • Выводы Boot1 и Boot0 выводим на джамперы. Ими задается режим работы бутлоадера.
  • Выводы отладки (JTDI/JTDO/JTCK/nREST) сажаем на колодку к JTAG адаптеру. Туда же заводим и nReset.
  • Кварцы я подключал по Hardware Reference через резистор в 100 Ом. Но в даташите указано подключение без резистора. Так что тут решайте сами. Думаю будет работать в обоих случаях. К выводам IN_OSC/OUT_OSC подключается основной квар. К выводам IN_OSC32/OUT_OSC32 часовой кварц на 32768 Гц. Часовой кварц не обязателен, но пригодится для часов реального времени.
  • Вывод VBAT это для батарейного питания. Его можно через диоды развести на батарейку, а можно и просто питание туда подать если батарейка не нужна.
  • Аппаратный USB подключается через резисторы в 33 Ом. Но на практике прокатывает и 68 Ом. Ставил их за неимением других. Никаких проблем, в отличии от капризного V-USB.

 

Проект с отладочной платкой:

Платка вполне делается лазерным утюгом, толщина дорожек 0.2…0.4мм Если вас это не пугает — дерзайте. Там правда есть парочка мелких ошибок. Например, резисторы заехали под кварц, поэтому кварц либо запаивать снизу, либо передвинуть резистор. Мне же пришлось кварц немного вывесить. Впрочем иначе его и не пропаять. Металлизации то у нас нема :) Также рекомендую дорожки от потенциометра перебросить на Bottom. Иначе их неудобно под корпусом потенциометра пропаивать.
 

У меня получилось вот такая вот штуковина.

 

Вот фотка запаяного проца крупным планом. Все вполне паяется и ничего страшного :))))
 

 

Архив с проектом схемы в формате Eagle CAD 5
А также в архиве лежит моя библиотечка с STM32F103C8 где расписана вся периферия, а точками отмечены выводы с поддержкой толерантности к 5 вольтам.
 

▌Pinboard II
Также мной был разработан вот такой вот сменный модуль для демоплаты Pinboard II
 

 
На борту тот же самый STM32F103C8T6, а отлаживается все через поставленную на Pinboard плашку с обвязкой CoLink, только шлейфик накинуть. Cхема модуля похожа на схему самодельной демоплатки, разве что интерфейсы все остались на базовой плате.
 

В следующий раз дам краткий ликбез по ядру и созданию проектов, а также библиотеке CMSIS

145 thoughts on “ARM. Учебный Курс. Подключение контроллера и демоплата”

  1. STM32F103C8 самый дешевый видел у китайсо на ибэй, 115р. штука (продает правда от 10шт.)
    Сам пока буду мучить STM32F103VE. Жду статьи по юзанию библиотек =)

    p.s. 1768 у ЛПЦ вроде вполне рулит. И купить можно за 200р, что при такой периферии весьма даже неплохо. А описалово у них действительно стремное, я в начале своего микроконтроллерного пути от подобного чтива просто офигевал..

    p.p.s. Но до луминэри им конечно всем далеко)) Второй день облизываюсь на этот мк и девборду — http://www.luminarymicro.com/products/dk-lm3s9b96.html

    1. Ну мне на ебай путь заказан. Если я отуда на пару килобаксов камней утащу на меня таможня посмотрит с боооольшой такой улыбкой на светлых и честных лицах.

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

  2. DI HALT а чем тебе контроллеры на ядре ARM7 TDMI-S не нравятся? Только большой ценой?
    Много чего там есть на борту. Меня привлекло что например в LPC214x есть USB. Хотя до АРМ пока руки не доходят, другой проект ковыряю щас. А на счёт диодиком помигать то я полторы недели провозился над контрольной суммой векторов прерываний. Да нервов много уходит тут я согласен.

    1. Ну тут USB трех режимный тоже есть поголовно почти везде. В LPC начиная с 1300 серии, а в STM так по моему с 102 и выше.

      У Кортекса плотность кода выше намного. И на контроллерном применении это сильно рулит. А вот арм7тдми это уже для линухоидов. Но там совсем другие чипы и совсем другие цены.

      1. Почему для линухоидов?
        На работе на 2148 и 2478 проекты, мк эти вполне обычного применения, кортекс посовременнее в плане ядра и всех этих новых фич (битбандинга там вроде не было, были режим ARM и Thumb, заменены Thumb-2).
        Просто из-за приличного объема флэша в них и пихают всякие микро-линухи, и все равно обычно внешнюю память туда всобачивают. Вот АРМ9 уже скорее в сторону для «линухоидов», да и БГА там камни все, если не ошибаюсь.
        А смысла брать их ИМХО нет, они даже дороже выходят. Тем более те же NXP повторяют линейку ARM7 аналогичной линейкой у кортексов (типа аналог 2478 с граф. контроллером на борту).

      2. Я так понял ты их затрагиват не будешь…..
        И опять я как белая ворона неделями буду примитивные весчи делать на арм…

          1. Может как то и перейду на кортексы. Могу кстати поделится в виде статьи (тока статью написать надо ещё) то что я сделал. Плату под LPC214x и под LPC213x (одинаковая у них цоколёвка), расказать как запустить с нуля и как не наступить на те грабли на которые я наступил, могу расказать про PLL и как его настроить ну и светодиодом помигать. Думаю кому-то будет интресно.
            Я так понял мы с товарищем А-10 единомышленники по поводу ARM7TDMI-S.

            1. Я бы с удовольствием почитал статью, на работе есть отладочные платы для ARM7 (2214, 2148, дома еще 2294), все толком с ними не поработать. Хотел запустить Кейл, а он на вин2к (на работе старая убогая машина) не пошел. В IAR мне посложнее со стартапом. ДШ старого образца у ЛПЦ (Филипс точнее) еще хуже, чем новые, там даже схему тактирования им было лень рисовать.
              Имхо обычный стартап (конфигурация, запуск генератора(ов), мигание СД) очень полезен для тех, кто не работал с незнакомыми мк, хотя бы в психологическом плане. Когда сам написал, понял, запустил, и оно работает, дальше идти уже легче. А так наверное многие сруливают, испугавшись сложности.
              Со своей стороны могу кинуть код инициализации генератора для STM32 с разъяснением, если кому нужно.
              Впрочем, Ди наверное это в следующей статье расскажет. Мне интересно как это сделать используя только библиотеки.

          2. ЗЫ а эти ваши STM32 мне тоже нравятся. Прикольные камушки. И периферии много, и пинаут человеческий, и по линейке не сильно много изменений между чипами. Смотрел на LPC для сравнения, так там жесть какая-то. В документации бардак, местами сломал себе мозг. Чипы в NXP делают явно укурившись. Пинауты — дикие. Чипы зачем-то очень разные по выводкам и пинаутам. Набор периферии на большей части чипов выбран идиотски, да еще пины между периферией зачастую как-то по идиотски расшарены.

            1. Вот вот, мне тоже показалось, что NXP делают наркоманы. В этом плане STM32 рвет их всех. Но LPC уж очень дешев. К примеру LPC1343 стоит 75р. в розницу (!) в то время как STM32F103 ниже 150 я не видел.

      3. > А вот арм7тдми это уже для линухоидов.
        Издеваетесь? ARM7TDMI — это предшественник Cortex M3, только слегка более дебильный. Для линуксов не подходит практически. Потому что во первых тормозной, во вторых они часто выпускаются без внешней шины в малолапом корпусе как и эти вот кортексы (см например SAM7 от атмеля), а встроенной памяти для линукса не хватит. В третьих у ARM7 обычно нет MMU, что ставит крест на полноценных операционках с честным разделением на режимы KERNEL и USER, виртуальной памятью и прочая. Как максимум — особо злые извращенцы запускали на ARM7 с вшешней памятью ucLinux, но это жуткий изврат, в частности он не защищает задачи друг от друга, только ядро от задач (используя MPU вместо MMU для этого). Это не линукс а недоносок получается. Вы наверное перепутали ARM7 с ARM9 и Cortex A8 :P. ARM7 наиболее близок к Cortex M3, только с рядом бестолковостей, успешно исправленных в M3.

        1. ARM7TDMI ОЧЕНЬ большое семейство и там есть и внешняя память и сколько девайсов под линухом на них видел не счесть. Да и каждая вторая демоплата с заточкой на линух именно на 7ТДМИ сделана. Да в том же протеусе пример на ARM7TDMI и запускается ucLinux. Конечно полноценный линь там не развернуть, но вот какой нибудь ucLinux с bussybox только в путь.

    1. Во первых можно вкорячить RTOS. ПОлноценную, с вытеснением. Механизм двойного стека и всякие подобия защищенных режимов этому способствуют нехило. Плюс контроллер прерывания.

      Во вторых прорва периферии. Сложно да, но кого пугают трудности? ;)

        1. Для дома для семьи, для всяких термометров и прочей мелкой автоматики нет смысла рыпаться. Там AVR хватит за глаза.

          1. А у аврок очень бесит отсутствие эксепшнов по поводу откровенно аварийных ситуаций типа bad opcode и прочая. Бредовый код — могут как-то выполнить. В какое состояние проц войдет — никому не известно, атмел вроде как умалчивает об этом. ARMы в этом плане сильно культурнее — сразу футболят на обработчик. Для дома, для семьи — попробуйте на аврке сделать вывод на цветной графический LCD, а не ископаемый черно-зеленый хлам в стиле «на дворе 1985 год». Тогда сразу поймете что у AVR есть свои ограничения. И памяти маловато, и ядро тормозное.

            1. ЕМНИП там нет некоорректных опкодов. Все расписано от и до.

              На полноценный цветной LCD не сделате и кортекс м3 скорости не хватит, чтобы гнать данные. ХОтя если ДМА применить может и прокатит. Хотя смотря как она будет работать со внешней памятью, т.к. во внутренней все не распихать. Но дма есть уже в хмегах так что хз хз.

              1. Однако, наткнулся на следующий аппноут:
                http://www.st.com/stonline/products/literature/an/17695.pdf

                The application note describes how to use the STM32F10xx as LCD controller to drive a
                QVGA 3.5″ TFT panel interfaced with the FSMC. The optimization that can be achieved with
                this solution means that only 1% of CPU load is needed to display static images.
                A firmware demonstration has been developed and tested on a CT05350DW0000T QVGA
                3.5″ LCD module with a resolution of 320×240 pixels.

  3. А можно потом будет спецкурс для продвинутых касательно чего-нибудь относительно свежего и мощного, типа атмелевского AT91SAM9XE512 с ядром ARM926? У него все значительно вкуснее в плане внутренностей, особенно радует MMU и прорва интерфейсов.

      1. Был на презентации в Новосибе, там представитель STM целый день рассказывал что все кроме STM говно. Пол дня было посвещано STM8, вторая половина — STM32.
        да собственно вот оно http://www.promelec.ru/company/news/557

        Так вот контроллер для внешней памяти там есть. Отдельно интересовался этим вопросом.
        Забавный момент — обычно грузят код из флеши в оперативную память, чтобы увеличить скорость. Так к примеру в SH2 от RENESAS. Так вот, код загрузить из флеши в оперативку можно, но работает она медленнее чем флешь. На вопрос почему так, было сказано что из флеши читается одновременно большими блоками, а вот на извлечение кода из внешней памяти итераций требуется больше. То есть сама по себе оперативка конечно же быстрее флеши, но читается из неё медленнее. Тем не менее, на мое замечание что тогда смысла в таком перемещении нет, был получен ответ, что таким образом можно снизить потребление (отключить флешь)
        По камням, куча периферии это конечно хорошо, но периферия тоже бывает разная. В основном все рассматривали бегло, остановились на таймерах и обработке прерываний и DMA.
        По DMA особо не помню что да как, таймеры поразили тем, что один таймер можно затактировать фактически от любого события другого таймера. Автоматическая генерация deathtime и т.п.
        Для обработки прерываний, отдельный контроллер. Многоуровневая система. У части событий приоритет железный, у части – настраиваемый.
        Сравнили обработку прерываний в ARM7/9 с STM32. Очень интересно в этом плане сделано. В ARM7 Как положено сохраняет контекст, переходит к обработке, после восстанавливается. Если пришло два прерывания с одним приоритетом, то неизбежны два цикла сохранения контекста ARM7/9
        CortexM3
        PUSH/POP в ARM – 26/16 циклов, CortexM3 – по 12 циклов. Не плохо, не так ли?
        Если во время сохранения контекста, пришло прерывание с более высоким приоритетом, то ARM сохраняет контекст дважды, cortex единожды сохранив контекст, обработает сначала прерывание с более высоким приоритетом, потом с более низким (6 циклов между обработчиками).
        Еще понравилась аварийная система тактирования, и наличие двух сторожевых таймеров.
        Аварийная система – позволяет при аппаратном сбое автоматически перейти на другой источник тактирования, и пусть на меньшей другой частоте, но продолжить работу, перезапустить источник тактирования и т.д. В общем к полному зависанию аппаратный сбой не приведет. Два сторожевых таймера, имеют независимые источники тактирования, за счет чего существенно увеличивается надежность их работы.
        По поводу тактирования, это несколько раз повторял, что каждый модуль нужно включать отдельно. Самый распространенный вопрос, поступающий к их инженерам.

        1. Ну NVIC это часть ядра вроде бы и есть у всех.

          Таймеры да, у стм32 таймеры это что то. ПРавда почему то все 16ти разрядные, что странно.

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

        2. Сразу не заметил = ) Мои художества были приняты за теги.

          Сравнили обработку прерываний в ARM7/9 с STM32. Очень интересно в этом плане сделано. В ARM7 Как положено сохраняет контекст, переходит к обработке, после восстанавливается. Если пришло два прерывания с одним приоритетом, то неизбежны два цикла сохранения контекста (push1) (ISR1) (POP1) (push2) (ISR2) (POP2) ARM7/9
          (push) (ISR1) (6cycles) (ISR2) (POP) CortexM3
          PUSH/POP в ARM – 26/16 циклов, CortexM3 – по 12 циклов.
          и так далее, в общем у кортексов более продуман контроллер прерываний.

    1. Ан нет, похоже умеет. Есть там какой то FSMC контроллер памяти, жрущий все, начиная от PC Card карточек и заканчивая всякими SRAM, NOR Flash и так далее. Надо поразбираться. ВРоде бы оно.

    2. Вот чо глаголить shit

      FSMC main features
      The FSMC block is able to interface with synchronous and asynchronous memories and 16-
      bit PC memory cards. Its main purpose is to:
      ● Translate the AHB transactions into the appropriate external device protocol
      ● Meet the access timing requirements of the external devices
      All external memories share the addresses, data and control signals with the controller.
      Each external device is accessed by means of a unique chip select. The FSMC performs
      only one access at a time to an external device.
      The FSMC has the following main features:
      ● Interfaces with static memory-mapped devices including:
      – Static random access memory (SRAM)
      – Read-only memory (ROM)
      – NOR Flash memory
      – PSRAM (4 memory banks)
      ● Two banks of NAND Flash with ECC hardware that checks up to 8 Kbytes of data
      ● 16-bit PC Card compatible devices
      ● Supports burst mode access to synchronous devices (NOR Flash and PSRAM)
      ● 8- or 16-bit wide databus
      ● Independent chip select control for each memory bank
      ● Independent configuration for each memory bank
      ● Programmable timings to support a wide range of devices, in particular:
      – Programmable wait states (up to 15)
      – Programmable bus turnaround cycles (up to 15)
      – Programmable output enable and write enable delays (up to 15)

      – Independent read and write timings and protocol, so as to support the widest
      variety of memories and timings
      Doc ID 13902 Rev 11 469/1072Flexible static memory controller (FSMC) RM0008
      ● Write enable and byte lane select outputs for use with PSRAM and SRAM devices
      ● Translation of 32-bit wide AHB transactions into consecutive 16-bit or 8-bit accesses to
      external 16-bit or 8-bit devices
      ● A Write FIFO, 2 words long, each word is 32 bits wide, only stores data and not the
      address. Therefore, this FIFO only buffers AHB write burst transactions. This makes it
      possible to write to slow memories and free the AHB quickly for other operations. Only
      one burst at a time is buffered: if a new AHB burst or single transaction occurs while an
      operation is in progress, first the FIFO is drained ( The FSMC will insert wait states until
      the current memory access is complete).
      ● External asynchronous wait control
      The FSMC registers that define the external device type and associated characteristics are
      usually set at boot time and do not change until the next reset or power-up. However, it is
      possible to change the settings at any time.

      1. Причем есть и на Medium-density devices are STM32F101xx and STM32F103xx microcontrollers where the Flash memory density ranges between 32 and 128 Kbytes.

        Т.е. мой F103C8 сюда попадает. Завтра жтагом сунусь и пощупаю есть ли там чо внутри :)

          1. А, вот оно как. Не дочитал. Думал описание это везде где есть, А они это только для справки привели. =)

            Ну тоже неплохо. В F103C8 оно и не надо, а если выбрать более многоногий и толстый кристалл, то там уже будет доступно, при полной совместимости по коду с малыми линейками.

  4. Спасибо!

    А я-то думал, отчего так мало народ ARM пользует, не смотря на улучшенную скорость и богатую периферию — оказывается сложность ограничивает :)

  5. Несколько слов по макету и схеме.
    Паять ТОР-выводы просто, если есть площадка на зеркальном BOTTOM-слое. Надо только, чтобы в отверстие могли поместиться диаметр тоненькой проволоки и диаметр ноги. Тогда, сначала со стороны Bottom протаскиваете проволоку и припаиваете на площадке Top, а после установки компонента на его вывод наматываете «хвост» проволоки и паяете.
    Где-то встречал информацию от знающих, что в линии CAN-TX и CAN-RX надо ставить резисторы 1к и именно выводные типа MFR для помехозащищенности. Может для этих же целей и кварцы рекомендуют через 100 Ом вести? Хотя, конечно, сомнительно наличие выводных компонентов в окружении SMD, но…

    1. Я не уверен что тут именно оно, тк схему не смотрел, но вообще действительно резисторы порядка 100-300 Ом обычно ставят высокопрофи на цифровые выводы, когда рядом чуствительная аналоговая техника.
      Смысл в том, что резистор уменьшает скорость нарастания тока и напряжения и соответственно, дорожка по которой течет этот ток, меньше излучает радиопомех.

      Кроме того, рекомендуют вешать на все выводы 100-200 Ом на макетницах — тогда точно ничего не сгорит, если где-то будет «сопля» и замкнет между собой два мощных вывода, или если вывод закоротит на землю или питание.

      Выводные компоненты лучше во всех отношениях, кроме плотности монтажа и цены..

    2. Хм… а ведь выводные резисторы с цилиндрическим телом могут иметь ощутимую индуктивность, не поэтому ли? Также рискну предположить, что можно выводной резюк заменить на смд-шный, последовательно соединённый с таковым же дросселем или ferrite bead, имеющим индуктивность, сравнимую с паразитной индуктивностью вышеупомянутого MFR (копаться в датаshit’ах на резисторы)… Однако, тут уже тонкое нивелирование несуразностью выводности в смд-шном девайсе и повышенной стоимостью индуктивных компонентов.

  6. DI, у меня пара вопросов по CoLinkEx.
    1. Запихиваю щас схему в схематик, столкнулся с непонятным номиналом резистора в объвязке USB (на твоей схеме это R14, а в оригинальной схеме это R1). Номинал обозначен как «DNP». Что за номинал такой и с чем его едят?
    2. В твоей схеме убраны разъемы J3 и J4 (по оригинальной маркировке). J4 это судя по всему еще один разъем JTAG, а назначение J3 я не совсем вкурил. На сколько критично наличие этих разъемов и не потеряет ли плата части своей функциональности из-за их отсутствия?

    1. Do Not Place — типо не устанавливать.

      Один разьем это для отладки процессора самого Колинка. Второй шел к отладочной плате на LPC1114. Если поглядишь на оригинальный колинк, то он имеет продолжение в виде выполненной на этой же плате минидемоборды. И разделенной скрайбированием и дырочками под штыри. Вот этот дублирующийся разьем я тоже убрал нахрен.

  7. К слову о замороченных настройках переферии. Я думаю, что обязательно должно существовать что-то облегчающее существование, например прога по типу виндовозного мастера, которая бы пошагово спрашивала какие таймеры/УАРТы и прочие прерывания будут использованы, и на выходе отрыгивала кусок кода типа
    // USART initialization
    // Communication Parameters: 8 Data, 1 Stop, No Parity
    // USART Receiver: On
    // USART Transmitter: On
    // USART Mode: Asynchronous
    // USART Baud rate: 9600
    UCSRA=0×00;
    UCSRB=0xD8;
    UCSRC=0×06;
    UBRRH=0×00;
    UBRRL=0×81;
    Кстати, никто не видел чего-либо подобного для АВР?

    1. Для авр есть такие проги. Только настраивать там особо нечего.

      А для ARM, конкретно под Keil есть офигенная система тэгированных комментариев, позволюящая организовать визарды по настройке. И еще я раскопал зверский инит который под STM32 настраивает почти все что угодно.

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

        1. Ну конкретно в AVR параметров немного и в даташите их уточнить дело одного взгляда. Тем более когда знаешь где смотреть. С армом ситуация хуже. Ну и опять же всякие проги они не универсальные. У тех же авр биты по регистрам плавают только так. Лучше всего иметь под рукой индивидуальные заготовки без магических чисел, где интуитивно уже понятно что куда вписывать.

  8. Уважаемый DI HALT, а почему же это Вы упустили из виду ARM-JTAG отладчик WIGGLER? Простой и недорогостоящий вариант.

    1. Древний тормозной архаизм работающий через LPT (которого нет ни на одном из моих компов) и которые не понимает SWD режим?

      1. На самом деле LPT порт есть на подавляющем большинстве современных материнок!!! Только не в виде 25-контактного 2-рядного разъёма DB-25-female (мама), а в виде разъемы IDC на материнской плате. Что бы вывести данный интерфейс наружу, нужно изготовить соответствующий шнурок и возможно провести некоторые манипуляции в BIOS.

        1. Хм, на моем нет. А у жены отмер даже COM порт. Остальные компы ноуты, там такого нет уже лет 10 :)
          Кстати, не слышал о поддержке виглером кортексов. Он с кейлом дружит?

  9. Почитал статейку и возникло несколько вопросов :
    1) Питание на демоплату как я понял берется с USB порта или нет?
    2) Микроконтроллер работает от 3.3 вольт ? а от 5 ти не будет или как ? LPC мироконтроллеры тоже от 3.3 вольт работают ?
    3) LM1117 обязательно надо ставить или можно поставить какойнибудь другой стабилизатор, например L78L33ACU, который дешевле стоит ?
    4) А че не все выводы микроконтроллера вывены ? Например PB5-PB9 не выведенены.

    1. 1) Да, но можно и на штырь 5V повесить. Там все равно.
      2) Да и это его предельное напряжение. От 5 вольт сгорит нафиг. У LPC те же ограничения.
      3) любой способ получить 3.3 вольта. Без разницы.
      4) Да забыл про них. А потом лень было переразводить. Да и некуда их выводить уже.

          1. А если самому всё-таки сделать плату,как первоначально запрограммировать МК LPC1343FBD48,нужен ещё отдельный программатор или непосредственно на этой плате можно как-то?

            1. А там очень забавная штука. Надеваешь джампер, втыкаешь его в усб. Жмешь ресет и эта штука определяется как… обычная флешка на 32 кила. Удаляешь с нее файл старой прошивки, копируешь файл нужной. Жмешь ресет. Снимаешь перемычку, жмешь снова ресет. Готово!

              1. Здорово!
                Сделаю отладчик,если с ARM не подружусь,тогда хоть флешка на 32кб останется)
                А вот там,кроме JTAG, на плате ещё всякие непонятные разъёмы,они вообще очень нужны или можно упростить схему и без них сделать?

                1. Один разьем повторяется дважды. Он для нас самый гланвый. Оставляем одну его копию.

                  Второй нужен для отладки самого отладчика. Не нужен совсем.

        1. Плата в принципе разводится за вечерок с кофе и печеньем, если не очень торопиться. Можно словить геморой с разводкой буферов, но и на оригинальной схеме и на схеме Ди Хальта есть номера ножек, как подсказка. Хотя я на них практически не смотрел, и так все получилось…

  10. К слову о цене и кастратах: STM32F100C4T6B -67рубликов за штуку, иесли брать больше 30ти, то по 43 рубля. (Терраелектроника/Компэл)

  11. Ваяю тут свою версию демоборды для stm, чтоб ставить в свою макетку. Возник вопрос: а 10-пиновый отладочный разъем на АРМах как-то стандартизован? Или каждый производитель лепит свое гнездо как придется? Это я к тому, что вроде прощще втыкать в плату один разъем, а не кучу пинов по отдельности.

    1. Я взял за стандарт следующий вариант:

      GND — NC — GND — GND — 3v3
      NRST-TDI-SWO(TDO)-SWCLK(TCK)-SWIO(TMS)

      Только в 2.54мм исполнении. (в родном используется разьем с миллиметровым шагом, но я такой хер знаю где взять)

      1. Походу буду делать такой же вариант. Тоже в 2.54мм. pld-шки с миллиметровым шагом у нас вроде продают, а вот разъемов на шлейф для них не видел…

  12. http://www.terraelectronica.ru/catalog.php?ID=769&IDm=b&InHave=1&InNew=
    STM32F100C4T6B — 67.74 руб
    STM32F100R4T6B — 77.49 руб
    и это в розницу. Хороший повод перейти на них с АВР»ов)
    осталось только найти программатор «из говна и палок» (очень мне понравилось это выражение!)
    нашел вот такой вариант http://ciclamab.altervista.org/hard_corpo_jtag.htm
    называется очень просто The «Very Poor Man» JTAG…
    прокатит?

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

    1. Можно и так. Или можешь купить FT232 и шить его через бутлоадер по UART, но тогда ты будешь тыкаться как слепой котенок. Тут лучше JTAG/SWD адаптер.

      1. Бутлодер висит на UART1. Можно его подключить напрямую к COM порту, или нужно преобразовать уровни через… MAX232… или как у Громова?

  13. Вопрос не совсем по теме: Посмотрел на фотку CoLinkEX-Clone, мож мне приглючилось, но помойму там отверстия металлизированные,поделитесь как вы это делаете?

  14. DI, у тебя КоЛинкЭкс стм-ку в обоих режимах (ЖТАГ/СВД) цепляет ? Своял себе Колинкэкс. STM32 и LPC1114 видит только по SWD. В принципе мне и свд достаточно (программит и дебужит), но как-то на душе не спокойно — работает да не всё как должно быть. Похоже где-то на платке зихернул. Прозвонил, вроде все звонится как по схемке. Вот сижу репу чешу либо я налутил не так либо микра (стм32рбт6) должна работать только с SWD, хотя у нее ножки для житага имеются.

      1. Значит где-то натупил. Да и ну его (jtag) нафиг, разбираться пока лень да и по свд все работает. Минус один провод — это плюс.

      2. Ди, я так понял, что в STM SWD-режим сначала надо включить?
        если говорю колинку работать по swd — не видит таргета…

        1. Мой колинк или инетовский? Мой без проблем видит и по SWD и по JTAG проверял на своей макетке каждый перед отправкой.

          SWD более капризный почему то. Ему часто не нравится как разведена земля на плате. Он чаще капризничает при плохом контакте шлейфа.

          1. Я свой разводил, на основе твоей схемы и инетовской. Тоесть за основу взял твою, так как детальки из нее в наличии были, но с инетовской сверялся.
            Кстати для чего ты джампер на ресет сделал? Я пробовал и с установленным и со снятым, неполучилось… Буду проверять плату…

          2. Посмотрел на досуге свою плату КоЛинка,нашел пару непропаев на буферной микросхеме. Пропаял, проверил, SWD-режим работает на ура…

  15. У Промэлектроники STM32 довольно дешёвые:
    STM32F101C4T6 (16 кб флеш) за 116 рублей например.
    http://www.promelec.ru/catalog/1/11/1777/0/
    Правда многих дешёвых пунктов нет в наличии. Я задал им вопрос про это — мол, когда ждать. И можно ли под заказ привезти. Ответа еще не получил.

    1. P.S. Только с промэлектроникой вы поосторожней. Меня в предыдущем заказе немножечко кинули на три АТмеги, поэтому впредь буду снимать процесс распаковки посылки на видео.

  16. «Погуглил и нашел один интересный открытый проект — CoLinkEx.» — нажав на ссылку обнаружил на сайте CoOS — операционка для M3 и M0. Подскажите если я раньше не имел опыта с ОС для МК, не будет ли больших подводных камней для моего проекта. Мне нужно написать прогу для считывания бесконтактных карт (AM+FM) на микроконтроллере LPC1114. у которой должен быть интерфейс RS485, 3 светодиода и пьезодинамик. А может есть ОС получше?

      1. Установил среду CoIDE но при создании проекта не нашёл галочки для подключения библиотеки USB. Неужели там нет кнопки добавить USB? Сама IDE сделана на базе Eclipse. Может есть отдельные плагины для Eclipse чтоб не устанавливать всю среду?

        1. А есть ли там вообще библиотека USB? ;)

          Среда != набор библиотек. Вообще в CoIDE при создании проекта подключалось очень много каких примеров. Возможно был и с USB

  17. Я не нахожу в свободной продаже микроконтроллер LPC1343FBD48, используемый в отладчике CoLinkEx. В наличии «LPC1751FBD80.551».

    Возможно ли в отладчике CoLinkEx вместо LPC1343FBD48 использовать другие МК? Какие именно? Главное условие — минимальное вмешательство в схемму и в прошивку.

  18. Ув. DI HALT, а почему сразу кортексы? Почему бы не рассмотреть простенькие железки из серии AT91SAM7S? Это же, как и AVR, целая религия) И они тоже в пределах 200рублей достаются.

  19. Здарвствуйте DI HALT, я один из Ваших поклонников(нас много) из кафедры конструирования ЭВА Киевского Политеха.
    Тут написана замечательная статья, но вопрос возник у меня о программаторе. В списке поодерживаемых устройств очень мало продуктов. Этот список касается возможности программирования или возможности отладки указанных чипов? Есть такая STM32 connectivity line (STM32F107xx) У меня возник вопрос: может ли этот программатор/отладчик программировать эту серию(отлаживать не обязательно)? Просто я не вижу предпосылок для вот такого списка поддерживаемых продуктов, Cortex M3 и в Африке Cortex M3.

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

      1. Мммм… Каким образом? Проект вроде-бы не опенсорс. Скачал прошивальщик, а там нельзя добавить новый чип со своими адресами.

          1. Спасибо за ответы! Я тут еще подумал долго и нудно и после перечитке документации неожиданно для себя открыл существование заводского USB Bootloader’a. Собственно почему бы и нет: дешевле в разы. Ну а с отладкой? Придется протирать штаны подолгу в КБ, ведь туда со своим компом не пускают((

  20. Автору ресурса огромное спасибо. Это очень благородно делится знаниями, тратить столько своего лично времени для того чтобы помочь кому-то разобраться в столь не простом деле, как микроэлектроника. Все статьи что мне довелось читать написаны с душой. Все разложено по полочкам, разжевано, осталось лишь положить в …мозг :)
    Сам занимаюсь микроэлектроникой вяло, но тяга есть, три года назад познакомился с микроконтроллерами «микрочипа». До сих пор кручу эти МК, очень жалею что не довелось мне тогда попасть на этот ресурс и есть некоторое сожаление что подсел на «микрочип», очень хотелось бы начинать с «атмела». Но что есть, то есть.
    В последнее время интересует тема разработка под АРМ, но увы, время, время…как его мало. Все хочется делать своими руками. Все хочется понять. Спасибо за ваши труды.

    1. Да чего жалеть, возьми да сделай свой следующий проект на Атмел, другой на Арм. Разница там между ними небольшая на самом деле. Больше психологическая :)

  21. как припаивать выводные компаненты когда дорожки со стороны компанента? (ну вот как на демоплате линейки pls штырей)

    1. Снимать пластиковую обойму или хотя бы ее поднимать наверх. Запаивать и натягивать обратно.

  22. а также дает плоскую 4Гб адресацию, что дает четыре миллиарда ячеек под что угодно. Так что проблем куда сунуть периферийную конфигурацию не бывает в принципе — места хватит всем. До такой степени, что появляется такой изврат как BitBanding, когда в сегменте памяти размером в мегабайт есть биты связаные с dword’ами в другом сегменте. И для того ,чтобы выставить конкретный бит достаточно записать любой ненулевой dword в соответствующий адрес. 32 мегабайта адресного пространства потратили на руление битами, с другой стороны у нас его 4гигабайта, чего мелочиться :)

    Это было написано в 1й статье по ARM-микроконтроллерам.
    Эмм… Я туда почему-то не могу ответить, поэтому напишу сюда.
    Нет там никаких 4 Гб памяти на самом деле.
    Там 4 Гб адресного пространства — но физически этих ячеек памяти не существует, и если ты обратишься по «несуществующему» адресу — контроллер памяти (memory controller) (см. даташит) выдаст прерывание в связи с нарушением границ обращения к памяти.
    Вот такая вот штука.
    В загрузочной памяти (Boot Memory)- там идет автоопределение объема памяти — ROM, SRAM или Flash — и там верхняя и нижняя граница адреса тоже контролируются, и, если ты выходишь за их пределы — снова возникнет прерывание.

    1. Ну так я и не говорил. что там есть 4гб памяти, я лишь сказал, что у нас 4гб адресное пространство. Это совсем разные вещи.

      1. «миллиарда ячеек под что угодно….»
        «…с другой стороны у нас его 4гигабайта, чего мелочиться…»
        Вот эти две строки косвенно указывают на мой тезис.
        Ну, может очепятался чуток;) Статья хорошая, только вот было бы хорошо, если бы кто-нить простенькую статейку по Eclipse написал — щас с ней разбираюсь потихонечку…

  23. Купил я платку STM32 F103VCT6 With 3.2″ LCD
    http://www.avito.ru/items/sankt-peterburg_kpk_i_kommunikatory_stm32_f103vct6_with_3.2_lcd_34014378
    Тесты крутятся на ура! Но не смог прочитать диск.
    Поискал по сайтам, нашел драйвер под Windows. Установил, загружаюсь. Светодиод на плате замигал, плата определилась. Отвечает в Terminal — «iC 1. Help to main m»
    Не помню точно, нет под рукой устройства. Но суть в том что он не отвечает на команды.
    Посмотрел под Linux. Там термитнал тоже самое отобразил, нет ответной реакции.
    JTAG адаптера у меня нет. Как мне заливать свои программы?
    Смогу я без JTAG программировать контроллер?

      1. Достучатся, это понятно. У меня на плате есть кнопка BOOT.. рядом с RESET
        Мне достаточно будет CooCox CoFlash например?
        Я прочитал, что есть две области памяти ил даже три, если считать ОЗУ куда помещается исполняемая программа. Выставляется комбинацией BOOT0, BOOT1.
        А какой у меня выведен, какое состояние когда кнопка нажата? Прозвонить, что ли…посмотреть по разводке.
        Нужно описание на плату, как бы не убить ее. Или это нереально?

        Я еще заказал JTAG и Диск к этой плате активно ищу.

        Не судите строго, мне после Atmega, который прошивал через LPT программой PonyProg2000 довольно сложно.

        1. CoFlash работает через жтаг. Тебе нужен переходник UART-USB. Подключаешь его к UART1 и шьешься. Вообще на моем сайте есть подробная инструкция как достучаться до бута.

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

              1. Достучаться до загрузчика пока не удалось. НО у меня на плате распаяна микросхема PL-2303HX. Кнопка BOOT0 не понятно как она организована, что она на что комутирует. BOOT1 — заземлил. BOOT0 кнопку — понажимал. Надо искать диск, не перепаивать же на плате все?
                Помимо двух кварцев 32768Hz и 8MHz распаян кварц 12MHz рядом с PL-2303HX.
                Пропроетарщина какая-то..

            1. МАХ232 пятивольтовый. На 3.3 он работает очень нестабильно. А вот если взять MAX3232 то вполне все будет ок.

              1. MAX3232 вы правы.
                На сколько я вижу из вашей схемы, RX/TX USART1 это 31, 30 ножки. Выводы отмечены *. На самом контроллере коментарий — *=5V tolerance.
                Получается, +5 вольт можно на ноги подовать или это только когда они в режиме PA9/PA10 ?

  24. по LPCExpreso: на платке строит 10 пиновый JTAG для поверхностного монтажа, что за типы разъемов для папы и мамы?

    1. Ну разные случаи бывают. Например чтобы два МК работали строго синхронно, такт в такт. Их запускают от одного внешнего генератора.

  25. я вот тут тоже порылся по сети и нашел программер USBProg; на одном и том же железе может работать как JTAG и как AVR-ISP href=»http://produkte.embedded-projects.net/index.php?module=content&action=show&page=usbprog4″ title=»тут»>. Есть даже проект с самодельной платкой . Одна трудность все либо по-немецки либо по английски. но сам проект open cource;

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

  26. Добрый день! Никак не могу определиться с выбором линейки микроконтроллеров ARM (между LPC2xxx от NXP или Cortex M3 STM32xxxx ), может посоветуете что лучше и с чем меньше глюков возникает. ну и конечно проще в освоении!

  27. Есть возможность преобрести STM32L-DISCOVERY (Отладочная плата на базе STM32L152 (Cortex-M3) + программатор/отладчик ST-LINK) эта плат идет с жк дисплеем можно в яндексе глянуть. Я думаю что все статьи для начинающих буд писаться под плату STM32VL-DISCOVERY (Отладочная плата на базе STM32F100 (Cortex-M3) + программатор/отладчик ST-LINK ) . Вот у меня вопрос ни чего я не потеряю при покупке первой платы (вроде сама микруха круче я имею виду другое), смогу лия повторять те же примеры что и в энете для начинающих тупо 1 в 1, для начала. Чтоб хоть с совтом разобраться, с для мк освоить как то так. Или лучше брать ту что без ЖК экрана.

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

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

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