stm32: настраиваем IAR и мигаем светодиодом.
Оказывается, настройка IAR’а для stm32 – не совсем простое дело. В этом посте, мы с Ташкой покажем вам, как это делается и, под конец, помигаем светодиодом.
Само видео:
Внимание! В Lifelover подсказал, что, в настройках линкера от верхних границ памяти нужно отнимать 1, те, верхняя граница флэша должна быть 0x0801ffff а не 0x08020000. Готовый проект в шоунотах исправлен.
Апдейт: Проект еще раз исправлен. Ребята из IAR’а назвали функции из intrinsics.h теми-же именами, что используются в CMSIS, поэтому CMSIS конфликтует с иаром новых версий. Решение довольно тупое – закомментировать конфликтующие функции в файлах CMSIS’а и использовать функции от иара. Новый проект:
Даша МОЛОДЕЦ!!!!!!!!!!!!!!!!! Даёшь дорогу женскому эмбедду!!!!!!!!!!!)))))))
Да не Даша, а Таша!
Блин, прошу прощения. Просто Таша оч редкое имя, я выбрал то что распостранённей)))). Исправь пожалуйста))))
Конец = начало + размер — 1. Программисты.))
Блин, а ты прав! Несмотря на аппноут от СТМ:
https://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/USER_MANUAL/CD00283778.pdf
Там такие-же цифры, как и у меня. Но я только что попробовал в реальности. При записи в адрес 0x20002000 вылетает HardFaultException. Сейчас исправлю статью.
Таша, тут trouble… Надписи невидно, можно хоть как-то прокомментировать то, что пишется методом copy-paste?
Crafter76, никакого trouble. Переключи качество в 720p.
Опана , можно холливар разводить из серии «Девушка vs электроника» .) Я сначала подумал что она и вправду программист. Но очень скоро разочаровался … Переломным моментом стала фраза «У нас получается вот столько» (да да тот момент с калькулятором) Выходит сказать сто тридцать одна тысяча семьдесят два проблема. Ну а потом понятно что всё по листочку заранее написанным Автором блога.
Ну а вошьем девчонка молодец !) Мне кажется её милый голос очень в тему с архитектурой STM32))
Между прочим, в первой версии (которую озвучивал я) я так и сказал «вот столько». Смысл читать число с тучей знаков?
Ну как бы странно чуток. Или меня лицей избаловал?
Вот ты посчитал на калькуляторе число, к примеру, 152/63. Ты будешь читать полученный результат с точностью до 8-ого знака, или просто скажешь — вот это, и покажешь калькулятор?
BSVi , тебя мы более слышать не хотим )
Что-то все разом подсели на STM. Хоть бы кто-то рискнул написать тоже самое для LPC17xx.
ээхх ((
для LPC я бы с удовольствием написал, он мне нравится в 1000 раз больше, но его хер купишь у нас в киеве в розницу (
Купил себе LPC1343FBD48 — 1 шт. вот здесь http://www.amel.com.ua всего за 26 грн., и это даже не смотря на то, что через ихний поиск ничего не находиться)))
Ухты, если это действительно так, то это — оччень круто! Жаль, только они не очень аффишируются. Да и имрад, как самый попсовый поставщик не возит (
https://imrad.com.ua/search.shtml?qs=lpc176&query=any
Ну и нафига мне в моих поделках самый жирный кортекс? вот LPC1343 — был бы в самый раз для большинста поделок.
«Криворукие индусы» из уст девушки звучало отпадно.=)
))))
Э , у тебя Иар какого релиза? 0_О .
Раньше для STM32 я юзал STM32 ST-Link Utility и Sourcery G++ Lite . И даже не догадывался о том что с Иар можно работать с ARM :/
Как это не догадывался ? Иарт тем и славен, что работает со всем подряд. У меня иар 6.1.0 for ARM
эээ…это я такой тупой, или в чем тут дело…не пойму зачем вычислять верхнюю границу флэша (0x0801ffff)…она же прям в даташите и написана…ну прям на ролике видно…??!!))
Она написана для всего семейства. Для конкретного контроллера нужно вычислять.
ааа))) ясн)
Спасибо Сергей! Так держать! Очень нужны подобные видеоуроки для начинающих АРМоводов. Очень хотелось бы продолжения рубрики по STM32. Думаю Ваши материалы послужат хорошим толчком для всех тех кто имеет желание, но не знает с чего начать.
Успехов в этом малость неблагодарном но очень нужном деле!
если бы еще в картинках всё это было.
не могу с видео информацию воспринемать
Дык, всем не угодишь.
да понятно. Радует, что хоть такое есть! Спасибо! 🙂
А какой смысл делать в задержке volatile? Понимаю еще в прерываниях, где действительно компилятор может удружить и «оптимизировать», а тут…
А тут компилятор может выбросить весь for, потому, что внутри ничего не происходит.
Это Вы сами так посчитали или у ИАРа это где-то описано? Если второе то спасибо за информацию и я не зря выбрал Кеил, если первое — рекомендую книги по теории компиляторов.
Сам так посчитал. У иара это нигде не написано.
В IAR пишет, что проблема с FlashSTM32F100xB.flash… Как поправить, чтобы загрузилось?
У меня все работает (в видео это видно), поэтому ниего сказать не могу. Проверь, что путь у этому файлу указан точно.
Сначала думал, что косячу в проекте… Увы, даже родной не пашет…
Потом думал косяк с платой… Попробывал загрузить stm8l discovery — та же проблема: st-link не отвечает…
Походу провод где-то сдох… Вроде питание есть, а какой-то из D-, либо D+ пробит: St-link ответил, а загрузить не смог…
Неа… Все равно не помогает…
Пишет
Sun Apr 10 21:28:39 2011: Loaded macro file: C:\Program Files\IAR Systems\Embedded Workbench 5.5\arm\config\flashloader\ST\FlashSTM32F10xxx.mac
Sun Apr 10 21:28:39 2011: Failed to load flash loader: C:\Program Files\IAR Systems\Embedded Workbench 5.5\arm\config\flashloader\ST\FlashSTM32F100xB.out
Sun Apr 10 21:28:39 2011: Failed to load flash loader: C:\Program Files\IAR Systems\Embedded Workbench 5.5\arm\config\flashloader\ST\FlashSTM32F100xB.flash
Помогайте… Я горю…
А повопробуй-ка поставить последний иар. У меня с 5.5 что-то похожее было.
У меня такое было когда STLink не отвечал, проверте если в STLinkUtility все норм тогда проблема с ИАР, но я думаю что не норм, проверяйте кабель/плату. Мне помогла промывка ацетоном STM32VLDiscovery 🙂
Столкнулся с такой-же проблемой, плясал с бубном около часа, пока не прочитал комментарии.
При попытке прошивки из IAR 6.21.1 у меня писало:
Failed to load flash loader: D:\IarProjects\Touch_sensing\FlashSTM32L15xxxRAM16K.out
Failed to load flash loader: D:\IarProjects\Touch_sensing\FlashSTM32L15xxB.flash
Хотя светодиод питания на плате светился.
Мне помогло передергивание кабеля 3 раза. Аж странно, похоже пыль в разем попала. Промывка ацетоном была бы эффективнее, но его нет.
BSVi расскажи пожалуйста если можешь и нетрудно про USART и DMA и как это все заставить работать вместе. А у меня кстати плата EMBEST EM-STM32С с сенсорным экранчиком:). https://canada.newark.com/embest/em-stm32c/development-tool/dp/64R5913. Вообщем задумка такая: есть видеомодуль, с него идет все по трех проводному RS-485 (не спрашивай почему не Ethernet) через STM32F107VC попадает на радиомодуль и обратно, т.е. будет из одного предположим USART1 через DMA попадает на USART2 и тудаи сюда. Как тебе? Еще такой вопрос вот в 107 и 105 есть DR (дата регистр) в него сдвиговый регистр пишет и прием и передачу? т.е. он о дин DR а уже из него можно писать в память или в uC? И еще вопрос, не знаешь как среда Green Hills? Кстати Таша очень впечатляющая девушка;) DIHALT нервно курит:)
>DR (дата регистр) в него сдвиговый регистр пишет и прием и передачу?
С уартом я не разбирался, но думаю, что нет. Если это и один регистр, то на чтение и запись он замаплен на разные адресса.
>не знаешь как среда Green Hills?
Не знаю.
BSVi , ролик просто улёт.
Классная идея ))
Под IAR 6.2 не проходит компиляция, выдает следующее:
Error[Pe337]: linkage specification is incompatible with previous «__WFI»……
и т.д.
Откатил IAR до версии 5.5, ошибки исчезли, все компилится, но грузиться не хочет,
пишет тоже что и у Crafter76 — Failed to load flash loader.
В тоже время под Atollic все работает нормально компилит, debug-ит.
Может ли кто-нибудь подсказать по данному вопросу, хотелось бы работать под IAR?
Вроде как ошибка с flash loader это известный баг версии 5.5 и лечится патчем
https://dl.dropbox.com/u/13417678/patch.rar
но все таки вопрос почему IAR 6.2 отказывается компилить простую программу мигалки? Есть ли у кого какие мысли?
Судя по linkage specification is incompatible with previous «__WFI» ты выбрал неправильный процессор. Посмотри видушник еще раз и сделай все по шагам один в один.
на IAR 6.2 такая же беда даже c готовым (вашим) проектом.
При этом в 6.1 всё работает. Надо бы сравнить что там (в IAR) нового понаделали…
https://supp.iar.com/Support/?note=75890
Спасибо!
Когда следующий выпуск? Он, конечно, о прерываниях?
Ташка и Серега, спасибо большое за ролик! Очень помог
при написании первой программы для моей платы на основе
STM32F107.
IAR 6.2 немного поругался на ошибки, в связи с тем, что
некоторые функции из CMSIS теперь обьявленны в библиотеках
самого IAR’а. Немного подправил CMSIS и все заработало.
Ролик все еще играет хотя прошло уже уйма времени:). Кто пишет с библиотеками ,скажите плиз, как понять тот факт что если при частоте SYSCLK 72 МГц на ADC1 c помощью функции RCC_ADCCLKConfig() можно задавать прескалер, но если убрать эту функцию ничего не меняется т.е шарашет 72 МГц O_o на ADC1 хотя разрешено 14 max?:)
Вопрос по теме:
GPIOC->BSRR = GPIO_BSRR_BS8; — выход в 1
в чём принципиальная разница между следующими строками?
GPIOC->BRR = GPIO_BRR_BR8; — выход в 0
GPIOC->BSRR = GPIO_BSRR_BR8; — выход в 0
Да ни в чем, просто разные регистры. Иногда бывают случаи когда нужно одновременно и единички на ножки записать и нули, тогда BSRR предпочтительней. А для простого сброса — они равноценны.
Терпеть не могу, когда проблему обсуждают, потом сами ответ находят и не выкладывают.
Рассказываю про свою борьбу:
1. Проблемы с компиляцией.
Что-то типа «linkage specification is incompatible with previous «__WFI»» (не помню точно, потому что ошибку уже не бьет).
Мое решение: посмотрите на свою версию файла stm32f10x.h (в шапке). Вообще, если у Вас версия 6.2, там уже все библиотечки CMSIS есть, просто ИАР не помнит, куда он их кладет. Поэтому найдите их сами в установочной папке ИАРа и пропишите пути в препроцессоре.
2. Проблемы с прошивкой.
Било мне ошибку — не найден dll и
Failed to load flash loader: D:\IarProjects\Touch_sensing\FlashSTM32L15xxxRAM16K.out
Failed to load flash loader: D:\IarProjects\Touch_sensing\FlashSTM32L15xxB.flash
Опять же все безболезненно решается. Ищем в ИАРе папку с драйверами, а в ней ST-Link и ставим драйвер.
Наслаждайтесь)
Я имела в виду версию ИАРа 6.2. Версия файла у меня 3.1.2.
Ого, сам имрад 🙂
По первому пунтку — я просто покоцал все объявления которые совпадают в иаре и в цмсисовской библиотеке. Это нужно, чтобы добавить библиотеку в проект и быстро ее открывать 🙂
Собственно, новый прожект уже лежит в статье.
У меня при открытии ранее работавших проектов выдает ошибку:
» Project contains unknown tool ‘RDIJTAGJET_ID’ »
Раньше всё работало нормально, версия 6.21, уже пере устанавливал.
Подскажите как определить семейство контроллера у меня плата STM32f207VGT6
Я просмотрел аналогичную библиотеку stm32f2xx.h
От туда ничего не подошло
Помогите пожалуйста
Спасибо за видео уроки! Все наглядно и понятно. Сейчас осваиваю ARM-ы и ваше наглядное пособие просто клад для быстрого старта. Жду с нетерпением следующего(надеюсь будет))).
Было бы здорово, если бы вы сделали обзор как работать с библиотеками(с исходным кодом и без него). Как подключать и что настраивать. Куда нужно смотреть чтобы понять как работают функции. Структуры хедеров…
1)Для IAR новых версий, если идет конфликт CMSIS — необходимо просто переименовать файл core_cm3.h (он будет пропущен) и в опциях проекта поставить галочку «Use CMSIS» (CMSIS будет использоваться встроенная в IAR).
2) В Вашем проекте не активировано тактирование от кварца. Работа идет от встроенного RC генератора на 8МГц. (Keil — это делает атоматом + там Wisard очень удобный для начинающих, на время разбирательств с регистрами).
В целом Маладец!
Ждем дальнейших видео-уроков. Главное жуйте поглубже ибо зачастую в сети только поверхностно рассказывают.
Да, тоже заметил пару особенностей:
При настройке Release может выдавать ошибку Pe[1696]-не найден файл core_cm3.h
Для того, чтобы заработало в настройках проекта не забыть поставить галочку General Options->Library Conf->UseCMSIS & DSP Library
И еще: если хотите сменить в настройках частоту кварца по умолчанию , надо переопределить define в опциях проекта:
Options-> C++ -> Preprocessor Symbols -> Defined symbols:
HSE_VALUE=10000000 /* Например — 10 MHz */
И чтоб запустить работу от кварца, достаточно в начале программы прописать функцию SystemInit();
/*Пример*/
int main (void)
{
SystemInit();
// Ваш код
}
Эта функция уже прописана в CMSIS в файле system_stm32f10x.c Она сама выставит нужные регистры так что при старте инициализирует кварц, если кварц вытащить во время работы, само перейдет на внутренний генератор (в три раза упадет производительность) подключить назад, снова запустит работу на кварце*3 с частотой ядра 24 мгц.
В описании на функцию SystemInit() написано:
This function is called at startup just after reset and
before branch to main program. This call is made inside
the «startup_stm32f10x_xx.s» file.
Т.е. сама функция SystemInit() вызывается ДО основной программы, поэтому какой смысл вставлять ее снова в main?
Да, она вызывается до cstartup.
Бесполезное видео. И проект к нему приложен бесполезный. Там же нет этого гребаного стартап-файла, без которого нет смысла дальше что-то делать
И если дальше к этому скелетному проекту прикручивать что-нибудь еще, например, ПРЕРЫВАНИЯ, то иар в них заходить не будет.
Уважаемый. Данный сюжет показывает только первоначальное знакомство с данным микроконтроллером, на примере «hello world» только со светодиодом. Что говорит о простоте работы с регистрами и не так уж оно и невероятно сложно и не реально. А вот при углублении в его закрома сможете писать код на своё усмотрение и требуемые задачи.
Вам прям вот так и сразу нужно IOS показать, чтоб вы плюнули на это дело как на тяжело постижимое..