понеділок, 29 лютого 2016 р.

Таймери STM32 -- огляд

Працюючи із далекоміром, ми використовували те, що називають GPIO -- General Purpose Input-Output. В принципі, сяк-так воно задачу вирішує. Однак, повністю займає процесор, і взагалі -- неестетичне. Мікроконтролери, зазвичай, обладнані значно більш зручними засобами для вирішення таких задач -- таймерами та перериваннями. 

Переривання дозволяють програмі не очікувати на якусь подію, постійно перевіряючи щось типу "а що там на піні зараз? а тепер? а тепер?", а отримати нотифікацію про неї -- виклик певного коду у відповідь на появу події. Вони, безперечно, заслуговують окремої розмови (можливо, найближчим часом), але Cortex-M все організовує так, що обробники переривання  -- звичні С-ні функції, що викликаються у відповідь на подію. А ось таймери -- пристрої складні та різноманітні. Тому поговоримо поки про них. 

суботу, 27 лютого 2016 р.

Далекомір HC-SR04 -- GPIO/висновки

Взято тут.
Як було показано в попередніх постах [1, 2, 3, 4, 5], працювати з HC-SR04 просто. Однак, описаний там спосіб -- з використанням GPIO, зовсім вульгарний. Контролери мають значно вишуканіші засоби вимірювати та керувати тривалістю імпульсів, ніж просто неперервно пильнувати за станом "ніжки": переривання, різноманітні потужні та гнучкі таймерів на додачу до SysTick. Про них і напишемо наступного разу. А тут підведемо підсумки GPIO-підходу. 

Результати вимірів у всіх підходів приблизно однакові (хоча метрологічної звірки й не проводив, але це і не було ціллю, про уточнення результатів поговоримо окремо). Акуратні порівняння швидкодії згенерованого різними  способами коду (особливо -- після оптимізації) вимагатиме багато зусиль -- більше, ніж я зараз тому можу приділити, тому, при всій важливості, теж поки не робитиму. 

Розглянемо те, що залишилося. Порівняємо особливості програмування різними способами та відповідні розміри прошивок i RAM. 

Щоб не дублювати весь код, розглянемо дві прості але важливі операції:
  • ініціалізацію піну PB1 на виведення,
  • виведення одиниці, 
 зроблені в рамках різних підходів.

пʼятницю, 26 лютого 2016 р.

Далекомір HC-SR04 -- GPIO/C++

Раз вже цей приклад представлено в стількох варіантах, продемонструю, як C++ може бути корисним під час роботи з контролерами. Людина із ніком fede.tft запропонувала цікавий підхід спрощення роботи з STM32 і подібними пристроями, з використанням шаблонів та інших сучасних фішок С++: "STM32 GPIOs and Template Metaprogramming". Замість або плутаного, або багатослівного, підходів, описаних в попередніх постах, без втрати продуктивності (!), можна робити так:

typedef Gpio<GPIOB_BASE,1>  trig;
trig::mode(Mode::OUTPUT);
trig::high();
trig::low();

typedef Gpio<GPIOB_BASE,2>  echo;
echo::mode(Mode::INPUT);
if( echo::value() )
{
...
}

середу, 24 лютого 2016 р.

Далекомір HC-SR04 -- використовуючи GPIO/HAL/STM32CubeMX

Як вже говорилося, CMSIS -- занадто низькорівнева, SPL від неї не далеко втекла. Після років роздумів та роботи, інженери STMicroelecronics випустили чергову спробу --- пакет STM32Cube. Він складається із двох частин: 
  • Коду для мікроконтролерів: бібліотеки, призначеної замінити SPL -- HAL, (Hardware Abstraction Layer) та всіляких middleware ("проміжних")  компонент -- бібліотеку підтримки FAT, бібліотеку для роботи із USB, TCP/IP  стек, RTOS, тощо.
  • STM32CubeMX -- програми для комп'ютера, яка дозволяє графічно конфігурувати периферію, генеруючи код мовою С, який реалізує "намальоване". 
Після  кількох років дозрівання проект став дуже потужним. Особисті враження: як мало треба для щастя -- лише не виставляти ті сотні бітиків вручну, медитуючи над даташітами і аппнотами (appnotes). 

Подивимося, як із ним працювати, на прикладі нашого простенького коду роботи із далекоміром.

Інсталяція 


вівторок, 23 лютого 2016 р.

Далекомір HC-SR04 -- використовуючи GPIO/CoX

Структура CoX
Мушу зізнатися, написано цю серію постів було ще в 2012-му році. На фоні тодішньої ситуації, бібліотека периферії від CooCox - розробників CoIDE, виглядала перспективною. Зараз я в цьому вже дуже сумніваюся -- вона, на жаль, практично закинута. Однак, викидати тодішній приклад шкода, тому ось.

COX


CooCox, автори CoIDE, розробили також свою бібліотеку роботи із периферією, аналог SPL -- COX. Її перевага -- вона платформонезалежна (кросплатформова), працює і з контролерами ARM Cortex від інших виробників -- підтримуються пристрої від Nuvoton, NXP, ST, TI, Holtek, FreeScale, тоді як код із попередніх постів ([1], [2]), працюватиме лише на STM32 від STMicroelectronics.

Апаратна конфігурація та ж, що й в інших GPIO-прикладах:
  • PB1 -- Trig
  • PB2 -- Echo
  • PC8 -- синій світлодіод
  • PC9 -- зелений світлодіод

понеділок, 22 лютого 2016 р.

Далекомір HC-SR04 -- використовуючи GPIO/SPL

Ієрархія засобів програмування, орієнтована на SPL.
Клікабельно. (c) STMicroelectronics
CMSIS, про яку йшла мова минулого разу, штука потужна, але дуже вже низькорівнева. (Кожен раз себе так відчуваю, ніби попав у кабіну авіалайнера -- ті сотні бітиків, які треба правильно сконфігурувати, інакше нічого не працюватиме.) В STMicroelectronics теж розуміли, що користуватися нею, в більшості випадків, не дуже зручно. Першою спробою надати більш високий рівень абстракції для роботи із їхніми мікроконтролерами, була SPL -- Standard Peripherals Library. (Нагадую, основа CMSIS універсальна, від розробника ядра ARM Cortex-M, ARM Inc., виробники конкретних мікроконтролерів її хіба розширяють, а ось SPL -- специфічна для STM32). 
Зауваження -- не плутайте SPL із STL з С++ -- стандартною бібліотекою шаблонів. ;-)
Повторимо те ж, що і в попередньому пості, засобами  Standard Peripherals Library, SPL. Апаратна конфігурація та ж:
  • PB1 -- Trig
  • PB2 -- Echo
  • PC8 -- синій світлодіод
  • PC9 -- зелений світлодіод

неділю, 21 лютого 2016 р.

Далекомір HC-SR04 -- використовуючи GPIO/CMSIS

Структура GPIO-піна, з
офіційної документації.
Клікабельно.
В попередньому пості було описано цікавий пристрій -- ультразвуковий далекомір, HC-SR04. Він може служити хорошим демонстраційним прикладом для багатьох технік роботи із мікроконтролерами. 

Подальші пости використовуватимуть плату STM32VLDiscovery із її мікроконтролером  STM32F100RB, архітектури ARM Cortex M3, котрий має 128Кб пам'яті програм та 8Кб RAM. Для інших споріднених мікроконтролерів відмінності будуть мінімальними. 

Спершу розглянемо найбільш базову (але, відповідно, і найбільш низькорівневу) методику -- із використанням CMSIS. Також, буде використано найбільш примітивну техніку роботи із пристроєм -- безпосереднє смикання ніжок мікроконтролера та читання рівнів на них (іншими словами, самим GPIO, без використання переривань).

CMSIS -- GPIO


суботу, 20 лютого 2016 р.

Далекомір HC-SR04 -- огляд

Купив я колись, багато років тому, собі таку штуку, як на фото -- ультразвуковий далекомір-"ехолокатор", HC-SR04. (Взагалі, перша моя покупка на e-bay. Купляв по 2.5 бкс, зараз менше 2. Та й продавець той, "Чіп партнер", як показала практика,  цілком приємний).

Пристрій простий, як двері. Datasheet -- аж дві сторінки крупним шрифтом із малюнками.